all: regenerate all APIs

serviceuser:v1 is excluded from this commit due to a generation
failure.

Change-Id: Ia8269d69582e69c9246f5300a67cfa5ec2bc56ca
Reviewed-on: https://code-review.googlesource.com/10870
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/acceleratedmobilepageurl/v1/acceleratedmobilepageurl-api.json b/acceleratedmobilepageurl/v1/acceleratedmobilepageurl-api.json
index 1605141..7ecce10 100644
--- a/acceleratedmobilepageurl/v1/acceleratedmobilepageurl-api.json
+++ b/acceleratedmobilepageurl/v1/acceleratedmobilepageurl-api.json
@@ -1,67 +1,51 @@
 {
-  "id": "acceleratedmobilepageurl:v1",
-  "description": "This API contains a single method, batchGet. Call this method to retrieve the AMP URL (and equivalent AMP Cache URL) for given public URL(s).\n",
-  "protocol": "rest",
-  "title": "Accelerated Mobile Pages (AMP) URL API",
-  "resources": {
-    "ampUrls": {
-      "methods": {
-        "batchGet": {
-          "id": "acceleratedmobilepageurl.ampUrls.batchGet",
-          "response": {
-            "$ref": "BatchGetAmpUrlsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Returns AMP URL(s) and equivalent\n[AMP Cache URL(s)](/amp/cache/overview#amp-cache-url-format).",
-          "request": {
-            "$ref": "BatchGetAmpUrlsRequest"
-          },
-          "flatPath": "v1/ampUrls:batchGet",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/ampUrls:batchGet"
-        }
-      }
-    }
-  },
   "schemas": {
+    "BatchGetAmpUrlsResponse": {
+      "description": "Batch AMP URL response.",
+      "type": "object",
+      "properties": {
+        "ampUrls": {
+          "description": "For each URL in BatchAmpUrlsRequest, the URL response. The response might\nnot be in the same order as URLs in the batch request.\nIf BatchAmpUrlsRequest contains duplicate URLs, AmpUrl is generated\nonly once.",
+          "type": "array",
+          "items": {
+            "$ref": "AmpUrl"
+          }
+        },
+        "urlErrors": {
+          "type": "array",
+          "items": {
+            "$ref": "AmpUrlError"
+          },
+          "description": "The errors for requested URLs that have no AMP URL."
+        }
+      },
+      "id": "BatchGetAmpUrlsResponse"
+    },
     "AmpUrl": {
       "description": "AMP URL response for a requested URL.",
       "type": "object",
       "properties": {
-        "ampUrl": {
-          "description": "The AMP URL pointing to the publisher's web server.",
+        "cdnAmpUrl": {
+          "description": "The [AMP Cache URL](/amp/cache/overview#amp-cache-url-format) pointing to\nthe cached document in the Google AMP Cache.",
           "type": "string"
         },
         "originalUrl": {
           "description": "The original non-AMP URL.",
           "type": "string"
         },
-        "cdnAmpUrl": {
-          "description": "The [AMP Cache URL](/amp/cache/overview#amp-cache-url-format) pointing to\nthe cached document in the Google AMP Cache.",
+        "ampUrl": {
+          "description": "The AMP URL pointing to the publisher's web server.",
           "type": "string"
         }
       },
       "id": "AmpUrl"
     },
     "AmpUrlError": {
+      "id": "AmpUrlError",
       "description": "AMP URL Error resource for a requested URL that couldn't be found.",
       "type": "object",
       "properties": {
-        "originalUrl": {
-          "description": "The original non-AMP URL.",
-          "type": "string"
-        },
         "errorCode": {
-          "description": "The error code of an API call.",
-          "enum": [
-            "ERROR_CODE_UNSPECIFIED",
-            "INPUT_URL_NOT_FOUND",
-            "NO_AMP_URL",
-            "APPLICATION_ERROR",
-            "URL_IS_VALID_AMP",
-            "URL_IS_INVALID_AMP"
-          ],
           "enumDescriptions": [
             "Not specified error.",
             "Indicates the requested URL is not found in the index, possibly because\nit's unable to be found, not able to be accessed by Googlebot, or some\nother error.",
@@ -70,30 +54,40 @@
             "DEPRECATED: Indicates the requested URL is a valid AMP URL.  This is a\nnon-error state, should not be relied upon as a sign of success or\nfailure.  It will be removed in future versions of the API.",
             "Indicates that an AMP URL has been found that corresponds to the request\nURL, but it is not valid AMP HTML."
           ],
+          "enum": [
+            "ERROR_CODE_UNSPECIFIED",
+            "INPUT_URL_NOT_FOUND",
+            "NO_AMP_URL",
+            "APPLICATION_ERROR",
+            "URL_IS_VALID_AMP",
+            "URL_IS_INVALID_AMP"
+          ],
+          "description": "The error code of an API call.",
+          "type": "string"
+        },
+        "originalUrl": {
+          "description": "The original non-AMP URL.",
           "type": "string"
         },
         "errorMessage": {
           "description": "An optional descriptive error message.",
           "type": "string"
         }
-      },
-      "id": "AmpUrlError"
+      }
     },
     "BatchGetAmpUrlsRequest": {
-      "description": "AMP URL request for a batch of URLs.",
-      "type": "object",
       "properties": {
         "lookupStrategy": {
           "description": "The lookup_strategy being requested.",
-          "enum": [
-            "FETCH_LIVE_DOC",
-            "IN_INDEX_DOC"
-          ],
+          "type": "string",
           "enumDescriptions": [
             "FETCH_LIVE_DOC strategy involves live document fetch of URLs not found in\nthe index. Any request URL not found in the index is crawled in realtime\nto validate if there is a corresponding AMP URL. This strategy has higher\ncoverage but with extra latency introduced by realtime crawling. This is\nthe default strategy. Applications using this strategy should set higher\nHTTP timeouts of the API calls.",
             "IN_INDEX_DOC strategy skips fetching live documents of URL(s) not found\nin index. For applications which need low latency use of IN_INDEX_DOC\nstrategy is recommended."
           ],
-          "type": "string"
+          "enum": [
+            "FETCH_LIVE_DOC",
+            "IN_INDEX_DOC"
+          ]
         },
         "urls": {
           "description": "List of URLs to look up for the paired AMP URLs.\nThe URLs are case-sensitive. Up to 50 URLs per lookup\n(see [Usage Limits](/amp/cache/reference/limits)).",
@@ -103,57 +97,109 @@
           }
         }
       },
-      "id": "BatchGetAmpUrlsRequest"
-    },
-    "BatchGetAmpUrlsResponse": {
-      "description": "Batch AMP URL response.",
-      "type": "object",
-      "properties": {
-        "urlErrors": {
-          "description": "The errors for requested URLs that have no AMP URL.",
-          "type": "array",
-          "items": {
-            "$ref": "AmpUrlError"
-          }
-        },
-        "ampUrls": {
-          "description": "For each URL in BatchAmpUrlsRequest, the URL response. The response might\nnot be in the same order as URLs in the batch request.\nIf BatchAmpUrlsRequest contains duplicate URLs, AmpUrl is generated\nonly once.",
-          "type": "array",
-          "items": {
-            "$ref": "AmpUrl"
-          }
-        }
-      },
-      "id": "BatchGetAmpUrlsResponse"
+      "id": "BatchGetAmpUrlsRequest",
+      "description": "AMP URL request for a batch of URLs.",
+      "type": "object"
     }
   },
-  "revision": "20160928",
-  "basePath": "",
+  "protocol": "rest",
   "icons": {
     "x32": "http://www.google.com/images/icons/product/search-32.gif",
     "x16": "http://www.google.com/images/icons/product/search-16.gif"
   },
-  "version_module": "True",
-  "discoveryVersion": "v1",
+  "version": "v1",
   "baseUrl": "https://acceleratedmobilepageurl.googleapis.com/",
+  "kind": "discovery#restDescription",
+  "description": "This API contains a single method, batchGet. Call this method to retrieve the AMP URL (and equivalent AMP Cache URL) for given public URL(s).\n",
+  "servicePath": "",
+  "rootUrl": "https://acceleratedmobilepageurl.googleapis.com/",
+  "basePath": "",
+  "ownerDomain": "google.com",
   "name": "acceleratedmobilepageurl",
+  "batchPath": "batch",
+  "documentationLink": "https://developers.google.com/amp/cache/",
+  "id": "acceleratedmobilepageurl:v1",
+  "revision": "20170126",
+  "title": "Accelerated Mobile Pages (AMP) URL API",
+  "discoveryVersion": "v1",
+  "ownerName": "Google",
+  "version_module": "True",
+  "resources": {
+    "ampUrls": {
+      "methods": {
+        "batchGet": {
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "BatchGetAmpUrlsResponse"
+          },
+          "parameters": {},
+          "flatPath": "v1/ampUrls:batchGet",
+          "id": "acceleratedmobilepageurl.ampUrls.batchGet",
+          "path": "v1/ampUrls:batchGet",
+          "request": {
+            "$ref": "BatchGetAmpUrlsRequest"
+          },
+          "description": "Returns AMP URL(s) and equivalent\n[AMP Cache URL(s)](/amp/cache/overview#amp-cache-url-format)."
+        }
+      }
+    }
+  },
   "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "callback": {
+      "description": "JSONP",
       "type": "string",
       "location": "query"
     },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "alt": {
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string"
     },
     "key": {
       "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
       "type": "string",
       "location": "query"
     },
+    "access_token": {
+      "type": "string",
+      "location": "query",
+      "description": "OAuth access token."
+    },
     "quotaUser": {
       "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
       "type": "string",
@@ -161,76 +207,30 @@
     },
     "pp": {
       "description": "Pretty-print response.",
-      "default": "true",
       "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
+      "default": "true",
       "location": "query"
     },
     "bearer_token": {
+      "location": "query",
       "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
+      "type": "string"
+    },
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
     },
     "upload_protocol": {
       "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
       "type": "string",
       "location": "query"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
     }
-  },
-  "documentationLink": "https://developers.google.com/amp/cache/",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
-  "servicePath": "",
-  "ownerName": "Google",
-  "version": "v1",
-  "rootUrl": "https://acceleratedmobilepageurl.googleapis.com/",
-  "kind": "discovery#restDescription"
+  }
 }
diff --git a/acceleratedmobilepageurl/v1/acceleratedmobilepageurl-gen.go b/acceleratedmobilepageurl/v1/acceleratedmobilepageurl-gen.go
index 9c8d364..3a18935c 100644
--- a/acceleratedmobilepageurl/v1/acceleratedmobilepageurl-gen.go
+++ b/acceleratedmobilepageurl/v1/acceleratedmobilepageurl-gen.go
@@ -55,9 +55,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	AmpUrls *AmpUrlsService
 }
@@ -69,6 +70,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAmpUrlsService(s *Service) *AmpUrlsService {
 	rs := &AmpUrlsService{s: s}
 	return rs
@@ -312,6 +317,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.batchgetampurlsrequest)
 	if err != nil {
diff --git a/adexchangebuyer/v1.2/adexchangebuyer-gen.go b/adexchangebuyer/v1.2/adexchangebuyer-gen.go
index 104292d..05d2b1e 100644
--- a/adexchangebuyer/v1.2/adexchangebuyer-gen.go
+++ b/adexchangebuyer/v1.2/adexchangebuyer-gen.go
@@ -62,9 +62,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	return rs
@@ -583,6 +588,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -719,6 +725,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -834,6 +841,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -968,6 +976,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -1114,6 +1123,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1249,6 +1259,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creative)
 	if err != nil {
@@ -1405,6 +1416,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/adexchangebuyer/v1.3/adexchangebuyer-gen.go b/adexchangebuyer/v1.3/adexchangebuyer-gen.go
index 3c2ef1e..b635094 100644
--- a/adexchangebuyer/v1.3/adexchangebuyer-gen.go
+++ b/adexchangebuyer/v1.3/adexchangebuyer-gen.go
@@ -67,9 +67,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 
@@ -93,6 +94,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	return rs
@@ -1519,6 +1524,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1655,6 +1661,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1770,6 +1777,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -1904,6 +1912,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -2048,6 +2057,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2185,6 +2195,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2311,6 +2322,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2453,6 +2465,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.budget)
 	if err != nil {
@@ -2600,6 +2613,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.budget)
 	if err != nil {
@@ -2755,6 +2769,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2890,6 +2905,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creative)
 	if err != nil {
@@ -3065,6 +3081,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3252,6 +3269,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3388,6 +3406,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3529,6 +3548,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3682,6 +3702,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "pretargetingconfigs/{accountId}/{configId}")
@@ -3800,6 +3821,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3938,6 +3960,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pretargetingconfig)
 	if err != nil {
@@ -4082,6 +4105,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4214,6 +4238,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pretargetingconfig)
 	if err != nil {
@@ -4359,6 +4384,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pretargetingconfig)
 	if err != nil {
diff --git a/adexchangebuyer/v1.4/adexchangebuyer-gen.go b/adexchangebuyer/v1.4/adexchangebuyer-gen.go
index a86bf79..6072054 100644
--- a/adexchangebuyer/v1.4/adexchangebuyer-gen.go
+++ b/adexchangebuyer/v1.4/adexchangebuyer-gen.go
@@ -72,9 +72,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 
@@ -108,6 +109,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	return rs
@@ -3792,6 +3797,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3928,6 +3934,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4051,6 +4058,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -4198,6 +4206,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -4347,6 +4356,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4484,6 +4494,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4610,6 +4621,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4752,6 +4764,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.budget)
 	if err != nil {
@@ -4899,6 +4912,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.budget)
 	if err != nil {
@@ -5044,6 +5058,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "creatives/{accountId}/{buyerCreativeId}/addDeal/{dealId}")
@@ -5171,6 +5186,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5306,6 +5322,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creative)
 	if err != nil {
@@ -5504,6 +5521,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5712,6 +5730,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5851,6 +5870,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "creatives/{accountId}/{buyerCreativeId}/removeDeal/{dealId}")
@@ -5966,6 +5986,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.deleteorderdealsrequest)
 	if err != nil {
@@ -6099,6 +6120,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.addorderdealsrequest)
 	if err != nil {
@@ -6248,6 +6270,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6382,6 +6405,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.editallorderdealsrequest)
 	if err != nil {
@@ -6515,6 +6539,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.addordernotesrequest)
 	if err != nil {
@@ -6666,6 +6691,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6799,6 +6825,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.updateprivateauctionproposalrequest)
 	if err != nil {
@@ -6931,6 +6958,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7084,6 +7112,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "pretargetingconfigs/{accountId}/{configId}")
@@ -7202,6 +7231,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7340,6 +7370,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pretargetingconfig)
 	if err != nil {
@@ -7484,6 +7515,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7616,6 +7648,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pretargetingconfig)
 	if err != nil {
@@ -7761,6 +7794,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pretargetingconfig)
 	if err != nil {
@@ -7913,6 +7947,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8055,6 +8090,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8185,6 +8221,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8311,6 +8348,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.createordersrequest)
 	if err != nil {
@@ -8435,6 +8473,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.proposal)
 	if err != nil {
@@ -8615,6 +8654,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8735,6 +8775,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "proposals/{proposalId}/setupcomplete")
@@ -8836,6 +8877,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.proposal)
 	if err != nil {
@@ -9011,6 +9053,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/adexchangebuyer2/v2beta1/adexchangebuyer2-api.json b/adexchangebuyer2/v2beta1/adexchangebuyer2-api.json
index e73cafd..16c80a4 100644
--- a/adexchangebuyer2/v2beta1/adexchangebuyer2-api.json
+++ b/adexchangebuyer2/v2beta1/adexchangebuyer2-api.json
@@ -1,473 +1,59 @@
 {
-  "id": "adexchangebuyer2:v2beta1",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/adexchange.buyer": {
-          "description": "Manage your Ad Exchange buyer account configuration"
-        }
-      }
-    }
-  },
-  "description": "Accesses the latest features for managing Ad Exchange accounts, Real-Time Bidding configurations and auction metrics, and Marketplace programmatic deals.",
-  "protocol": "rest",
-  "title": "Ad Exchange Buyer API II",
-  "resources": {
-    "accounts": {
-      "resources": {
-        "clients": {
-          "resources": {
-            "users": {
-              "methods": {
-                "update": {
-                  "id": "adexchangebuyer2.accounts.clients.users.update",
-                  "response": {
-                    "$ref": "ClientUser"
-                  },
-                  "parameterOrder": [
-                    "accountId",
-                    "clientAccountId",
-                    "userId"
-                  ],
-                  "description": "Updates an existing client user.\nOnly the user status can be changed on update.",
-                  "request": {
-                    "$ref": "ClientUser"
-                  },
-                  "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/users/{userId}",
-                  "httpMethod": "PUT",
-                  "parameters": {
-                    "clientAccountId": {
-                      "description": "Numerical account ID of the client buyer that the user to be retrieved\nis associated with. (required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    },
-                    "userId": {
-                      "description": "Numerical identifier of the user to retrieve. (required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    },
-                    "accountId": {
-                      "description": "Numerical account ID of the client's sponsor buyer. (required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    }
-                  },
-                  "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/users/{userId}",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/adexchange.buyer"
-                  ]
-                },
-                "get": {
-                  "id": "adexchangebuyer2.accounts.clients.users.get",
-                  "response": {
-                    "$ref": "ClientUser"
-                  },
-                  "parameterOrder": [
-                    "accountId",
-                    "clientAccountId",
-                    "userId"
-                  ],
-                  "description": "Retrieves an existing client user.",
-                  "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/users/{userId}",
-                  "httpMethod": "GET",
-                  "parameters": {
-                    "clientAccountId": {
-                      "description": "Numerical account ID of the client buyer\nthat the user to be retrieved is associated with. (required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    },
-                    "userId": {
-                      "description": "Numerical identifier of the user to retrieve. (required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    },
-                    "accountId": {
-                      "description": "Numerical account ID of the client's sponsor buyer. (required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    }
-                  },
-                  "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/users/{userId}",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/adexchange.buyer"
-                  ]
-                },
-                "list": {
-                  "id": "adexchangebuyer2.accounts.clients.users.list",
-                  "response": {
-                    "$ref": "ListClientUsersResponse"
-                  },
-                  "parameterOrder": [
-                    "accountId",
-                    "clientAccountId"
-                  ],
-                  "description": "Lists all the known client users for a specified\nsponsor buyer account ID.",
-                  "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/users",
-                  "httpMethod": "GET",
-                  "parameters": {
-                    "clientAccountId": {
-                      "description": "The account ID of the client buyer to list users for. (required)\nYou must specify either a string representation of a\nnumerical account identifier or the `-` character\nto list all the client users for all the clients\nof a given sponsor buyer.",
-                      "required": true,
-                      "location": "path",
-                      "type": "string"
-                    },
-                    "pageSize": {
-                      "description": "Requested page size. The server may return fewer clients than requested.\nIf unspecified, the server will pick an appropriate default.",
-                      "location": "query",
-                      "type": "integer",
-                      "format": "int32"
-                    },
-                    "accountId": {
-                      "description": "Numerical account ID of the sponsor buyer of the client to list users for.\n(required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    },
-                    "pageToken": {
-                      "description": "A token identifying a page of results the server should return.\nTypically, this is the value of\nListClientUsersResponse.nextPageToken\nreturned from the previous call to the\naccounts.clients.users.list method.",
-                      "location": "query",
-                      "type": "string"
-                    }
-                  },
-                  "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/users",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/adexchange.buyer"
-                  ]
-                }
-              }
-            },
-            "invitations": {
-              "methods": {
-                "create": {
-                  "id": "adexchangebuyer2.accounts.clients.invitations.create",
-                  "response": {
-                    "$ref": "ClientUserInvitation"
-                  },
-                  "parameterOrder": [
-                    "accountId",
-                    "clientAccountId"
-                  ],
-                  "description": "Creates and sends out an email invitation to access\nan Ad Exchange client buyer account.",
-                  "request": {
-                    "$ref": "ClientUserInvitation"
-                  },
-                  "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations",
-                  "httpMethod": "POST",
-                  "parameters": {
-                    "clientAccountId": {
-                      "description": "Numerical account ID of the client buyer that the user\nshould be associated with. (required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    },
-                    "accountId": {
-                      "description": "Numerical account ID of the client's sponsor buyer. (required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    }
-                  },
-                  "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/adexchange.buyer"
-                  ]
-                },
-                "get": {
-                  "id": "adexchangebuyer2.accounts.clients.invitations.get",
-                  "response": {
-                    "$ref": "ClientUserInvitation"
-                  },
-                  "parameterOrder": [
-                    "accountId",
-                    "clientAccountId",
-                    "invitationId"
-                  ],
-                  "description": "Retrieves an existing client user invitation.",
-                  "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations/{invitationId}",
-                  "httpMethod": "GET",
-                  "parameters": {
-                    "clientAccountId": {
-                      "description": "Numerical account ID of the client buyer that the user invitation\nto be retrieved is associated with. (required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    },
-                    "invitationId": {
-                      "description": "Numerical identifier of the user invitation to retrieve. (required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    },
-                    "accountId": {
-                      "description": "Numerical account ID of the client's sponsor buyer. (required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    }
-                  },
-                  "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations/{invitationId}",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/adexchange.buyer"
-                  ]
-                },
-                "list": {
-                  "id": "adexchangebuyer2.accounts.clients.invitations.list",
-                  "response": {
-                    "$ref": "ListClientUserInvitationsResponse"
-                  },
-                  "parameterOrder": [
-                    "accountId",
-                    "clientAccountId"
-                  ],
-                  "description": "Lists all the client users invitations for a client\nwith a given account ID.",
-                  "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations",
-                  "httpMethod": "GET",
-                  "parameters": {
-                    "clientAccountId": {
-                      "description": "Numerical account ID of the client buyer to list invitations for.\n(required)\nYou must either specify a string representation of a\nnumerical account identifier or the `-` character\nto list all the invitations for all the clients\nof a given sponsor buyer.",
-                      "required": true,
-                      "location": "path",
-                      "type": "string"
-                    },
-                    "pageSize": {
-                      "description": "Requested page size. Server may return fewer clients than requested.\nIf unspecified, server will pick an appropriate default.",
-                      "location": "query",
-                      "type": "integer",
-                      "format": "int32"
-                    },
-                    "accountId": {
-                      "description": "Numerical account ID of the client's sponsor buyer. (required)",
-                      "required": true,
-                      "location": "path",
-                      "type": "string",
-                      "format": "int64"
-                    },
-                    "pageToken": {
-                      "description": "A token identifying a page of results the server should return.\nTypically, this is the value of\nListClientUserInvitationsResponse.nextPageToken\nreturned from the previous call to the\nclients.invitations.list\nmethod.",
-                      "location": "query",
-                      "type": "string"
-                    }
-                  },
-                  "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/adexchange.buyer"
-                  ]
-                }
-              }
-            }
-          },
-          "methods": {
-            "update": {
-              "id": "adexchangebuyer2.accounts.clients.update",
-              "response": {
-                "$ref": "Client"
-              },
-              "parameterOrder": [
-                "accountId",
-                "clientAccountId"
-              ],
-              "description": "Updates an existing client buyer.",
-              "request": {
-                "$ref": "Client"
-              },
-              "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}",
-              "httpMethod": "PUT",
-              "parameters": {
-                "clientAccountId": {
-                  "description": "Unique numerical account ID of the client to update. (required)",
-                  "required": true,
-                  "location": "path",
-                  "type": "string",
-                  "format": "int64"
-                },
-                "accountId": {
-                  "description": "Unique numerical account ID for the buyer of which the client buyer\nis a customer; the sponsor buyer to update a client for. (required)",
-                  "required": true,
-                  "location": "path",
-                  "type": "string",
-                  "format": "int64"
-                }
-              },
-              "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}",
-              "scopes": [
-                "https://www.googleapis.com/auth/adexchange.buyer"
-              ]
-            },
-            "get": {
-              "id": "adexchangebuyer2.accounts.clients.get",
-              "response": {
-                "$ref": "Client"
-              },
-              "parameterOrder": [
-                "accountId",
-                "clientAccountId"
-              ],
-              "description": "Gets a client buyer with a given client account ID.",
-              "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}",
-              "httpMethod": "GET",
-              "parameters": {
-                "clientAccountId": {
-                  "description": "Numerical account ID of the client buyer to retrieve. (required)",
-                  "required": true,
-                  "location": "path",
-                  "type": "string",
-                  "format": "int64"
-                },
-                "accountId": {
-                  "description": "Numerical account ID of the client's sponsor buyer. (required)",
-                  "required": true,
-                  "location": "path",
-                  "type": "string",
-                  "format": "int64"
-                }
-              },
-              "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}",
-              "scopes": [
-                "https://www.googleapis.com/auth/adexchange.buyer"
-              ]
-            },
-            "create": {
-              "id": "adexchangebuyer2.accounts.clients.create",
-              "response": {
-                "$ref": "Client"
-              },
-              "parameterOrder": [
-                "accountId"
-              ],
-              "description": "Creates a new client buyer.",
-              "request": {
-                "$ref": "Client"
-              },
-              "flatPath": "v2beta1/accounts/{accountId}/clients",
-              "httpMethod": "POST",
-              "parameters": {
-                "accountId": {
-                  "description": "Unique numerical account ID for the buyer of which the client buyer\nis a customer; the sponsor buyer to create a client for. (required)",
-                  "required": true,
-                  "location": "path",
-                  "type": "string",
-                  "format": "int64"
-                }
-              },
-              "path": "v2beta1/accounts/{accountId}/clients",
-              "scopes": [
-                "https://www.googleapis.com/auth/adexchange.buyer"
-              ]
-            },
-            "list": {
-              "id": "adexchangebuyer2.accounts.clients.list",
-              "response": {
-                "$ref": "ListClientsResponse"
-              },
-              "parameterOrder": [
-                "accountId"
-              ],
-              "description": "Lists all the clients for the current sponsor buyer.",
-              "flatPath": "v2beta1/accounts/{accountId}/clients",
-              "httpMethod": "GET",
-              "parameters": {
-                "pageSize": {
-                  "description": "Requested page size. The server may return fewer clients than requested.\nIf unspecified, the server will pick an appropriate default.",
-                  "location": "query",
-                  "type": "integer",
-                  "format": "int32"
-                },
-                "accountId": {
-                  "description": "Unique numerical account ID of the sponsor buyer to list the clients for.",
-                  "required": true,
-                  "location": "path",
-                  "type": "string",
-                  "format": "int64"
-                },
-                "pageToken": {
-                  "description": "A token identifying a page of results the server should return.\nTypically, this is the value of\nListClientsResponse.nextPageToken\nreturned from the previous call to the\naccounts.clients.list method.",
-                  "location": "query",
-                  "type": "string"
-                }
-              },
-              "path": "v2beta1/accounts/{accountId}/clients",
-              "scopes": [
-                "https://www.googleapis.com/auth/adexchange.buyer"
-              ]
-            }
-          }
-        }
-      }
-    }
-  },
   "schemas": {
     "ClientUser": {
-      "description": "A client user is created under a client buyer and has restricted access to\nthe Ad Exchange Marketplace and certain other sections\nof the Ad Exchange Buyer UI based on the role\ngranted to the associated client buyer.\n\nThe only way a new client user can be created is via accepting an\nemail invitation\n(see the\naccounts.clients.invitations.create\nmethod).\n\nAll fields are required unless otherwise specified.",
       "type": "object",
       "properties": {
-        "email": {
-          "description": "User's email address. The value of this field\nis ignored in an update operation.",
-          "type": "string"
-        },
-        "clientAccountId": {
-          "description": "Numerical account ID of the client buyer\nwith which the user is associated; the\nbuyer must be a client of the current sponsor buyer.\nThe value of this field is ignored in an update operation.",
-          "type": "string",
-          "format": "int64"
-        },
         "status": {
-          "description": "The status of the client user.",
-          "enum": [
-            "USER_STATUS_UNSPECIFIED",
-            "PENDING",
-            "ACTIVE",
-            "DISABLED"
-          ],
+          "type": "string",
           "enumDescriptions": [
             "A placeholder for an undefined user status.",
             "A user who was already created but hasn't accepted the invitation yet.",
             "A user that is currently active.",
             "A user that is currently disabled."
           ],
-          "type": "string"
+          "enum": [
+            "USER_STATUS_UNSPECIFIED",
+            "PENDING",
+            "ACTIVE",
+            "DISABLED"
+          ],
+          "description": "The status of the client user."
         },
         "userId": {
           "description": "The unique numerical ID of the client user\nthat has accepted an invitation.\nThe value of this field is ignored in an update operation.",
+          "format": "int64",
+          "type": "string"
+        },
+        "email": {
           "type": "string",
+          "description": "User's email address. The value of this field\nis ignored in an update operation."
+        },
+        "clientAccountId": {
+          "type": "string",
+          "description": "Numerical account ID of the client buyer\nwith which the user is associated; the\nbuyer must be a client of the current sponsor buyer.\nThe value of this field is ignored in an update operation.",
           "format": "int64"
         }
       },
-      "id": "ClientUser"
+      "id": "ClientUser",
+      "description": "A client user is created under a client buyer and has restricted access to\nthe Ad Exchange Marketplace and certain other sections\nof the Ad Exchange Buyer UI based on the role\ngranted to the associated client buyer.\n\nThe only way a new client user can be created is via accepting an\nemail invitation\n(see the\naccounts.clients.invitations.create\nmethod).\n\nAll fields are required unless otherwise specified."
     },
     "ClientUserInvitation": {
       "description": "An invitation for a new client user to get access to the Ad Exchange\nBuyer UI.\nAll fields are required unless otherwise specified.",
       "type": "object",
       "properties": {
-        "email": {
-          "description": "The email address to which the invitation is sent. Email\naddresses should be unique among all client users under each sponsor\nbuyer.",
-          "type": "string"
-        },
         "clientAccountId": {
           "description": "Numerical account ID of the client buyer\nthat the invited user is associated with.\nThe value of this field is ignored in create operations.",
-          "type": "string",
-          "format": "int64"
+          "format": "int64",
+          "type": "string"
         },
         "invitationId": {
           "description": "The unique numerical ID of the invitation that is sent to the user.\nThe value of this field is ignored in create operations.",
-          "type": "string",
-          "format": "int64"
+          "format": "int64",
+          "type": "string"
+        },
+        "email": {
+          "description": "The email address to which the invitation is sent. Email\naddresses should be unique among all client users under each sponsor\nbuyer.",
+          "type": "string"
         }
       },
       "id": "ClientUserInvitation"
@@ -480,107 +66,15 @@
           "type": "string"
         },
         "invitations": {
-          "description": "The returned list of client users.",
           "type": "array",
           "items": {
             "$ref": "ClientUserInvitation"
-          }
+          },
+          "description": "The returned list of client users."
         }
       },
       "id": "ListClientUserInvitationsResponse"
     },
-    "ListClientUsersResponse": {
-      "type": "object",
-      "properties": {
-        "users": {
-          "description": "The returned list of client users.",
-          "type": "array",
-          "items": {
-            "$ref": "ClientUser"
-          }
-        },
-        "nextPageToken": {
-          "description": "A token to retrieve the next page of results.\nPass this value in the\nListClientUsersRequest.pageToken\nfield in the subsequent call to the\nclients.invitations.list\nmethod to retrieve the next\npage of results.",
-          "type": "string"
-        }
-      },
-      "id": "ListClientUsersResponse"
-    },
-    "Client": {
-      "description": "A client resource represents a client buyer&mdash;an agency,\na brand, or an advertiser customer of the sponsor buyer.\nUsers associated with the client buyer have restricted access to\nthe Ad Exchange Marketplace and certain other sections\nof the Ad Exchange Buyer UI based on the role\ngranted to the client buyer.\nAll fields are required unless otherwise specified.",
-      "type": "object",
-      "properties": {
-        "visibleToSeller": {
-          "description": "Whether the client buyer will be visible to sellers.",
-          "type": "boolean"
-        },
-        "status": {
-          "description": "The status of the client buyer.",
-          "enum": [
-            "CLIENT_STATUS_UNSPECIFIED",
-            "DISABLED",
-            "ACTIVE"
-          ],
-          "enumDescriptions": [
-            "A placeholder for an undefined client status.",
-            "A client that is currently disabled.",
-            "A client that is currently active."
-          ],
-          "type": "string"
-        },
-        "entityType": {
-          "description": "The type of the client entity: `ADVERTISER`, `BRAND`, or `AGENCY`.",
-          "enum": [
-            "ENTITY_TYPE_UNSPECIFIED",
-            "ADVERTISER",
-            "BRAND",
-            "AGENCY"
-          ],
-          "enumDescriptions": [
-            "A placeholder for an undefined client entity type. Should not be used.",
-            "An advertiser.",
-            "A brand.",
-            "An advertising agency."
-          ],
-          "type": "string"
-        },
-        "role": {
-          "description": "The role which is assigned to the client buyer. Each role implies a set of\npermissions granted to the client. Must be one of `CLIENT_DEAL_VIEWER`,\n`CLIENT_DEAL_NEGOTIATOR` or `CLIENT_DEAL_APPROVER`.",
-          "enum": [
-            "CLIENT_ROLE_UNSPECIFIED",
-            "CLIENT_DEAL_VIEWER",
-            "CLIENT_DEAL_NEGOTIATOR",
-            "CLIENT_DEAL_APPROVER"
-          ],
-          "enumDescriptions": [
-            "A placeholder for an undefined client role.",
-            "Users associated with this client can see publisher deal offers\nin the Marketplace.\nThey can neither negotiate proposals nor approve deals.\nIf this client is visible to publishers, they can send deal proposals\nto this client.",
-            "Users associated with this client can respond to deal proposals\nsent to them by publishers. They can also initiate deal proposals\nof their own.",
-            "Users associated with this client can approve eligible deals\non your behalf. Some deals may still explicitly require publisher\nfinalization. If this role is not selected, the sponsor buyer\nwill need to manually approve each of their deals."
-          ],
-          "type": "string"
-        },
-        "clientName": {
-          "description": "Name used to represent this client to publishers.\nYou may have multiple clients that map to the same entity,\nbut for each client the combination of `clientName` and entity\nmust be unique.\nYou can specify this field as empty.",
-          "type": "string"
-        },
-        "clientAccountId": {
-          "description": "The globally-unique numerical ID of the client.\nThe value of this field is ignored in create and update operations.",
-          "type": "string",
-          "format": "int64"
-        },
-        "entityId": {
-          "description": "Numerical identifier of the client entity.\nThe entity can be an advertiser, a brand, or an agency.\nThis identifier is unique among all the entities with the same type.\n\nA list of all known advertisers with their identifiers is available in the\n[advertisers.txt](https://storage.googleapis.com/adx-rtb-dictionaries/advertisers.txt)\nfile.\n\nA list of all known brands with their identifiers is available in the\n[brands.txt](https://storage.googleapis.com/adx-rtb-dictionaries/brands.txt)\nfile.\n\nA list of all known agencies with their identifiers is available in the\n[agencies.txt](https://storage.googleapis.com/adx-rtb-dictionaries/agencies.txt)\nfile.",
-          "type": "string",
-          "format": "int64"
-        },
-        "entityName": {
-          "description": "The name of the entity. This field is automatically fetched based on\nthe type and ID.\nThe value of this field is ignored in create and update operations.",
-          "type": "string"
-        }
-      },
-      "id": "Client"
-    },
     "ListClientsResponse": {
       "type": "object",
       "properties": {
@@ -597,113 +91,619 @@
         }
       },
       "id": "ListClientsResponse"
+    },
+    "ListClientUsersResponse": {
+      "type": "object",
+      "properties": {
+        "nextPageToken": {
+          "type": "string",
+          "description": "A token to retrieve the next page of results.\nPass this value in the\nListClientUsersRequest.pageToken\nfield in the subsequent call to the\nclients.invitations.list\nmethod to retrieve the next\npage of results."
+        },
+        "users": {
+          "type": "array",
+          "items": {
+            "$ref": "ClientUser"
+          },
+          "description": "The returned list of client users."
+        }
+      },
+      "id": "ListClientUsersResponse"
+    },
+    "Client": {
+      "type": "object",
+      "properties": {
+        "role": {
+          "enum": [
+            "CLIENT_ROLE_UNSPECIFIED",
+            "CLIENT_DEAL_VIEWER",
+            "CLIENT_DEAL_NEGOTIATOR",
+            "CLIENT_DEAL_APPROVER"
+          ],
+          "description": "The role which is assigned to the client buyer. Each role implies a set of\npermissions granted to the client. Must be one of `CLIENT_DEAL_VIEWER`,\n`CLIENT_DEAL_NEGOTIATOR` or `CLIENT_DEAL_APPROVER`.",
+          "type": "string",
+          "enumDescriptions": [
+            "A placeholder for an undefined client role.",
+            "Users associated with this client can see publisher deal offers\nin the Marketplace.\nThey can neither negotiate proposals nor approve deals.\nIf this client is visible to publishers, they can send deal proposals\nto this client.",
+            "Users associated with this client can respond to deal proposals\nsent to them by publishers. They can also initiate deal proposals\nof their own.",
+            "Users associated with this client can approve eligible deals\non your behalf. Some deals may still explicitly require publisher\nfinalization. If this role is not selected, the sponsor buyer\nwill need to manually approve each of their deals."
+          ]
+        },
+        "visibleToSeller": {
+          "type": "boolean",
+          "description": "Whether the client buyer will be visible to sellers."
+        },
+        "entityId": {
+          "type": "string",
+          "description": "Numerical identifier of the client entity.\nThe entity can be an advertiser, a brand, or an agency.\nThis identifier is unique among all the entities with the same type.\n\nA list of all known advertisers with their identifiers is available in the\n[advertisers.txt](https://storage.googleapis.com/adx-rtb-dictionaries/advertisers.txt)\nfile.\n\nA list of all known brands with their identifiers is available in the\n[brands.txt](https://storage.googleapis.com/adx-rtb-dictionaries/brands.txt)\nfile.\n\nA list of all known agencies with their identifiers is available in the\n[agencies.txt](https://storage.googleapis.com/adx-rtb-dictionaries/agencies.txt)\nfile.",
+          "format": "int64"
+        },
+        "clientAccountId": {
+          "description": "The globally-unique numerical ID of the client.\nThe value of this field is ignored in create and update operations.",
+          "format": "int64",
+          "type": "string"
+        },
+        "entityName": {
+          "type": "string",
+          "description": "The name of the entity. This field is automatically fetched based on\nthe type and ID.\nThe value of this field is ignored in create and update operations."
+        },
+        "status": {
+          "type": "string",
+          "enumDescriptions": [
+            "A placeholder for an undefined client status.",
+            "A client that is currently disabled.",
+            "A client that is currently active."
+          ],
+          "enum": [
+            "CLIENT_STATUS_UNSPECIFIED",
+            "DISABLED",
+            "ACTIVE"
+          ],
+          "description": "The status of the client buyer."
+        },
+        "entityType": {
+          "enum": [
+            "ENTITY_TYPE_UNSPECIFIED",
+            "ADVERTISER",
+            "BRAND",
+            "AGENCY"
+          ],
+          "description": "The type of the client entity: `ADVERTISER`, `BRAND`, or `AGENCY`.",
+          "type": "string",
+          "enumDescriptions": [
+            "A placeholder for an undefined client entity type. Should not be used.",
+            "An advertiser.",
+            "A brand.",
+            "An advertising agency."
+          ]
+        },
+        "clientName": {
+          "type": "string",
+          "description": "Name used to represent this client to publishers.\nYou may have multiple clients that map to the same entity,\nbut for each client the combination of `clientName` and entity\nmust be unique.\nYou can specify this field as empty."
+        }
+      },
+      "id": "Client",
+      "description": "A client resource represents a client buyer&mdash;an agency,\na brand, or an advertiser customer of the sponsor buyer.\nUsers associated with the client buyer have restricted access to\nthe Ad Exchange Marketplace and certain other sections\nof the Ad Exchange Buyer UI based on the role\ngranted to the client buyer.\nAll fields are required unless otherwise specified."
     }
   },
-  "revision": "20161020",
-  "basePath": "",
   "icons": {
-    "x32": "http://www.google.com/images/icons/product/search-32.gif",
-    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
   },
-  "version_module": "True",
+  "protocol": "rest",
   "canonicalName": "AdExchangeBuyerII",
-  "discoveryVersion": "v1",
-  "baseUrl": "https://adexchangebuyer.googleapis.com/",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/adexchange.buyer": {
+          "description": "Manage your Ad Exchange buyer account configuration"
+        }
+      }
+    }
+  },
+  "rootUrl": "https://adexchangebuyer.googleapis.com/",
+  "ownerDomain": "google.com",
   "name": "adexchangebuyer2",
+  "batchPath": "batch",
+  "title": "Ad Exchange Buyer API II",
+  "ownerName": "Google",
+  "resources": {
+    "accounts": {
+      "resources": {
+        "clients": {
+          "methods": {
+            "get": {
+              "response": {
+                "$ref": "Client"
+              },
+              "parameterOrder": [
+                "accountId",
+                "clientAccountId"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/adexchange.buyer"
+              ],
+              "parameters": {
+                "clientAccountId": {
+                  "location": "path",
+                  "description": "Numerical account ID of the client buyer to retrieve. (required)",
+                  "format": "int64",
+                  "required": true,
+                  "type": "string"
+                },
+                "accountId": {
+                  "location": "path",
+                  "description": "Numerical account ID of the client's sponsor buyer. (required)",
+                  "format": "int64",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}",
+              "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}",
+              "id": "adexchangebuyer2.accounts.clients.get",
+              "description": "Gets a client buyer with a given client account ID."
+            },
+            "list": {
+              "response": {
+                "$ref": "ListClientsResponse"
+              },
+              "parameterOrder": [
+                "accountId"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/adexchange.buyer"
+              ],
+              "parameters": {
+                "pageToken": {
+                  "location": "query",
+                  "description": "A token identifying a page of results the server should return.\nTypically, this is the value of\nListClientsResponse.nextPageToken\nreturned from the previous call to the\naccounts.clients.list method.",
+                  "type": "string"
+                },
+                "accountId": {
+                  "required": true,
+                  "type": "string",
+                  "location": "path",
+                  "description": "Unique numerical account ID of the sponsor buyer to list the clients for.",
+                  "format": "int64"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "Requested page size. The server may return fewer clients than requested.\nIf unspecified, the server will pick an appropriate default.",
+                  "format": "int32",
+                  "type": "integer"
+                }
+              },
+              "flatPath": "v2beta1/accounts/{accountId}/clients",
+              "path": "v2beta1/accounts/{accountId}/clients",
+              "id": "adexchangebuyer2.accounts.clients.list",
+              "description": "Lists all the clients for the current sponsor buyer."
+            },
+            "update": {
+              "description": "Updates an existing client buyer.",
+              "request": {
+                "$ref": "Client"
+              },
+              "httpMethod": "PUT",
+              "parameterOrder": [
+                "accountId",
+                "clientAccountId"
+              ],
+              "response": {
+                "$ref": "Client"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/adexchange.buyer"
+              ],
+              "parameters": {
+                "accountId": {
+                  "required": true,
+                  "type": "string",
+                  "location": "path",
+                  "description": "Unique numerical account ID for the buyer of which the client buyer\nis a customer; the sponsor buyer to update a client for. (required)",
+                  "format": "int64"
+                },
+                "clientAccountId": {
+                  "location": "path",
+                  "description": "Unique numerical account ID of the client to update. (required)",
+                  "format": "int64",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}",
+              "id": "adexchangebuyer2.accounts.clients.update",
+              "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}"
+            },
+            "create": {
+              "request": {
+                "$ref": "Client"
+              },
+              "description": "Creates a new client buyer.",
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "accountId"
+              ],
+              "response": {
+                "$ref": "Client"
+              },
+              "parameters": {
+                "accountId": {
+                  "required": true,
+                  "type": "string",
+                  "location": "path",
+                  "description": "Unique numerical account ID for the buyer of which the client buyer\nis a customer; the sponsor buyer to create a client for. (required)",
+                  "format": "int64"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/adexchange.buyer"
+              ],
+              "flatPath": "v2beta1/accounts/{accountId}/clients",
+              "id": "adexchangebuyer2.accounts.clients.create",
+              "path": "v2beta1/accounts/{accountId}/clients"
+            }
+          },
+          "resources": {
+            "invitations": {
+              "methods": {
+                "get": {
+                  "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations/{invitationId}",
+                  "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations/{invitationId}",
+                  "id": "adexchangebuyer2.accounts.clients.invitations.get",
+                  "description": "Retrieves an existing client user invitation.",
+                  "response": {
+                    "$ref": "ClientUserInvitation"
+                  },
+                  "parameterOrder": [
+                    "accountId",
+                    "clientAccountId",
+                    "invitationId"
+                  ],
+                  "httpMethod": "GET",
+                  "parameters": {
+                    "clientAccountId": {
+                      "location": "path",
+                      "description": "Numerical account ID of the client buyer that the user invitation\nto be retrieved is associated with. (required)",
+                      "format": "int64",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "invitationId": {
+                      "required": true,
+                      "type": "string",
+                      "location": "path",
+                      "description": "Numerical identifier of the user invitation to retrieve. (required)",
+                      "format": "int64"
+                    },
+                    "accountId": {
+                      "location": "path",
+                      "description": "Numerical account ID of the client's sponsor buyer. (required)",
+                      "format": "int64",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/adexchange.buyer"
+                  ]
+                },
+                "list": {
+                  "description": "Lists all the client users invitations for a client\nwith a given account ID.",
+                  "response": {
+                    "$ref": "ListClientUserInvitationsResponse"
+                  },
+                  "parameterOrder": [
+                    "accountId",
+                    "clientAccountId"
+                  ],
+                  "httpMethod": "GET",
+                  "parameters": {
+                    "clientAccountId": {
+                      "location": "path",
+                      "description": "Numerical account ID of the client buyer to list invitations for.\n(required)\nYou must either specify a string representation of a\nnumerical account identifier or the `-` character\nto list all the invitations for all the clients\nof a given sponsor buyer.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "pageToken": {
+                      "type": "string",
+                      "location": "query",
+                      "description": "A token identifying a page of results the server should return.\nTypically, this is the value of\nListClientUserInvitationsResponse.nextPageToken\nreturned from the previous call to the\nclients.invitations.list\nmethod."
+                    },
+                    "accountId": {
+                      "location": "path",
+                      "description": "Numerical account ID of the client's sponsor buyer. (required)",
+                      "format": "int64",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "pageSize": {
+                      "location": "query",
+                      "description": "Requested page size. Server may return fewer clients than requested.\nIf unspecified, server will pick an appropriate default.",
+                      "format": "int32",
+                      "type": "integer"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/adexchange.buyer"
+                  ],
+                  "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations",
+                  "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations",
+                  "id": "adexchangebuyer2.accounts.clients.invitations.list"
+                },
+                "create": {
+                  "httpMethod": "POST",
+                  "parameterOrder": [
+                    "accountId",
+                    "clientAccountId"
+                  ],
+                  "response": {
+                    "$ref": "ClientUserInvitation"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/adexchange.buyer"
+                  ],
+                  "parameters": {
+                    "accountId": {
+                      "required": true,
+                      "type": "string",
+                      "location": "path",
+                      "description": "Numerical account ID of the client's sponsor buyer. (required)",
+                      "format": "int64"
+                    },
+                    "clientAccountId": {
+                      "required": true,
+                      "type": "string",
+                      "location": "path",
+                      "description": "Numerical account ID of the client buyer that the user\nshould be associated with. (required)",
+                      "format": "int64"
+                    }
+                  },
+                  "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations",
+                  "id": "adexchangebuyer2.accounts.clients.invitations.create",
+                  "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations",
+                  "description": "Creates and sends out an email invitation to access\nan Ad Exchange client buyer account.",
+                  "request": {
+                    "$ref": "ClientUserInvitation"
+                  }
+                }
+              }
+            },
+            "users": {
+              "methods": {
+                "list": {
+                  "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/users",
+                  "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/users",
+                  "id": "adexchangebuyer2.accounts.clients.users.list",
+                  "description": "Lists all the known client users for a specified\nsponsor buyer account ID.",
+                  "response": {
+                    "$ref": "ListClientUsersResponse"
+                  },
+                  "parameterOrder": [
+                    "accountId",
+                    "clientAccountId"
+                  ],
+                  "httpMethod": "GET",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/adexchange.buyer"
+                  ],
+                  "parameters": {
+                    "clientAccountId": {
+                      "required": true,
+                      "type": "string",
+                      "location": "path",
+                      "description": "The account ID of the client buyer to list users for. (required)\nYou must specify either a string representation of a\nnumerical account identifier or the `-` character\nto list all the client users for all the clients\nof a given sponsor buyer."
+                    },
+                    "pageToken": {
+                      "location": "query",
+                      "description": "A token identifying a page of results the server should return.\nTypically, this is the value of\nListClientUsersResponse.nextPageToken\nreturned from the previous call to the\naccounts.clients.users.list method.",
+                      "type": "string"
+                    },
+                    "accountId": {
+                      "location": "path",
+                      "description": "Numerical account ID of the sponsor buyer of the client to list users for.\n(required)",
+                      "format": "int64",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "pageSize": {
+                      "location": "query",
+                      "description": "Requested page size. The server may return fewer clients than requested.\nIf unspecified, the server will pick an appropriate default.",
+                      "format": "int32",
+                      "type": "integer"
+                    }
+                  }
+                },
+                "get": {
+                  "description": "Retrieves an existing client user.",
+                  "response": {
+                    "$ref": "ClientUser"
+                  },
+                  "parameterOrder": [
+                    "accountId",
+                    "clientAccountId",
+                    "userId"
+                  ],
+                  "httpMethod": "GET",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/adexchange.buyer"
+                  ],
+                  "parameters": {
+                    "userId": {
+                      "required": true,
+                      "type": "string",
+                      "location": "path",
+                      "description": "Numerical identifier of the user to retrieve. (required)",
+                      "format": "int64"
+                    },
+                    "accountId": {
+                      "location": "path",
+                      "description": "Numerical account ID of the client's sponsor buyer. (required)",
+                      "format": "int64",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "clientAccountId": {
+                      "required": true,
+                      "type": "string",
+                      "location": "path",
+                      "description": "Numerical account ID of the client buyer\nthat the user to be retrieved is associated with. (required)",
+                      "format": "int64"
+                    }
+                  },
+                  "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/users/{userId}",
+                  "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/users/{userId}",
+                  "id": "adexchangebuyer2.accounts.clients.users.get"
+                },
+                "update": {
+                  "description": "Updates an existing client user.\nOnly the user status can be changed on update.",
+                  "request": {
+                    "$ref": "ClientUser"
+                  },
+                  "response": {
+                    "$ref": "ClientUser"
+                  },
+                  "parameterOrder": [
+                    "accountId",
+                    "clientAccountId",
+                    "userId"
+                  ],
+                  "httpMethod": "PUT",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/adexchange.buyer"
+                  ],
+                  "parameters": {
+                    "userId": {
+                      "location": "path",
+                      "description": "Numerical identifier of the user to retrieve. (required)",
+                      "format": "int64",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "accountId": {
+                      "location": "path",
+                      "description": "Numerical account ID of the client's sponsor buyer. (required)",
+                      "format": "int64",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "clientAccountId": {
+                      "required": true,
+                      "type": "string",
+                      "location": "path",
+                      "description": "Numerical account ID of the client buyer that the user to be retrieved\nis associated with. (required)",
+                      "format": "int64"
+                    }
+                  },
+                  "flatPath": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/users/{userId}",
+                  "path": "v2beta1/accounts/{accountId}/clients/{clientAccountId}/users/{userId}",
+                  "id": "adexchangebuyer2.accounts.clients.users.update"
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  },
   "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
     "quotaUser": {
+      "location": "query",
       "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
+      "type": "string"
     },
     "pp": {
+      "location": "query",
       "description": "Pretty-print response.",
-      "default": "true",
       "type": "boolean",
-      "location": "query"
+      "default": "true"
+    },
+    "bearer_token": {
+      "type": "string",
+      "location": "query",
+      "description": "OAuth bearer token."
+    },
+    "oauth_token": {
+      "type": "string",
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user."
+    },
+    "upload_protocol": {
+      "type": "string",
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\")."
+    },
+    "prettyPrint": {
+      "type": "boolean",
+      "default": "true",
+      "location": "query",
+      "description": "Returns response with indentations and line breaks."
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
     },
     "fields": {
+      "location": "query",
       "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
+      "type": "string"
     },
-    "alt": {
-      "description": "Data format for response.",
+    "callback": {
+      "type": "string",
+      "location": "query",
+      "description": "JSONP"
+    },
+    "$.xgafv": {
       "location": "query",
       "enum": [
-        "json",
-        "media",
-        "proto"
+        "1",
+        "2"
       ],
-      "default": "json",
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ]
+    },
+    "alt": {
+      "type": "string",
       "enumDescriptions": [
         "Responses with Content-Type of application/json",
         "Media download with context-dependent Content-Type",
         "Responses with Content-Type of application/x-protobuf"
       ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
       "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
+        "json",
+        "media",
+        "proto"
+      ]
     },
-    "callback": {
-      "description": "JSONP",
+    "key": {
       "type": "string",
-      "location": "query"
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token."
     },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
     }
   },
-  "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest/guides/client-access/",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
-  "servicePath": "",
-  "ownerName": "Google",
   "version": "v2beta1",
-  "rootUrl": "https://adexchangebuyer.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "baseUrl": "https://adexchangebuyer.googleapis.com/",
+  "kind": "discovery#restDescription",
+  "description": "Accesses the latest features for managing Ad Exchange accounts, Real-Time Bidding configurations and auction metrics, and Marketplace programmatic deals.",
+  "servicePath": "",
+  "basePath": "",
+  "revision": "20170206",
+  "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest/guides/client-access/",
+  "id": "adexchangebuyer2:v2beta1",
+  "discoveryVersion": "v1",
+  "version_module": "True"
 }
diff --git a/adexchangebuyer2/v2beta1/adexchangebuyer2-gen.go b/adexchangebuyer2/v2beta1/adexchangebuyer2-gen.go
index 9d14935..883b7da 100644
--- a/adexchangebuyer2/v2beta1/adexchangebuyer2-gen.go
+++ b/adexchangebuyer2/v2beta1/adexchangebuyer2-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Clients = NewAccountsClientsService(s)
@@ -539,6 +544,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.client)
 	if err != nil {
@@ -685,6 +691,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -853,6 +860,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1017,6 +1025,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.client)
 	if err != nil {
@@ -1164,6 +1173,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.clientuserinvitation)
 	if err != nil {
@@ -1321,6 +1331,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1503,6 +1514,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1687,6 +1699,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1867,6 +1880,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2042,6 +2056,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.clientuser)
 	if err != nil {
diff --git a/adexchangeseller/v1.1/adexchangeseller-gen.go b/adexchangeseller/v1.1/adexchangeseller-gen.go
index a3b2aee..abc0b90 100644
--- a/adexchangeseller/v1.1/adexchangeseller-gen.go
+++ b/adexchangeseller/v1.1/adexchangeseller-gen.go
@@ -72,9 +72,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 
@@ -102,6 +103,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	return rs
@@ -1175,6 +1180,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1327,6 +1333,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1489,6 +1496,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1659,6 +1667,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1856,6 +1865,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2043,6 +2053,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2176,6 +2187,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2340,6 +2352,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2537,6 +2550,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2721,6 +2735,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2844,6 +2859,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2968,6 +2984,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3104,6 +3121,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3282,6 +3300,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3516,6 +3535,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3690,6 +3710,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3867,6 +3888,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/adexchangeseller/v1/adexchangeseller-gen.go b/adexchangeseller/v1/adexchangeseller-gen.go
index 10b943f..e6827a9 100644
--- a/adexchangeseller/v1/adexchangeseller-gen.go
+++ b/adexchangeseller/v1/adexchangeseller-gen.go
@@ -68,9 +68,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Adclients *AdclientsService
 
@@ -90,6 +91,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAdclientsService(s *Service) *AdclientsService {
 	rs := &AdclientsService{s: s}
 	return rs
@@ -809,6 +814,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -971,6 +977,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1141,6 +1148,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1338,6 +1346,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1520,6 +1529,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1684,6 +1694,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1881,6 +1892,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2120,6 +2132,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2354,6 +2367,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2528,6 +2542,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2705,6 +2720,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/adexchangeseller/v2.0/adexchangeseller-gen.go b/adexchangeseller/v2.0/adexchangeseller-gen.go
index 5b54c3a..bc1cabf 100644
--- a/adexchangeseller/v2.0/adexchangeseller-gen.go
+++ b/adexchangeseller/v2.0/adexchangeseller-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 }
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Adclients = NewAccountsAdclientsService(s)
@@ -1085,6 +1090,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1237,6 +1243,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1413,6 +1420,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1594,6 +1602,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1741,6 +1750,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1915,6 +1925,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2096,6 +2107,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2235,6 +2247,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2375,6 +2388,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2521,6 +2535,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2715,6 +2730,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2961,6 +2977,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3145,6 +3162,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3336,6 +3354,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/admin/datatransfer/v1/admin-gen.go b/admin/datatransfer/v1/admin-gen.go
index fc783ea..9cfda85 100644
--- a/admin/datatransfer/v1/admin-gen.go
+++ b/admin/datatransfer/v1/admin-gen.go
@@ -65,9 +65,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Applications *ApplicationsService
 
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewApplicationsService(s *Service) *ApplicationsService {
 	rs := &ApplicationsService{s: s}
 	return rs
@@ -423,6 +428,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -582,6 +588,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -747,6 +754,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -874,6 +882,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.datatransfer)
 	if err != nil {
@@ -1042,6 +1051,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/admin/directory/v1/admin-gen.go b/admin/directory/v1/admin-gen.go
index be71a18..c25c96f 100644
--- a/admin/directory/v1/admin-gen.go
+++ b/admin/directory/v1/admin-gen.go
@@ -157,9 +157,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Asps *AspsService
 
@@ -207,6 +208,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAspsService(s *Service) *AspsService {
 	rs := &AspsService{s: s}
 	return rs
@@ -3456,6 +3461,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "users/{userKey}/asps/{codeId}")
@@ -3573,6 +3579,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3719,6 +3726,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3845,6 +3853,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -3942,6 +3951,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.chromeosdeviceaction)
 	if err != nil {
@@ -4078,6 +4088,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4300,6 +4311,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4530,6 +4542,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.chromeosdevice)
 	if err != nil {
@@ -4698,6 +4711,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.chromeosdevice)
 	if err != nil {
@@ -4861,6 +4875,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4990,6 +5005,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.customer)
 	if err != nil {
@@ -5123,6 +5139,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.customer)
 	if err != nil {
@@ -5256,6 +5273,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customer/{customer}/domainaliases/{domainAliasName}")
@@ -5372,6 +5390,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5509,6 +5528,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.domainalias)
 	if err != nil {
@@ -5658,6 +5678,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5792,6 +5813,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customer/{customer}/domains/{domainName}")
@@ -5908,6 +5930,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6045,6 +6068,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.domains)
 	if err != nil {
@@ -6187,6 +6211,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6314,6 +6339,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "groups/{groupKey}")
@@ -6420,6 +6446,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6547,6 +6574,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
 	if err != nil {
@@ -6711,6 +6739,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6876,6 +6905,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
 	if err != nil {
@@ -7009,6 +7039,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
 	if err != nil {
@@ -7142,6 +7173,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "groups/{groupKey}/aliases/{alias}")
@@ -7247,6 +7279,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.alias)
 	if err != nil {
@@ -7389,6 +7422,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7519,6 +7553,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "groups/{groupKey}/members/{memberKey}")
@@ -7636,6 +7671,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7775,6 +7811,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.member)
 	if err != nil {
@@ -7939,6 +7976,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8111,6 +8149,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.member)
 	if err != nil {
@@ -8255,6 +8294,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.member)
 	if err != nil {
@@ -8399,6 +8439,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.mobiledeviceaction)
 	if err != nil {
@@ -8513,6 +8554,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customer/{customerId}/devices/mobile/{resourceId}")
@@ -8641,6 +8683,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8864,6 +8907,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9083,6 +9127,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customer/{customer}/notifications/{notificationId}")
@@ -9199,6 +9244,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9366,6 +9412,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9533,6 +9580,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.notification)
 	if err != nil {
@@ -9676,6 +9724,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.notification)
 	if err != nil {
@@ -9817,6 +9866,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customer/{customerId}/orgunits{/orgUnitPath*}")
@@ -9934,6 +9984,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10072,6 +10123,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orgunit)
 	if err != nil {
@@ -10232,6 +10284,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10383,6 +10436,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orgunit)
 	if err != nil {
@@ -10527,6 +10581,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orgunit)
 	if err != nil {
@@ -10678,6 +10733,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10807,6 +10863,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customer/{customer}/resources/calendars/{calendarResourceId}")
@@ -10923,6 +10980,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11060,6 +11118,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.calendarresource)
 	if err != nil {
@@ -11216,6 +11275,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11382,6 +11442,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.calendarresource)
 	if err != nil {
@@ -11525,6 +11586,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.calendarresource)
 	if err != nil {
@@ -11666,6 +11728,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customer/{customer}/roleassignments/{roleAssignmentId}")
@@ -11782,6 +11845,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11919,6 +11983,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.roleassignment)
 	if err != nil {
@@ -12091,6 +12156,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12264,6 +12330,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customer/{customer}/roles/{roleId}")
@@ -12380,6 +12447,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12517,6 +12585,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.role)
 	if err != nil {
@@ -12673,6 +12742,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12838,6 +12908,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.role)
 	if err != nil {
@@ -12981,6 +13052,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.role)
 	if err != nil {
@@ -13122,6 +13194,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customer/{customerId}/schemas/{schemaKey}")
@@ -13238,6 +13311,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13375,6 +13449,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.schema)
 	if err != nil {
@@ -13517,6 +13592,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13648,6 +13724,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.schema)
 	if err != nil {
@@ -13791,6 +13868,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.schema)
 	if err != nil {
@@ -13932,6 +14010,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "users/{userKey}/tokens/{clientId}")
@@ -14048,6 +14127,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14194,6 +14274,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14320,6 +14401,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "users/{userKey}")
@@ -14458,6 +14540,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14620,6 +14703,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
 	if err != nil {
@@ -14861,6 +14945,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15115,6 +15200,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.usermakeadmin)
 	if err != nil {
@@ -15220,6 +15306,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
 	if err != nil {
@@ -15353,6 +15440,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userundelete)
 	if err != nil {
@@ -15458,6 +15546,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
 	if err != nil {
@@ -15703,6 +15792,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -15942,6 +16032,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "users/{userKey}/aliases/{alias}")
@@ -16048,6 +16139,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.alias)
 	if err != nil {
@@ -16202,6 +16294,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16358,6 +16451,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -16507,6 +16601,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "users/{userKey}/photos/thumbnail")
@@ -16613,6 +16708,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16743,6 +16839,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userphoto)
 	if err != nil {
@@ -16876,6 +16973,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userphoto)
 	if err != nil {
@@ -17007,6 +17105,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "users/{userKey}/verificationCodes/generate")
@@ -17103,6 +17202,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "users/{userKey}/verificationCodes/invalidate")
@@ -17210,6 +17310,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/admin/reports/v1/admin-gen.go b/admin/reports/v1/admin-gen.go
index 7a4e584..416343b 100644
--- a/admin/reports/v1/admin-gen.go
+++ b/admin/reports/v1/admin-gen.go
@@ -67,9 +67,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Activities *ActivitiesService
 
@@ -87,6 +88,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewActivitiesService(s *Service) *ActivitiesService {
 	rs := &ActivitiesService{s: s}
 	return rs
@@ -775,6 +780,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1041,6 +1047,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -1230,6 +1237,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -1354,6 +1362,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1569,6 +1578,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/adsense/v1.3/adsense-gen.go b/adsense/v1.3/adsense-gen.go
index 4ec72e1..6fab561 100644
--- a/adsense/v1.3/adsense-gen.go
+++ b/adsense/v1.3/adsense-gen.go
@@ -72,9 +72,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 
@@ -102,6 +103,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Adclients = NewAccountsAdclientsService(s)
@@ -1644,6 +1649,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1801,6 +1807,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1977,6 +1984,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2154,6 +2162,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2312,6 +2321,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2492,6 +2502,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2699,6 +2710,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2896,6 +2908,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3044,6 +3057,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3218,6 +3232,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3425,6 +3440,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3691,6 +3707,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3948,6 +3965,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4132,6 +4150,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4306,6 +4325,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4469,6 +4489,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4660,6 +4681,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4854,6 +4876,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5016,6 +5039,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5164,6 +5188,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5334,6 +5359,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5531,6 +5557,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5718,6 +5745,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5851,6 +5879,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6015,6 +6044,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6212,6 +6242,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6396,6 +6427,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6519,6 +6551,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6721,6 +6754,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6972,6 +7006,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7146,6 +7181,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7306,6 +7342,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7459,6 +7496,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7636,6 +7674,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/adsense/v1.4/adsense-gen.go b/adsense/v1.4/adsense-gen.go
index e691969..30b49b6 100644
--- a/adsense/v1.4/adsense-gen.go
+++ b/adsense/v1.4/adsense-gen.go
@@ -73,9 +73,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 
@@ -105,6 +106,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Adclients = NewAccountsAdclientsService(s)
@@ -1758,6 +1763,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1915,6 +1921,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2091,6 +2098,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2268,6 +2276,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2426,6 +2435,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2606,6 +2616,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2813,6 +2824,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2993,6 +3005,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/alerts/{alertId}")
@@ -3116,6 +3129,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3264,6 +3278,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3438,6 +3453,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3645,6 +3661,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3838,6 +3855,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4049,6 +4067,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4306,6 +4325,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4490,6 +4510,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4664,6 +4685,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4827,6 +4849,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5018,6 +5041,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5212,6 +5236,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5374,6 +5399,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5522,6 +5548,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5692,6 +5719,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5889,6 +5917,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6059,6 +6088,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "alerts/{alertId}")
@@ -6172,6 +6202,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6305,6 +6336,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6469,6 +6501,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6666,6 +6699,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6850,6 +6884,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6973,6 +7008,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7095,6 +7131,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7297,6 +7334,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7548,6 +7586,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7722,6 +7761,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7882,6 +7922,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8035,6 +8076,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8212,6 +8254,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/adsensehost/v4.1/adsensehost-gen.go b/adsensehost/v4.1/adsensehost-gen.go
index 647b506..94c21ee 100644
--- a/adsensehost/v4.1/adsensehost-gen.go
+++ b/adsensehost/v4.1/adsensehost-gen.go
@@ -66,9 +66,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 
@@ -90,6 +91,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Adclients = NewAccountsAdclientsService(s)
@@ -1099,6 +1104,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1236,6 +1242,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1374,6 +1381,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1535,6 +1543,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1700,6 +1709,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}")
@@ -1854,6 +1864,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2019,6 +2030,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2172,6 +2184,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.adunit)
 	if err != nil {
@@ -2347,6 +2360,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2526,6 +2540,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.adunit)
 	if err != nil {
@@ -2677,6 +2692,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.adunit)
 	if err != nil {
@@ -2883,6 +2899,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3087,6 +3104,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3238,6 +3256,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3412,6 +3431,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3578,6 +3598,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3704,6 +3725,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "adclients/{adClientId}/customchannels/{customChannelId}")
@@ -3848,6 +3870,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3984,6 +4007,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.customchannel)
 	if err != nil {
@@ -4143,6 +4167,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4307,6 +4332,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.customchannel)
 	if err != nil {
@@ -4447,6 +4473,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.customchannel)
 	if err != nil {
@@ -4643,6 +4670,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4827,6 +4855,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "adclients/{adClientId}/urlchannels/{urlChannelId}")
@@ -4960,6 +4989,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlchannel)
 	if err != nil {
@@ -5118,6 +5148,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/analytics/v2.4/analytics-gen.go b/analytics/v2.4/analytics-gen.go
index 00d1d85..3c870a7 100644
--- a/analytics/v2.4/analytics-gen.go
+++ b/analytics/v2.4/analytics-gen.go
@@ -65,9 +65,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Data *DataService
 
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewDataService(s *Service) *DataService {
 	rs := &DataService{s: s}
 	return rs
@@ -265,6 +270,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -446,6 +452,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -576,6 +583,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -732,6 +740,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -876,6 +885,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1002,6 +1012,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/analytics/v3/analytics-gen.go b/analytics/v3/analytics-gen.go
index 732cc65..4c83cbb 100644
--- a/analytics/v3/analytics-gen.go
+++ b/analytics/v3/analytics-gen.go
@@ -80,9 +80,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Data *DataService
 
@@ -100,6 +101,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewDataService(s *Service) *DataService {
 	rs := &DataService{s: s}
 	rs.Ga = NewDataGaService(s)
@@ -5668,6 +5673,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5952,6 +5958,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6188,6 +6195,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6371,6 +6379,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6501,6 +6510,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/entityUserLinks/{linkId}")
@@ -6606,6 +6616,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityuserlink)
 	if err != nil {
@@ -6763,6 +6774,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6908,6 +6920,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityuserlink)
 	if err != nil {
@@ -7071,6 +7084,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7228,6 +7242,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7395,6 +7410,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7542,6 +7558,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.customdimension)
 	if err != nil {
@@ -7709,6 +7726,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7873,6 +7891,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.customdimension)
 	if err != nil {
@@ -8041,6 +8060,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.customdimension)
 	if err != nil {
@@ -8209,6 +8229,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8356,6 +8377,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.custommetric)
 	if err != nil {
@@ -8523,6 +8545,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8687,6 +8710,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.custommetric)
 	if err != nil {
@@ -8855,6 +8879,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.custommetric)
 	if err != nil {
@@ -9014,6 +9039,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}")
@@ -9151,6 +9177,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9309,6 +9336,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.experiment)
 	if err != nil {
@@ -9487,6 +9515,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9656,6 +9685,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.experiment)
 	if err != nil {
@@ -9820,6 +9850,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.experiment)
 	if err != nil {
@@ -9978,6 +10009,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/filters/{filterId}")
@@ -10122,6 +10154,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10259,6 +10292,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.filter)
 	if err != nil {
@@ -10416,6 +10450,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10562,6 +10597,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.filter)
 	if err != nil {
@@ -10705,6 +10741,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.filter)
 	if err != nil {
@@ -10861,6 +10898,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11018,6 +11056,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.goal)
 	if err != nil {
@@ -11195,6 +11234,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11361,6 +11401,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.goal)
 	if err != nil {
@@ -11524,6 +11565,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.goal)
 	if err != nil {
@@ -11685,6 +11727,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}")
@@ -11825,6 +11868,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11986,6 +12030,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.profilefilterlink)
 	if err != nil {
@@ -12166,6 +12211,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12332,6 +12378,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.profilefilterlink)
 	if err != nil {
@@ -12499,6 +12546,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.profilefilterlink)
 	if err != nil {
@@ -12664,6 +12712,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}")
@@ -12789,6 +12838,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityuserlink)
 	if err != nil {
@@ -12966,6 +13016,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13131,6 +13182,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityuserlink)
 	if err != nil {
@@ -13290,6 +13342,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}")
@@ -13416,6 +13469,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13566,6 +13620,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.profile)
 	if err != nil {
@@ -13733,6 +13788,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13889,6 +13945,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.profile)
 	if err != nil {
@@ -14042,6 +14099,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.profile)
 	if err != nil {
@@ -14204,6 +14262,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14351,6 +14410,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketingaudience)
 	if err != nil {
@@ -14524,6 +14584,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14684,6 +14745,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketingaudience)
 	if err != nil {
@@ -14837,6 +14899,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketingaudience)
 	if err != nil {
@@ -15008,6 +15071,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15143,6 +15207,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports/{unsampledReportId}")
@@ -15279,6 +15344,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15437,6 +15503,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.unsampledreport)
 	if err != nil {
@@ -15615,6 +15682,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15778,6 +15846,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.analyticsdataimportdeleteuploaddatarequest)
 	if err != nil {
@@ -15918,6 +15987,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16104,6 +16174,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16322,6 +16393,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads")
@@ -16533,6 +16605,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}")
@@ -16660,6 +16733,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16807,6 +16881,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityadwordslink)
 	if err != nil {
@@ -16974,6 +17049,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17130,6 +17206,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityadwordslink)
 	if err != nil {
@@ -17283,6 +17360,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityadwordslink)
 	if err != nil {
@@ -17443,6 +17521,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17584,6 +17663,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.webproperty)
 	if err != nil {
@@ -17741,6 +17821,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17887,6 +17968,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.webproperty)
 	if err != nil {
@@ -18030,6 +18112,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.webproperty)
 	if err != nil {
@@ -18173,6 +18256,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks/{linkId}")
@@ -18288,6 +18372,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityuserlink)
 	if err != nil {
@@ -18455,6 +18540,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18610,6 +18696,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entityuserlink)
 	if err != nil {
@@ -18768,6 +18855,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18897,6 +18985,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountticket)
 	if err != nil {
diff --git a/analyticsreporting/v4/analyticsreporting-api.json b/analyticsreporting/v4/analyticsreporting-api.json
index 3cfc263..51f7460 100644
--- a/analyticsreporting/v4/analyticsreporting-api.json
+++ b/analyticsreporting/v4/analyticsreporting-api.json
@@ -1,458 +1,19 @@
 {
   "id": "analyticsreporting:v4",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/analytics.readonly": {
-          "description": "View your Google Analytics data"
-        },
-        "https://www.googleapis.com/auth/analytics": {
-          "description": "View and manage your Google Analytics data"
-        }
-      }
-    }
-  },
-  "description": "Accesses Analytics report data.",
-  "protocol": "rest",
-  "title": "Google Analytics Reporting API",
-  "resources": {
-    "reports": {
-      "methods": {
-        "batchGet": {
-          "id": "analyticsreporting.reports.batchGet",
-          "response": {
-            "$ref": "GetReportsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Returns the Analytics data.",
-          "request": {
-            "$ref": "GetReportsRequest"
-          },
-          "flatPath": "v4/reports:batchGet",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v4/reports:batchGet",
-          "scopes": [
-            "https://www.googleapis.com/auth/analytics",
-            "https://www.googleapis.com/auth/analytics.readonly"
-          ]
-        }
-      }
-    }
-  },
+  "documentationLink": "https://developers.google.com/analytics/devguides/reporting/core/v4/",
+  "revision": "20161129",
+  "discoveryVersion": "v1",
+  "version_module": "True",
   "schemas": {
-    "PivotHeader": {
-      "description": "The headers for each of the pivot sections defined in the request.",
-      "type": "object",
-      "properties": {
-        "totalPivotGroupsCount": {
-          "description": "The total number of groups for this pivot.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "pivotHeaderEntries": {
-          "description": "A single pivot section header.",
-          "type": "array",
-          "items": {
-            "$ref": "PivotHeaderEntry"
-          }
-        }
-      },
-      "id": "PivotHeader"
-    },
-    "Metric": {
-      "description": "[Metrics](https://support.google.com/analytics/answer/1033861)\nare the quantitative measurements. For example, the metric `ga:users`\nindicates the total number of users for the requested time period.",
-      "type": "object",
-      "properties": {
-        "alias": {
-          "description": "An alias for the metric expression is an alternate name for the\nexpression. The alias can be used for filtering and sorting. This field\nis optional and is useful if the expression is not a single metric but\na complex expression which cannot be used in filtering and sorting.\nThe alias is also used in the response column header.",
-          "type": "string"
-        },
-        "formattingType": {
-          "description": "Specifies how the metric expression should be formatted, for example\n`INTEGER`.",
-          "enum": [
-            "METRIC_TYPE_UNSPECIFIED",
-            "INTEGER",
-            "FLOAT",
-            "CURRENCY",
-            "PERCENT",
-            "TIME"
-          ],
-          "enumDescriptions": [
-            "Metric type is unspecified.",
-            "Integer metric.",
-            "Float metric.",
-            "Currency metric.",
-            "Percentage metric.",
-            "Time metric in `HH:MM:SS` format."
-          ],
-          "type": "string"
-        },
-        "expression": {
-          "description": "A metric expression in the request. An expression is constructed from one\nor more metrics and numbers. Accepted operators include: Plus (+), Minus\n(-), Negation (Unary -), Divided by (/), Multiplied by (*), Parenthesis,\nPositive cardinal numbers (0-9), can include decimals and is limited to\n1024 characters. Example `ga:totalRefunds/ga:users`, in most cases the\nmetric expression is just a single metric name like `ga:users`.\nAdding mixed `MetricType` (E.g., `CURRENCY` + `PERCENTAGE`) metrics\nwill result in unexpected results.",
-          "type": "string"
-        }
-      },
-      "id": "Metric"
-    },
-    "ColumnHeader": {
-      "description": "Column headers.",
-      "type": "object",
-      "properties": {
-        "dimensions": {
-          "description": "The dimension names in the response.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "metricHeader": {
-          "description": "Metric headers for the metrics in the response.",
-          "$ref": "MetricHeader"
-        }
-      },
-      "id": "ColumnHeader"
-    },
-    "DynamicSegment": {
-      "description": "Dynamic segment definition for defining the segment within the request.\nA segment can select users, sessions or both.",
-      "type": "object",
-      "properties": {
-        "sessionSegment": {
-          "description": "Session Segment to select sessions to include in the segment.",
-          "$ref": "SegmentDefinition"
-        },
-        "name": {
-          "description": "The name of the dynamic segment.",
-          "type": "string"
-        },
-        "userSegment": {
-          "description": "User Segment to select users to include in the segment.",
-          "$ref": "SegmentDefinition"
-        }
-      },
-      "id": "DynamicSegment"
-    },
-    "MetricHeader": {
-      "description": "The headers for the metrics.",
-      "type": "object",
-      "properties": {
-        "metricHeaderEntries": {
-          "description": "Headers for the metrics in the response.",
-          "type": "array",
-          "items": {
-            "$ref": "MetricHeaderEntry"
-          }
-        },
-        "pivotHeaders": {
-          "description": "Headers for the pivots in the response.",
-          "type": "array",
-          "items": {
-            "$ref": "PivotHeader"
-          }
-        }
-      },
-      "id": "MetricHeader"
-    },
-    "Report": {
-      "description": "The data response corresponding to the request.",
-      "type": "object",
-      "properties": {
-        "columnHeader": {
-          "description": "The column headers.",
-          "$ref": "ColumnHeader"
-        },
-        "data": {
-          "description": "Response data.",
-          "$ref": "ReportData"
-        },
-        "nextPageToken": {
-          "description": "Page token to retrieve the next page of results in the list.",
-          "type": "string"
-        }
-      },
-      "id": "Report"
-    },
-    "SegmentFilterClause": {
-      "description": "Filter Clause to be used in a segment definition, can be wither a metric or\na dimension filter.",
-      "type": "object",
-      "properties": {
-        "dimensionFilter": {
-          "description": "Dimension Filter for the segment definition.",
-          "$ref": "SegmentDimensionFilter"
-        },
-        "metricFilter": {
-          "description": "Metric Filter for the segment definition.",
-          "$ref": "SegmentMetricFilter"
-        },
-        "not": {
-          "description": "Matches the complement (`!`) of the filter.",
-          "type": "boolean"
-        }
-      },
-      "id": "SegmentFilterClause"
-    },
-    "DimensionFilter": {
-      "description": "Dimension filter specifies the filtering options on a dimension.",
-      "type": "object",
-      "properties": {
-        "dimensionName": {
-          "description": "The dimension to filter on. A DimensionFilter must contain a dimension.",
-          "type": "string"
-        },
-        "operator": {
-          "description": "How to match the dimension to the expression. The default is REGEXP.",
-          "enum": [
-            "OPERATOR_UNSPECIFIED",
-            "REGEXP",
-            "BEGINS_WITH",
-            "ENDS_WITH",
-            "PARTIAL",
-            "EXACT",
-            "NUMERIC_EQUAL",
-            "NUMERIC_GREATER_THAN",
-            "NUMERIC_LESS_THAN",
-            "IN_LIST"
-          ],
-          "enumDescriptions": [
-            "If the match type is unspecified, it is treated as a `REGEXP`.",
-            "The match expression is treated as a regular expression. All match types\nare not treated as regular expressions.",
-            "Matches the value which begin with the match expression provided.",
-            "Matches the values which end with the match expression provided.",
-            "Substring match.",
-            "The value should match the match expression entirely.",
-            "Integer comparison filters.\ncase sensitivity is ignored for these and the expression\nis assumed to be a string representing an integer.\nFailure conditions:\n\n- If expression is not a valid int64, the client should expect\n  an error.\n- Input dimensions that are not valid int64 values will never match the\n  filter.",
-            "Checks if the dimension is numerically greater than the match\nexpression. Read the description for `NUMERIC_EQUALS` for restrictions.",
-            "Checks if the dimension is numerically less than the match expression.\nRead the description for `NUMERIC_EQUALS` for restrictions.",
-            "This option is used to specify a dimension filter whose expression can\ntake any value from a selected list of values. This helps avoiding\nevaluating multiple exact match dimension filters which are OR'ed for\nevery single response row. For example:\n\n    expressions: [\"A\", \"B\", \"C\"]\n\nAny response row whose dimension has it is value as A, B or C, matches\nthis DimensionFilter."
-          ],
-          "type": "string"
-        },
-        "caseSensitive": {
-          "description": "Should the match be case sensitive? Default is false.",
-          "type": "boolean"
-        },
-        "expressions": {
-          "description": "Strings or regular expression to match against. Only the first value of\nthe list is used for comparison unless the operator is `IN_LIST`.\nIf `IN_LIST` operator, then the entire list is used to filter the\ndimensions as explained in the description of the `IN_LIST` operator.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "not": {
-          "description": "Logical `NOT` operator. If this boolean is set to true, then the matching\ndimension values will be excluded in the report. The default is false.",
-          "type": "boolean"
-        }
-      },
-      "id": "DimensionFilter"
-    },
-    "SegmentDimensionFilter": {
-      "description": "Dimension filter specifies the filtering options on a dimension.",
-      "type": "object",
-      "properties": {
-        "maxComparisonValue": {
-          "description": "Maximum comparison values for `BETWEEN` match type.",
-          "type": "string"
-        },
-        "dimensionName": {
-          "description": "Name of the dimension for which the filter is being applied.",
-          "type": "string"
-        },
-        "caseSensitive": {
-          "description": "Should the match be case sensitive, ignored for `IN_LIST` operator.",
-          "type": "boolean"
-        },
-        "operator": {
-          "description": "The operator to use to match the dimension with the expressions.",
-          "enum": [
-            "OPERATOR_UNSPECIFIED",
-            "REGEXP",
-            "BEGINS_WITH",
-            "ENDS_WITH",
-            "PARTIAL",
-            "EXACT",
-            "IN_LIST",
-            "NUMERIC_LESS_THAN",
-            "NUMERIC_GREATER_THAN",
-            "NUMERIC_BETWEEN"
-          ],
-          "enumDescriptions": [
-            "If the match type is unspecified, it is treated as a REGEXP.",
-            "The match expression is treated as a regular expression. All other match\ntypes are not treated as regular expressions.",
-            "Matches the values which begin with the match expression provided.",
-            "Matches the values which end with the match expression provided.",
-            "Substring match.",
-            "The value should match the match expression entirely.",
-            "This option is used to specify a dimension filter whose expression can\ntake any value from a selected list of values. This helps avoiding\nevaluating multiple exact match dimension filters which are OR'ed for\nevery single response row. For example:\n\n    expressions: [\"A\", \"B\", \"C\"]\n\nAny response row whose dimension has it is value as A, B or C, matches\nthis DimensionFilter.",
-            "Integer comparison filters.\ncase sensitivity is ignored for these and the expression\nis assumed to be a string representing an integer.\nFailure conditions:\n\n- if expression is not a valid int64, the client should expect\n  an error.\n- input dimensions that are not valid int64 values will never match the\n  filter.\n\nChecks if the dimension is numerically less than the match expression.",
-            "Checks if the dimension is numerically greater than the match\nexpression.",
-            "Checks if the dimension is numerically between the minimum and maximum\nof the match expression, boundaries excluded."
-          ],
-          "type": "string"
-        },
-        "expressions": {
-          "description": "The list of expressions, only the first element is used for all operators",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "minComparisonValue": {
-          "description": "Minimum comparison values for `BETWEEN` match type.",
-          "type": "string"
-        }
-      },
-      "id": "SegmentDimensionFilter"
-    },
-    "ReportRequest": {
-      "description": "The main request class which specifies the Reporting API request.",
-      "type": "object",
-      "properties": {
-        "cohortGroup": {
-          "description": "Cohort group associated with this request. If there is a cohort group\nin the request the `ga:cohort` dimension must be present.\nEvery [ReportRequest](#ReportRequest) within a `batchGet` method must\ncontain the same `cohortGroup` definition.",
-          "$ref": "CohortGroup"
-        },
-        "dimensions": {
-          "description": "The dimensions requested.\nRequests can have a total of 7 dimensions.",
-          "type": "array",
-          "items": {
-            "$ref": "Dimension"
-          }
-        },
-        "metricFilterClauses": {
-          "description": "The metric filter clauses. They are logically combined with the `AND`\noperator.  Metric filters look at only the first date range and not the\ncomparing date range. Note that filtering on metrics occurs after the\nmetrics are aggregated.",
-          "type": "array",
-          "items": {
-            "$ref": "MetricFilterClause"
-          }
-        },
-        "hideTotals": {
-          "description": "If set to true, hides the total of all metrics for all the matching rows,\nfor every date range. The default false and will return the totals.",
-          "type": "boolean"
-        },
-        "includeEmptyRows": {
-          "description": "If set to false, the response does not include rows if all the retrieved\nmetrics are equal to zero. The default is false which will exclude these\nrows.",
-          "type": "boolean"
-        },
-        "dimensionFilterClauses": {
-          "description": "The dimension filter clauses for filtering Dimension Values. They are\nlogically combined with the `AND` operator. Note that filtering occurs\nbefore any dimensions are aggregated, so that the returned metrics\nrepresent the total for only the relevant dimensions.",
-          "type": "array",
-          "items": {
-            "$ref": "DimensionFilterClause"
-          }
-        },
-        "pivots": {
-          "description": "The pivot definitions. Requests can have a maximum of 2 pivots.",
-          "type": "array",
-          "items": {
-            "$ref": "Pivot"
-          }
-        },
-        "dateRanges": {
-          "description": "Date ranges in the request. The request can have a maximum of 2 date\nranges. The response will contain a set of metric values for each\ncombination of the dimensions for each date range in the request. So, if\nthere are two date ranges, there will be two set of metric values, one for\nthe original date range and one for the second date range.\nThe `reportRequest.dateRanges` field should not be specified for cohorts\nor Lifetime value requests.\nIf a date range is not provided, the default date range is (startDate:\ncurrent date - 7 days, endDate: current date - 1 day). Every\n[ReportRequest](#ReportRequest) within a `batchGet` method must\ncontain the same `dateRanges` definition.",
-          "type": "array",
-          "items": {
-            "$ref": "DateRange"
-          }
-        },
-        "segments": {
-          "description": "Segment the data returned for the request. A segment definition helps look\nat a subset of the segment request. A request can contain up to four\nsegments. Every [ReportRequest](#ReportRequest) within a\n`batchGet` method must contain the same `segments` definition. Requests\nwith segments must have the `ga:segment` dimension.",
-          "type": "array",
-          "items": {
-            "$ref": "Segment"
-          }
-        },
-        "samplingLevel": {
-          "description": "The desired report\n[sample](https://support.google.com/analytics/answer/2637192) size.\nIf the the `samplingLevel` field is unspecified the `DEFAULT` sampling\nlevel is used. Every [ReportRequest](#ReportRequest) within a\n`batchGet` method must contain the same `samplingLevel` definition. See\n[developer guide](/analytics/devguides/reporting/core/v4/basics#sampling)\n for details.",
-          "enum": [
-            "SAMPLING_UNSPECIFIED",
-            "DEFAULT",
-            "SMALL",
-            "LARGE"
-          ],
-          "enumDescriptions": [
-            "If the `samplingLevel` field is unspecified the `DEFAULT` sampling level\nis used.",
-            "Returns response with a sample size that balances speed and\naccuracy.",
-            "It returns a fast response with a smaller sampling size.",
-            "Returns a more accurate response using a large sampling size. But this\nmay result in response being slower."
-          ],
-          "type": "string"
-        },
-        "metrics": {
-          "description": "The metrics requested.\nRequests must specify at least one metric. Requests can have a\ntotal of 10 metrics.",
-          "type": "array",
-          "items": {
-            "$ref": "Metric"
-          }
-        },
-        "pageSize": {
-          "description": "Page size is for paging and specifies the maximum number of returned rows.\nPage size should be \u003e= 0. A query returns the default of 1,000 rows.\nThe Analytics Core Reporting API returns a maximum of 10,000 rows per\nrequest, no matter how many you ask for. It can also return fewer rows\nthan requested, if there aren't as many dimension segments as you expect.\nFor instance, there are fewer than 300 possible values for `ga:country`,\nso when segmenting only by country, you can't get more than 300 rows,\neven if you set `pageSize` to a higher value.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "orderBys": {
-          "description": "Sort order on output rows. To compare two rows, the elements of the\nfollowing are applied in order until a difference is found.  All date\nranges in the output get the same row order.",
-          "type": "array",
-          "items": {
-            "$ref": "OrderBy"
-          }
-        },
-        "filtersExpression": {
-          "description": "Dimension or metric filters that restrict the data returned for your\nrequest. To use the `filtersExpression`, supply a dimension or metric on\nwhich to filter, followed by the filter expression. For example, the\nfollowing expression selects `ga:browser` dimension which starts with\nFirefox; `ga:browser=~^Firefox`. For more information on dimensions\nand metric filters, see\n[Filters reference](https://developers.google.com/analytics/devguides/reporting/core/v3/reference#filters).",
-          "type": "string"
-        },
-        "hideValueRanges": {
-          "description": "If set to true, hides the minimum and maximum across all matching rows.\nThe default is false and the value ranges are returned.",
-          "type": "boolean"
-        },
-        "viewId": {
-          "description": "The Analytics\n[view ID](https://support.google.com/analytics/answer/1009618)\nfrom which to retrieve data. Every [ReportRequest](#ReportRequest)\nwithin a `batchGet` method must contain the same `viewId`.",
-          "type": "string"
-        },
-        "pageToken": {
-          "description": "A continuation token to get the next page of the results. Adding this to\nthe request will return the rows after the pageToken. The pageToken should\nbe the value returned in the nextPageToken parameter in the response to\nthe GetReports request.",
-          "type": "string"
-        }
-      },
-      "id": "ReportRequest"
-    },
-    "SimpleSegment": {
-      "description": "A Simple segment conditions consist of one or more dimension/metric\nconditions that can be combined.",
-      "type": "object",
-      "properties": {
-        "orFiltersForSegment": {
-          "description": "A list of segment filters groups which are combined with logical `AND`\noperator.",
-          "type": "array",
-          "items": {
-            "$ref": "OrFiltersForSegment"
-          }
-        }
-      },
-      "id": "SimpleSegment"
-    },
-    "SegmentDefinition": {
-      "description": "SegmentDefinition defines the segment to be a set of SegmentFilters which\nare combined together with a logical `AND` operation.",
-      "type": "object",
-      "properties": {
-        "segmentFilters": {
-          "description": "A segment is defined by a set of segment filters which are combined\ntogether with a logical `AND` operation.",
-          "type": "array",
-          "items": {
-            "$ref": "SegmentFilter"
-          }
-        }
-      },
-      "id": "SegmentDefinition"
-    },
     "SegmentMetricFilter": {
       "description": "Metric filter to be used in a segment filter clause.",
       "type": "object",
       "properties": {
-        "metricName": {
-          "description": "The metric that will be filtered on. A `metricFilter` must contain a\nmetric name.",
+        "comparisonValue": {
+          "description": "The value to compare against. If the operator is `BETWEEN`, this value is\ntreated as minimum comparison value.",
           "type": "string"
         },
         "operator": {
-          "description": "Specifies is the operation to perform to compare the metric. The default\nis `EQUAL`.",
           "enum": [
             "UNSPECIFIED_OPERATOR",
             "LESS_THAN",
@@ -460,21 +21,21 @@
             "EQUAL",
             "BETWEEN"
           ],
+          "description": "Specifies is the operation to perform to compare the metric. The default\nis `EQUAL`.",
+          "type": "string",
           "enumDescriptions": [
             "Unspecified operator is treated as `LESS_THAN` operator.",
             "Checks if the metric value is less than comparison value.",
             "Checks if the metric value is greater than comparison value.",
             "Equals operator.",
             "For between operator, both the minimum and maximum are exclusive.\nWe will use `LT` and `GT` for comparison."
-          ],
-          "type": "string"
+          ]
         },
-        "comparisonValue": {
-          "description": "The value to compare against. If the operator is `BETWEEN`, this value is\ntreated as minimum comparison value.",
-          "type": "string"
+        "metricName": {
+          "type": "string",
+          "description": "The metric that will be filtered on. A `metricFilter` must contain a\nmetric name."
         },
         "scope": {
-          "description": "Scope for a metric defines the level at which that metric is defined.  The\nspecified metric scope must be equal to or greater than its primary scope\nas defined in the data model. The primary scope is defined by if the\nsegment is selecting users or sessions.",
           "enum": [
             "UNSPECIFIED_SCOPE",
             "PRODUCT",
@@ -482,343 +43,23 @@
             "SESSION",
             "USER"
           ],
+          "description": "Scope for a metric defines the level at which that metric is defined.  The\nspecified metric scope must be equal to or greater than its primary scope\nas defined in the data model. The primary scope is defined by if the\nsegment is selecting users or sessions.",
+          "type": "string",
           "enumDescriptions": [
             "If the scope is unspecified, it defaults to the condition scope,\n`USER` or `SESSION` depending on if the segment is trying to choose\nusers or sessions.",
             "Product scope.",
             "Hit scope.",
             "Session scope.",
             "User scope."
-          ],
-          "type": "string"
+          ]
         },
         "maxComparisonValue": {
-          "description": "Max comparison value is only used for `BETWEEN` operator.",
-          "type": "string"
+          "type": "string",
+          "description": "Max comparison value is only used for `BETWEEN` operator."
         }
       },
       "id": "SegmentMetricFilter"
     },
-    "ReportData": {
-      "description": "The data part of the report.",
-      "type": "object",
-      "properties": {
-        "rowCount": {
-          "description": "Total number of matching rows for this query.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "samplingSpaceSizes": {
-          "description": "If the results are\n[sampled](https://support.google.com/analytics/answer/2637192),\nthis returns the total number of\nsamples present, one entry per date range. If the results are not sampled\nthis field will not be defined. See\n[developer guide](/analytics/devguides/reporting/core/v4/basics#sampling)\nfor details.",
-          "type": "array",
-          "items": {
-            "type": "string",
-            "format": "int64"
-          }
-        },
-        "maximums": {
-          "description": "Minimum and maximum values seen over all matching rows. These are both\nempty when `hideValueRanges` in the request is false, or when\nrowCount is zero.",
-          "type": "array",
-          "items": {
-            "$ref": "DateRangeValues"
-          }
-        },
-        "samplesReadCounts": {
-          "description": "If the results are\n[sampled](https://support.google.com/analytics/answer/2637192),\nthis returns the total number of samples read, one entry per date range.\nIf the results are not sampled this field will not be defined. See\n[developer guide](/analytics/devguides/reporting/core/v4/basics#sampling)\nfor details.",
-          "type": "array",
-          "items": {
-            "type": "string",
-            "format": "int64"
-          }
-        },
-        "minimums": {
-          "description": "Minimum and maximum values seen over all matching rows. These are both\nempty when `hideValueRanges` in the request is false, or when\nrowCount is zero.",
-          "type": "array",
-          "items": {
-            "$ref": "DateRangeValues"
-          }
-        },
-        "rows": {
-          "description": "There's one ReportRow for every unique combination of dimensions.",
-          "type": "array",
-          "items": {
-            "$ref": "ReportRow"
-          }
-        },
-        "dataLastRefreshed": {
-          "description": "The last time the data in the report was refreshed. All the hits received\nbefore this timestamp are included in the calculation of the report.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "totals": {
-          "description": "For each requested date range, for the set of all rows that match\nthe query, every requested value format gets a total. The total\nfor a value format is computed by first totaling the metrics\nmentioned in the value format and then evaluating the value\nformat as a scalar expression.  E.g., The \"totals\" for\n`3 / (ga:sessions + 2)` we compute\n`3 / ((sum of all relevant ga:sessions) + 2)`.\nTotals are computed before pagination.",
-          "type": "array",
-          "items": {
-            "$ref": "DateRangeValues"
-          }
-        },
-        "isDataGolden": {
-          "description": "Indicates if response to this request is golden or not. Data is\ngolden when the exact same request will not produce any new results if\nasked at a later point in time.",
-          "type": "boolean"
-        }
-      },
-      "id": "ReportData"
-    },
-    "GetReportsRequest": {
-      "description": "The batch request containing multiple report request.",
-      "type": "object",
-      "properties": {
-        "reportRequests": {
-          "description": "Requests, each request will have a separate response.\nThere can be a maximum of 5 requests. All requests should have the same\n`dateRanges`, `viewId`, `segments`, `samplingLevel`, and `cohortGroup`.",
-          "type": "array",
-          "items": {
-            "$ref": "ReportRequest"
-          }
-        }
-      },
-      "id": "GetReportsRequest"
-    },
-    "OrderBy": {
-      "description": "Specifies the sorting options.",
-      "type": "object",
-      "properties": {
-        "sortOrder": {
-          "description": "The sorting order for the field.",
-          "enum": [
-            "SORT_ORDER_UNSPECIFIED",
-            "ASCENDING",
-            "DESCENDING"
-          ],
-          "enumDescriptions": [
-            "If the sort order is unspecified, the default is ascending.",
-            "Ascending sort. The field will be sorted in an ascending manner.",
-            "Descending sort. The field will be sorted in a descending manner."
-          ],
-          "type": "string"
-        },
-        "orderType": {
-          "description": "The order type. The default orderType is `VALUE`.",
-          "enum": [
-            "ORDER_TYPE_UNSPECIFIED",
-            "VALUE",
-            "DELTA",
-            "SMART",
-            "HISTOGRAM_BUCKET",
-            "DIMENSION_AS_INTEGER"
-          ],
-          "enumDescriptions": [
-            "Unspecified order type will be treated as sort based on value.",
-            "The sort order is based on the value of the chosen column; looks only at\nthe first date range.",
-            "The sort order is based on the difference of the values of the chosen\ncolumn between the first two date ranges.  Usable only if there are\nexactly two date ranges.",
-            "The sort order is based on weighted value of the chosen column.  If\ncolumn has n/d format, then weighted value of this ratio will\nbe `(n + totals.n)/(d + totals.d)` Usable only for metrics that\nrepresent ratios.",
-            "Histogram order type is applicable only to dimension columns with\nnon-empty histogram-buckets.",
-            "If the dimensions are fixed length numbers, ordinary sort would just\nwork fine. `DIMENSION_AS_INTEGER` can be used if the dimensions are\nvariable length numbers."
-          ],
-          "type": "string"
-        },
-        "fieldName": {
-          "description": "The field which to sort by. The default sort order is ascending. Example:\n`ga:browser`.\nNote, that you can only specify one field for sort here. For example,\n`ga:browser, ga:city` is not valid.",
-          "type": "string"
-        }
-      },
-      "id": "OrderBy"
-    },
-    "Cohort": {
-      "description": "Defines a cohort. A cohort is a group of users who share a common\ncharacteristic. For example, all users with the same acquisition date\nbelong to the same cohort.",
-      "type": "object",
-      "properties": {
-        "type": {
-          "description": "Type of the cohort. The only supported type as of now is\n`FIRST_VISIT_DATE`. If this field is unspecified the cohort is treated\nas `FIRST_VISIT_DATE` type cohort.",
-          "enum": [
-            "UNSPECIFIED_COHORT_TYPE",
-            "FIRST_VISIT_DATE"
-          ],
-          "enumDescriptions": [
-            "If unspecified it's treated as `FIRST_VISIT_DATE`.",
-            "Cohorts that are selected based on first visit date."
-          ],
-          "type": "string"
-        },
-        "dateRange": {
-          "description": "This is used for `FIRST_VISIT_DATE` cohort, the cohort selects users\nwhose first visit date is between start date and end date defined in the\nDateRange. The date ranges should be aligned for cohort requests. If the\nrequest contains `ga:cohortNthDay` it should be exactly one day long,\nif `ga:cohortNthWeek` it should be aligned to the week boundary (starting\nat Sunday and ending Saturday), and for `ga:cohortNthMonth` the date range\nshould be aligned to the month (starting at the first and ending on the\nlast day of the month).\nFor LTV requests there are no such restrictions.\nYou do not need to supply a date range for the\n`reportsRequest.dateRanges` field.",
-          "$ref": "DateRange"
-        },
-        "name": {
-          "description": "A unique name for the cohort. If not defined name will be auto-generated\nwith values cohort_[1234...].",
-          "type": "string"
-        }
-      },
-      "id": "Cohort"
-    },
-    "OrFiltersForSegment": {
-      "description": "A list of segment filters in the `OR` group are combined with the logical OR\noperator.",
-      "type": "object",
-      "properties": {
-        "segmentFilterClauses": {
-          "description": "List of segment filters to be combined with a `OR` operator.",
-          "type": "array",
-          "items": {
-            "$ref": "SegmentFilterClause"
-          }
-        }
-      },
-      "id": "OrFiltersForSegment"
-    },
-    "SequenceSegment": {
-      "description": "Sequence conditions consist of one or more steps, where each step is defined\nby one or more dimension/metric conditions. Multiple steps can be combined\nwith special sequence operators.",
-      "type": "object",
-      "properties": {
-        "firstStepShouldMatchFirstHit": {
-          "description": "If set, first step condition must match the first hit of the visitor (in\nthe date range).",
-          "type": "boolean"
-        },
-        "segmentSequenceSteps": {
-          "description": "The list of steps in the sequence.",
-          "type": "array",
-          "items": {
-            "$ref": "SegmentSequenceStep"
-          }
-        }
-      },
-      "id": "SequenceSegment"
-    },
-    "SegmentFilter": {
-      "description": "SegmentFilter defines the segment to be either a simple or a sequence\nsegment. A simple segment condition contains dimension and metric conditions\nto select the sessions or users. A sequence segment condition can be used to\nselect users or sessions based on sequential conditions.",
-      "type": "object",
-      "properties": {
-        "sequenceSegment": {
-          "description": "Sequence conditions consist of one or more steps, where each step is\ndefined by one or more dimension/metric conditions. Multiple steps can\nbe combined with special sequence operators.",
-          "$ref": "SequenceSegment"
-        },
-        "not": {
-          "description": "If true, match the complement of simple or sequence segment.\nFor example, to match all visits not from \"New York\", we can define the\nsegment as follows:\n\n      \"sessionSegment\": {\n        \"segmentFilters\": [{\n          \"simpleSegment\" :{\n            \"orFiltersForSegment\": [{\n              \"segmentFilterClauses\":[{\n                \"dimensionFilter\": {\n                  \"dimensionName\": \"ga:city\",\n                  \"expressions\": [\"New York\"]\n                }\n              }]\n            }]\n          },\n          \"not\": \"True\"\n        }]\n      },",
-          "type": "boolean"
-        },
-        "simpleSegment": {
-          "description": "A Simple segment conditions consist of one or more dimension/metric\nconditions that can be combined",
-          "$ref": "SimpleSegment"
-        }
-      },
-      "id": "SegmentFilter"
-    },
-    "PivotHeaderEntry": {
-      "description": "The headers for the each of the metric column corresponding to the metrics\nrequested in the pivots section of the response.",
-      "type": "object",
-      "properties": {
-        "dimensionNames": {
-          "description": "The name of the dimensions in the pivot response.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "dimensionValues": {
-          "description": "The values for the dimensions in the pivot.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "metric": {
-          "description": "The metric header for the metric in the pivot.",
-          "$ref": "MetricHeaderEntry"
-        }
-      },
-      "id": "PivotHeaderEntry"
-    },
-    "DimensionFilterClause": {
-      "description": "A group of dimension filters. Set the operator value to specify how\nthe filters are logically combined.",
-      "type": "object",
-      "properties": {
-        "operator": {
-          "description": "The operator for combining multiple dimension filters. If unspecified, it\nis treated as an `OR`.",
-          "enum": [
-            "OPERATOR_UNSPECIFIED",
-            "OR",
-            "AND"
-          ],
-          "enumDescriptions": [
-            "Unspecified operator. It is treated as an `OR`.",
-            "The logical `OR` operator.",
-            "The logical `AND` operator."
-          ],
-          "type": "string"
-        },
-        "filters": {
-          "description": "The repeated set of filters. They are logically combined based on the\noperator specified.",
-          "type": "array",
-          "items": {
-            "$ref": "DimensionFilter"
-          }
-        }
-      },
-      "id": "DimensionFilterClause"
-    },
-    "SegmentSequenceStep": {
-      "description": "A segment sequence definition.",
-      "type": "object",
-      "properties": {
-        "matchType": {
-          "description": "Specifies if the step immediately precedes or can be any time before the\nnext step.",
-          "enum": [
-            "UNSPECIFIED_MATCH_TYPE",
-            "PRECEDES",
-            "IMMEDIATELY_PRECEDES"
-          ],
-          "enumDescriptions": [
-            "Unspecified match type is treated as precedes.",
-            "Operator indicates that the previous step precedes the next step.",
-            "Operator indicates that the previous step immediately precedes the next\nstep."
-          ],
-          "type": "string"
-        },
-        "orFiltersForSegment": {
-          "description": "A sequence is specified with a list of Or grouped filters which are\ncombined with `AND` operator.",
-          "type": "array",
-          "items": {
-            "$ref": "OrFiltersForSegment"
-          }
-        }
-      },
-      "id": "SegmentSequenceStep"
-    },
-    "Pivot": {
-      "description": "The Pivot describes the pivot section in the request.\nThe Pivot helps rearrange the information in the table for certain reports\nby pivoting your data on a second dimension.",
-      "type": "object",
-      "properties": {
-        "dimensions": {
-          "description": "A list of dimensions to show as pivot columns. A Pivot can have a maximum\nof 4 dimensions. Pivot dimensions are part of the restriction on the\ntotal number of dimensions allowed in the request.",
-          "type": "array",
-          "items": {
-            "$ref": "Dimension"
-          }
-        },
-        "metrics": {
-          "description": "The pivot metrics. Pivot metrics are part of the\nrestriction on total number of metrics allowed in the request.",
-          "type": "array",
-          "items": {
-            "$ref": "Metric"
-          }
-        },
-        "maxGroupCount": {
-          "description": "Specifies the maximum number of groups to return.\nThe default value is 10, also the maximum value is 1,000.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "dimensionFilterClauses": {
-          "description": "DimensionFilterClauses are logically combined with an `AND` operator: only\ndata that is included by all these DimensionFilterClauses contributes to\nthe values in this pivot region. Dimension filters can be used to restrict\nthe columns shown in the pivot region. For example if you have\n`ga:browser` as the requested dimension in the pivot region, and you\nspecify key filters to restrict `ga:browser` to only \"IE\" or \"Firefox\",\nthen only those two browsers would show up as columns.",
-          "type": "array",
-          "items": {
-            "$ref": "DimensionFilterClause"
-          }
-        },
-        "startGroup": {
-          "description": "If k metrics were requested, then the response will contain some\ndata-dependent multiple of k columns in the report.  E.g., if you pivoted\non the dimension `ga:browser` then you'd get k columns for \"Firefox\", k\ncolumns for \"IE\", k columns for \"Chrome\", etc. The ordering of the groups\nof columns is determined by descending order of \"total\" for the first of\nthe k values.  Ties are broken by lexicographic ordering of the first\npivot dimension, then lexicographic ordering of the second pivot\ndimension, and so on.  E.g., if the totals for the first value for\nFirefox, IE, and Chrome were 8, 2, 8, respectively, the order of columns\nwould be Chrome, Firefox, IE.\n\nThe following let you choose which of the groups of k columns are\nincluded in the response.",
-          "type": "integer",
-          "format": "int32"
-        }
-      },
-      "id": "Pivot"
-    },
     "DateRangeValues": {
       "description": "Used to return a list of metrics for a single DateRange / dimension\ncombination",
       "type": "object",
@@ -840,33 +81,386 @@
       },
       "id": "DateRangeValues"
     },
-    "MetricFilterClause": {
-      "description": "Represents a group of metric filters.\nSet the operator value to specify how the filters are logically combined.",
-      "type": "object",
+    "CohortGroup": {
       "properties": {
-        "operator": {
-          "description": "The operator for combining multiple metric filters. If unspecified, it is\ntreated as an `OR`.",
-          "enum": [
-            "OPERATOR_UNSPECIFIED",
-            "OR",
-            "AND"
-          ],
-          "enumDescriptions": [
-            "Unspecified operator. It is treated as an `OR`.",
-            "The logical `OR` operator.",
-            "The logical `AND` operator."
-          ],
-          "type": "string"
+        "lifetimeValue": {
+          "description": "Enable Life Time Value (LTV).  LTV measures lifetime value for users\nacquired through different channels.\nPlease see:\n[Cohort Analysis](https://support.google.com/analytics/answer/6074676) and\n[Lifetime Value](https://support.google.com/analytics/answer/6182550)\nIf the value of lifetimeValue is false:\n\n- The metric values are similar to the values in the web interface cohort\n  report.\n- The cohort definition date ranges must be aligned to the calendar week\n  and month. i.e. while requesting `ga:cohortNthWeek` the `startDate` in\n  the cohort definition should be a Sunday and the `endDate` should be the\n  following Saturday, and for `ga:cohortNthMonth`, the `startDate`\n  should be the 1st of the month and `endDate` should be the last day\n  of the month.\n\nWhen the lifetimeValue is true:\n\n- The metric values will correspond to the values in the web interface\n  LifeTime value report.\n- The Lifetime Value report shows you how user value (Revenue) and\n  engagement (Appviews, Goal Completions, Sessions, and Session Duration)\n  grow during the 90 days after a user is acquired.\n- The metrics are calculated as a cumulative average per user per the time\n  increment.\n- The cohort definition date ranges need not be aligned to the calendar\n  week and month boundaries.\n- The `viewId` must be an\n  [app view ID](https://support.google.com/analytics/answer/2649553#WebVersusAppViews)",
+          "type": "boolean"
         },
-        "filters": {
-          "description": "The repeated set of filters. They are logically combined based on the\noperator specified.",
+        "cohorts": {
+          "description": "The definition for the cohort.",
           "type": "array",
           "items": {
-            "$ref": "MetricFilter"
+            "$ref": "Cohort"
           }
         }
       },
-      "id": "MetricFilterClause"
+      "id": "CohortGroup",
+      "description": "Defines a cohort group.\nFor example:\n\n    \"cohortGroup\": {\n      \"cohorts\": [{\n        \"name\": \"cohort 1\",\n        \"type\": \"FIRST_VISIT_DATE\",\n        \"dateRange\": { \"startDate\": \"2015-08-01\", \"endDate\": \"2015-08-01\" }\n      },{\n        \"name\": \"cohort 2\"\n         \"type\": \"FIRST_VISIT_DATE\"\n         \"dateRange\": { \"startDate\": \"2015-07-01\", \"endDate\": \"2015-07-01\" }\n      }]\n    }",
+      "type": "object"
+    },
+    "GetReportsRequest": {
+      "properties": {
+        "reportRequests": {
+          "description": "Requests, each request will have a separate response.\nThere can be a maximum of 5 requests. All requests should have the same\n`dateRanges`, `viewId`, `segments`, `samplingLevel`, and `cohortGroup`.",
+          "type": "array",
+          "items": {
+            "$ref": "ReportRequest"
+          }
+        }
+      },
+      "id": "GetReportsRequest",
+      "description": "The batch request containing multiple report request.",
+      "type": "object"
+    },
+    "Pivot": {
+      "description": "The Pivot describes the pivot section in the request.\nThe Pivot helps rearrange the information in the table for certain reports\nby pivoting your data on a second dimension.",
+      "type": "object",
+      "properties": {
+        "maxGroupCount": {
+          "description": "Specifies the maximum number of groups to return.\nThe default value is 10, also the maximum value is 1,000.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "startGroup": {
+          "description": "If k metrics were requested, then the response will contain some\ndata-dependent multiple of k columns in the report.  E.g., if you pivoted\non the dimension `ga:browser` then you'd get k columns for \"Firefox\", k\ncolumns for \"IE\", k columns for \"Chrome\", etc. The ordering of the groups\nof columns is determined by descending order of \"total\" for the first of\nthe k values.  Ties are broken by lexicographic ordering of the first\npivot dimension, then lexicographic ordering of the second pivot\ndimension, and so on.  E.g., if the totals for the first value for\nFirefox, IE, and Chrome were 8, 2, 8, respectively, the order of columns\nwould be Chrome, Firefox, IE.\n\nThe following let you choose which of the groups of k columns are\nincluded in the response.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "metrics": {
+          "description": "The pivot metrics. Pivot metrics are part of the\nrestriction on total number of metrics allowed in the request.",
+          "type": "array",
+          "items": {
+            "$ref": "Metric"
+          }
+        },
+        "dimensions": {
+          "type": "array",
+          "items": {
+            "$ref": "Dimension"
+          },
+          "description": "A list of dimensions to show as pivot columns. A Pivot can have a maximum\nof 4 dimensions. Pivot dimensions are part of the restriction on the\ntotal number of dimensions allowed in the request."
+        },
+        "dimensionFilterClauses": {
+          "description": "DimensionFilterClauses are logically combined with an `AND` operator: only\ndata that is included by all these DimensionFilterClauses contributes to\nthe values in this pivot region. Dimension filters can be used to restrict\nthe columns shown in the pivot region. For example if you have\n`ga:browser` as the requested dimension in the pivot region, and you\nspecify key filters to restrict `ga:browser` to only \"IE\" or \"Firefox\",\nthen only those two browsers would show up as columns.",
+          "type": "array",
+          "items": {
+            "$ref": "DimensionFilterClause"
+          }
+        }
+      },
+      "id": "Pivot"
+    },
+    "PivotHeaderEntry": {
+      "description": "The headers for the each of the metric column corresponding to the metrics\nrequested in the pivots section of the response.",
+      "type": "object",
+      "properties": {
+        "dimensionValues": {
+          "description": "The values for the dimensions in the pivot.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "dimensionNames": {
+          "description": "The name of the dimensions in the pivot response.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "metric": {
+          "$ref": "MetricHeaderEntry",
+          "description": "The metric header for the metric in the pivot."
+        }
+      },
+      "id": "PivotHeaderEntry"
+    },
+    "SegmentFilter": {
+      "description": "SegmentFilter defines the segment to be either a simple or a sequence\nsegment. A simple segment condition contains dimension and metric conditions\nto select the sessions or users. A sequence segment condition can be used to\nselect users or sessions based on sequential conditions.",
+      "type": "object",
+      "properties": {
+        "sequenceSegment": {
+          "description": "Sequence conditions consist of one or more steps, where each step is\ndefined by one or more dimension/metric conditions. Multiple steps can\nbe combined with special sequence operators.",
+          "$ref": "SequenceSegment"
+        },
+        "not": {
+          "description": "If true, match the complement of simple or sequence segment.\nFor example, to match all visits not from \"New York\", we can define the\nsegment as follows:\n\n      \"sessionSegment\": {\n        \"segmentFilters\": [{\n          \"simpleSegment\" :{\n            \"orFiltersForSegment\": [{\n              \"segmentFilterClauses\":[{\n                \"dimensionFilter\": {\n                  \"dimensionName\": \"ga:city\",\n                  \"expressions\": [\"New York\"]\n                }\n              }]\n            }]\n          },\n          \"not\": \"True\"\n        }]\n      },",
+          "type": "boolean"
+        },
+        "simpleSegment": {
+          "$ref": "SimpleSegment",
+          "description": "A Simple segment conditions consist of one or more dimension/metric\nconditions that can be combined"
+        }
+      },
+      "id": "SegmentFilter"
+    },
+    "SegmentDefinition": {
+      "properties": {
+        "segmentFilters": {
+          "description": "A segment is defined by a set of segment filters which are combined\ntogether with a logical `AND` operation.",
+          "type": "array",
+          "items": {
+            "$ref": "SegmentFilter"
+          }
+        }
+      },
+      "id": "SegmentDefinition",
+      "description": "SegmentDefinition defines the segment to be a set of SegmentFilters which\nare combined together with a logical `AND` operation.",
+      "type": "object"
+    },
+    "MetricHeaderEntry": {
+      "description": "Header for the metrics.",
+      "type": "object",
+      "properties": {
+        "type": {
+          "enumDescriptions": [
+            "Metric type is unspecified.",
+            "Integer metric.",
+            "Float metric.",
+            "Currency metric.",
+            "Percentage metric.",
+            "Time metric in `HH:MM:SS` format."
+          ],
+          "enum": [
+            "METRIC_TYPE_UNSPECIFIED",
+            "INTEGER",
+            "FLOAT",
+            "CURRENCY",
+            "PERCENT",
+            "TIME"
+          ],
+          "description": "The type of the metric, for example `INTEGER`.",
+          "type": "string"
+        },
+        "name": {
+          "type": "string",
+          "description": "The name of the header."
+        }
+      },
+      "id": "MetricHeaderEntry"
+    },
+    "ReportData": {
+      "description": "The data part of the report.",
+      "type": "object",
+      "properties": {
+        "minimums": {
+          "type": "array",
+          "items": {
+            "$ref": "DateRangeValues"
+          },
+          "description": "Minimum and maximum values seen over all matching rows. These are both\nempty when `hideValueRanges` in the request is false, or when\nrowCount is zero."
+        },
+        "samplingSpaceSizes": {
+          "description": "If the results are\n[sampled](https://support.google.com/analytics/answer/2637192),\nthis returns the total number of\nsamples present, one entry per date range. If the results are not sampled\nthis field will not be defined. See\n[developer guide](/analytics/devguides/reporting/core/v4/basics#sampling)\nfor details.",
+          "type": "array",
+          "items": {
+            "type": "string",
+            "format": "int64"
+          }
+        },
+        "totals": {
+          "description": "For each requested date range, for the set of all rows that match\nthe query, every requested value format gets a total. The total\nfor a value format is computed by first totaling the metrics\nmentioned in the value format and then evaluating the value\nformat as a scalar expression.  E.g., The \"totals\" for\n`3 / (ga:sessions + 2)` we compute\n`3 / ((sum of all relevant ga:sessions) + 2)`.\nTotals are computed before pagination.",
+          "type": "array",
+          "items": {
+            "$ref": "DateRangeValues"
+          }
+        },
+        "samplesReadCounts": {
+          "description": "If the results are\n[sampled](https://support.google.com/analytics/answer/2637192),\nthis returns the total number of samples read, one entry per date range.\nIf the results are not sampled this field will not be defined. See\n[developer guide](/analytics/devguides/reporting/core/v4/basics#sampling)\nfor details.",
+          "type": "array",
+          "items": {
+            "format": "int64",
+            "type": "string"
+          }
+        },
+        "isDataGolden": {
+          "description": "Indicates if response to this request is golden or not. Data is\ngolden when the exact same request will not produce any new results if\nasked at a later point in time.",
+          "type": "boolean"
+        },
+        "rows": {
+          "type": "array",
+          "items": {
+            "$ref": "ReportRow"
+          },
+          "description": "There's one ReportRow for every unique combination of dimensions."
+        },
+        "rowCount": {
+          "description": "Total number of matching rows for this query.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "dataLastRefreshed": {
+          "type": "string",
+          "description": "The last time the data in the report was refreshed. All the hits received\nbefore this timestamp are included in the calculation of the report.",
+          "format": "google-datetime"
+        },
+        "maximums": {
+          "description": "Minimum and maximum values seen over all matching rows. These are both\nempty when `hideValueRanges` in the request is false, or when\nrowCount is zero.",
+          "type": "array",
+          "items": {
+            "$ref": "DateRangeValues"
+          }
+        }
+      },
+      "id": "ReportData"
+    },
+    "DimensionFilter": {
+      "type": "object",
+      "properties": {
+        "not": {
+          "description": "Logical `NOT` operator. If this boolean is set to true, then the matching\ndimension values will be excluded in the report. The default is false.",
+          "type": "boolean"
+        },
+        "expressions": {
+          "description": "Strings or regular expression to match against. Only the first value of\nthe list is used for comparison unless the operator is `IN_LIST`.\nIf `IN_LIST` operator, then the entire list is used to filter the\ndimensions as explained in the description of the `IN_LIST` operator.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "caseSensitive": {
+          "description": "Should the match be case sensitive? Default is false.",
+          "type": "boolean"
+        },
+        "dimensionName": {
+          "description": "The dimension to filter on. A DimensionFilter must contain a dimension.",
+          "type": "string"
+        },
+        "operator": {
+          "enumDescriptions": [
+            "If the match type is unspecified, it is treated as a `REGEXP`.",
+            "The match expression is treated as a regular expression. All match types\nare not treated as regular expressions.",
+            "Matches the value which begin with the match expression provided.",
+            "Matches the values which end with the match expression provided.",
+            "Substring match.",
+            "The value should match the match expression entirely.",
+            "Integer comparison filters.\ncase sensitivity is ignored for these and the expression\nis assumed to be a string representing an integer.\nFailure conditions:\n\n- If expression is not a valid int64, the client should expect\n  an error.\n- Input dimensions that are not valid int64 values will never match the\n  filter.",
+            "Checks if the dimension is numerically greater than the match\nexpression. Read the description for `NUMERIC_EQUALS` for restrictions.",
+            "Checks if the dimension is numerically less than the match expression.\nRead the description for `NUMERIC_EQUALS` for restrictions.",
+            "This option is used to specify a dimension filter whose expression can\ntake any value from a selected list of values. This helps avoiding\nevaluating multiple exact match dimension filters which are OR'ed for\nevery single response row. For example:\n\n    expressions: [\"A\", \"B\", \"C\"]\n\nAny response row whose dimension has it is value as A, B or C, matches\nthis DimensionFilter."
+          ],
+          "enum": [
+            "OPERATOR_UNSPECIFIED",
+            "REGEXP",
+            "BEGINS_WITH",
+            "ENDS_WITH",
+            "PARTIAL",
+            "EXACT",
+            "NUMERIC_EQUAL",
+            "NUMERIC_GREATER_THAN",
+            "NUMERIC_LESS_THAN",
+            "IN_LIST"
+          ],
+          "description": "How to match the dimension to the expression. The default is REGEXP.",
+          "type": "string"
+        }
+      },
+      "id": "DimensionFilter",
+      "description": "Dimension filter specifies the filtering options on a dimension."
+    },
+    "SegmentDimensionFilter": {
+      "type": "object",
+      "properties": {
+        "caseSensitive": {
+          "description": "Should the match be case sensitive, ignored for `IN_LIST` operator.",
+          "type": "boolean"
+        },
+        "minComparisonValue": {
+          "description": "Minimum comparison values for `BETWEEN` match type.",
+          "type": "string"
+        },
+        "maxComparisonValue": {
+          "description": "Maximum comparison values for `BETWEEN` match type.",
+          "type": "string"
+        },
+        "dimensionName": {
+          "description": "Name of the dimension for which the filter is being applied.",
+          "type": "string"
+        },
+        "operator": {
+          "enumDescriptions": [
+            "If the match type is unspecified, it is treated as a REGEXP.",
+            "The match expression is treated as a regular expression. All other match\ntypes are not treated as regular expressions.",
+            "Matches the values which begin with the match expression provided.",
+            "Matches the values which end with the match expression provided.",
+            "Substring match.",
+            "The value should match the match expression entirely.",
+            "This option is used to specify a dimension filter whose expression can\ntake any value from a selected list of values. This helps avoiding\nevaluating multiple exact match dimension filters which are OR'ed for\nevery single response row. For example:\n\n    expressions: [\"A\", \"B\", \"C\"]\n\nAny response row whose dimension has it is value as A, B or C, matches\nthis DimensionFilter.",
+            "Integer comparison filters.\ncase sensitivity is ignored for these and the expression\nis assumed to be a string representing an integer.\nFailure conditions:\n\n- if expression is not a valid int64, the client should expect\n  an error.\n- input dimensions that are not valid int64 values will never match the\n  filter.\n\nChecks if the dimension is numerically less than the match expression.",
+            "Checks if the dimension is numerically greater than the match\nexpression.",
+            "Checks if the dimension is numerically between the minimum and maximum\nof the match expression, boundaries excluded."
+          ],
+          "enum": [
+            "OPERATOR_UNSPECIFIED",
+            "REGEXP",
+            "BEGINS_WITH",
+            "ENDS_WITH",
+            "PARTIAL",
+            "EXACT",
+            "IN_LIST",
+            "NUMERIC_LESS_THAN",
+            "NUMERIC_GREATER_THAN",
+            "NUMERIC_BETWEEN"
+          ],
+          "description": "The operator to use to match the dimension with the expressions.",
+          "type": "string"
+        },
+        "expressions": {
+          "description": "The list of expressions, only the first element is used for all operators",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "SegmentDimensionFilter",
+      "description": "Dimension filter specifies the filtering options on a dimension."
+    },
+    "OrderBy": {
+      "description": "Specifies the sorting options.",
+      "type": "object",
+      "properties": {
+        "fieldName": {
+          "description": "The field which to sort by. The default sort order is ascending. Example:\n`ga:browser`.\nNote, that you can only specify one field for sort here. For example,\n`ga:browser, ga:city` is not valid.",
+          "type": "string"
+        },
+        "orderType": {
+          "enum": [
+            "ORDER_TYPE_UNSPECIFIED",
+            "VALUE",
+            "DELTA",
+            "SMART",
+            "HISTOGRAM_BUCKET",
+            "DIMENSION_AS_INTEGER"
+          ],
+          "description": "The order type. The default orderType is `VALUE`.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified order type will be treated as sort based on value.",
+            "The sort order is based on the value of the chosen column; looks only at\nthe first date range.",
+            "The sort order is based on the difference of the values of the chosen\ncolumn between the first two date ranges.  Usable only if there are\nexactly two date ranges.",
+            "The sort order is based on weighted value of the chosen column.  If\ncolumn has n/d format, then weighted value of this ratio will\nbe `(n + totals.n)/(d + totals.d)` Usable only for metrics that\nrepresent ratios.",
+            "Histogram order type is applicable only to dimension columns with\nnon-empty histogram-buckets.",
+            "If the dimensions are fixed length numbers, ordinary sort would just\nwork fine. `DIMENSION_AS_INTEGER` can be used if the dimensions are\nvariable length numbers."
+          ]
+        },
+        "sortOrder": {
+          "description": "The sorting order for the field.",
+          "type": "string",
+          "enumDescriptions": [
+            "If the sort order is unspecified, the default is ascending.",
+            "Ascending sort. The field will be sorted in an ascending manner.",
+            "Descending sort. The field will be sorted in a descending manner."
+          ],
+          "enum": [
+            "SORT_ORDER_UNSPECIFIED",
+            "ASCENDING",
+            "DESCENDING"
+          ]
+        }
+      },
+      "id": "OrderBy"
     },
     "Segment": {
       "description": "The segment definition, if the report needs to be segmented.\nA Segment is a subset of the Analytics data. For example, of the entire\nset of users, one Segment might be users from a particular country or city.",
@@ -883,24 +477,430 @@
       },
       "id": "Segment"
     },
-    "DateRange": {
-      "description": "A contiguous set of days: startDate, startDate + 1 day, ..., endDate.\nThe start and end dates are specified in\n[ISO8601](https://en.wikipedia.org/wiki/ISO_8601) date format `YYYY-MM-DD`.",
+    "SegmentSequenceStep": {
+      "description": "A segment sequence definition.",
       "type": "object",
       "properties": {
-        "startDate": {
-          "description": "The start date for the query in the format `YYYY-MM-DD`.",
+        "orFiltersForSegment": {
+          "description": "A sequence is specified with a list of Or grouped filters which are\ncombined with `AND` operator.",
+          "type": "array",
+          "items": {
+            "$ref": "OrFiltersForSegment"
+          }
+        },
+        "matchType": {
+          "description": "Specifies if the step immediately precedes or can be any time before the\nnext step.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified match type is treated as precedes.",
+            "Operator indicates that the previous step precedes the next step.",
+            "Operator indicates that the previous step immediately precedes the next\nstep."
+          ],
+          "enum": [
+            "UNSPECIFIED_MATCH_TYPE",
+            "PRECEDES",
+            "IMMEDIATELY_PRECEDES"
+          ]
+        }
+      },
+      "id": "SegmentSequenceStep"
+    },
+    "Metric": {
+      "type": "object",
+      "properties": {
+        "expression": {
+          "description": "A metric expression in the request. An expression is constructed from one\nor more metrics and numbers. Accepted operators include: Plus (+), Minus\n(-), Negation (Unary -), Divided by (/), Multiplied by (*), Parenthesis,\nPositive cardinal numbers (0-9), can include decimals and is limited to\n1024 characters. Example `ga:totalRefunds/ga:users`, in most cases the\nmetric expression is just a single metric name like `ga:users`.\nAdding mixed `MetricType` (E.g., `CURRENCY` + `PERCENTAGE`) metrics\nwill result in unexpected results.",
           "type": "string"
         },
-        "endDate": {
-          "description": "The end date for the query in the format `YYYY-MM-DD`.",
+        "formattingType": {
+          "description": "Specifies how the metric expression should be formatted, for example\n`INTEGER`.",
+          "type": "string",
+          "enumDescriptions": [
+            "Metric type is unspecified.",
+            "Integer metric.",
+            "Float metric.",
+            "Currency metric.",
+            "Percentage metric.",
+            "Time metric in `HH:MM:SS` format."
+          ],
+          "enum": [
+            "METRIC_TYPE_UNSPECIFIED",
+            "INTEGER",
+            "FLOAT",
+            "CURRENCY",
+            "PERCENT",
+            "TIME"
+          ]
+        },
+        "alias": {
+          "description": "An alias for the metric expression is an alternate name for the\nexpression. The alias can be used for filtering and sorting. This field\nis optional and is useful if the expression is not a single metric but\na complex expression which cannot be used in filtering and sorting.\nThe alias is also used in the response column header.",
           "type": "string"
         }
       },
-      "id": "DateRange"
+      "id": "Metric",
+      "description": "[Metrics](https://support.google.com/analytics/answer/1033861)\nare the quantitative measurements. For example, the metric `ga:users`\nindicates the total number of users for the requested time period."
+    },
+    "PivotValueRegion": {
+      "id": "PivotValueRegion",
+      "description": "The metric values in the pivot region.",
+      "type": "object",
+      "properties": {
+        "values": {
+          "description": "The values of the metrics in each of the pivot regions.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "Report": {
+      "description": "The data response corresponding to the request.",
+      "type": "object",
+      "properties": {
+        "data": {
+          "description": "Response data.",
+          "$ref": "ReportData"
+        },
+        "nextPageToken": {
+          "description": "Page token to retrieve the next page of results in the list.",
+          "type": "string"
+        },
+        "columnHeader": {
+          "description": "The column headers.",
+          "$ref": "ColumnHeader"
+        }
+      },
+      "id": "Report"
+    },
+    "PivotHeader": {
+      "description": "The headers for each of the pivot sections defined in the request.",
+      "type": "object",
+      "properties": {
+        "totalPivotGroupsCount": {
+          "description": "The total number of groups for this pivot.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "pivotHeaderEntries": {
+          "description": "A single pivot section header.",
+          "type": "array",
+          "items": {
+            "$ref": "PivotHeaderEntry"
+          }
+        }
+      },
+      "id": "PivotHeader"
+    },
+    "DateRange": {
+      "properties": {
+        "endDate": {
+          "description": "The end date for the query in the format `YYYY-MM-DD`.",
+          "type": "string"
+        },
+        "startDate": {
+          "description": "The start date for the query in the format `YYYY-MM-DD`.",
+          "type": "string"
+        }
+      },
+      "id": "DateRange",
+      "description": "A contiguous set of days: startDate, startDate + 1 day, ..., endDate.\nThe start and end dates are specified in\n[ISO8601](https://en.wikipedia.org/wiki/ISO_8601) date format `YYYY-MM-DD`.",
+      "type": "object"
+    },
+    "MetricFilter": {
+      "id": "MetricFilter",
+      "description": "MetricFilter specifies the filter on a metric.",
+      "type": "object",
+      "properties": {
+        "not": {
+          "type": "boolean",
+          "description": "Logical `NOT` operator. If this boolean is set to true, then the matching\nmetric values will be excluded in the report. The default is false."
+        },
+        "metricName": {
+          "description": "The metric that will be filtered on. A metricFilter must contain a metric\nname. A metric name can be an alias earlier defined as a metric or it can\nalso be a metric expression.",
+          "type": "string"
+        },
+        "comparisonValue": {
+          "type": "string",
+          "description": "The value to compare against."
+        },
+        "operator": {
+          "enumDescriptions": [
+            "If the operator is not specified, it is treated as `EQUAL`.",
+            "Should the value of the metric be exactly equal to the comparison value.",
+            "Should the value of the metric be less than to the comparison value.",
+            "Should the value of the metric be greater than to the comparison value.",
+            "Validates if the metric is missing.\nDoesn't take comparisonValue into account."
+          ],
+          "enum": [
+            "OPERATOR_UNSPECIFIED",
+            "EQUAL",
+            "LESS_THAN",
+            "GREATER_THAN",
+            "IS_MISSING"
+          ],
+          "description": "Is the metric `EQUAL`, `LESS_THAN` or `GREATER_THAN` the\ncomparisonValue, the default is `EQUAL`. If the operator is\n`IS_MISSING`, checks if the metric is missing and would ignore the\ncomparisonValue.",
+          "type": "string"
+        }
+      }
+    },
+    "ReportRequest": {
+      "description": "The main request class which specifies the Reporting API request.",
+      "type": "object",
+      "properties": {
+        "dimensions": {
+          "description": "The dimensions requested.\nRequests can have a total of 7 dimensions.",
+          "type": "array",
+          "items": {
+            "$ref": "Dimension"
+          }
+        },
+        "dateRanges": {
+          "description": "Date ranges in the request. The request can have a maximum of 2 date\nranges. The response will contain a set of metric values for each\ncombination of the dimensions for each date range in the request. So, if\nthere are two date ranges, there will be two set of metric values, one for\nthe original date range and one for the second date range.\nThe `reportRequest.dateRanges` field should not be specified for cohorts\nor Lifetime value requests.\nIf a date range is not provided, the default date range is (startDate:\ncurrent date - 7 days, endDate: current date - 1 day). Every\n[ReportRequest](#ReportRequest) within a `batchGet` method must\ncontain the same `dateRanges` definition.",
+          "type": "array",
+          "items": {
+            "$ref": "DateRange"
+          }
+        },
+        "pageToken": {
+          "description": "A continuation token to get the next page of the results. Adding this to\nthe request will return the rows after the pageToken. The pageToken should\nbe the value returned in the nextPageToken parameter in the response to\nthe GetReports request.",
+          "type": "string"
+        },
+        "pivots": {
+          "description": "The pivot definitions. Requests can have a maximum of 2 pivots.",
+          "type": "array",
+          "items": {
+            "$ref": "Pivot"
+          }
+        },
+        "includeEmptyRows": {
+          "description": "If set to false, the response does not include rows if all the retrieved\nmetrics are equal to zero. The default is false which will exclude these\nrows.",
+          "type": "boolean"
+        },
+        "metricFilterClauses": {
+          "description": "The metric filter clauses. They are logically combined with the `AND`\noperator.  Metric filters look at only the first date range and not the\ncomparing date range. Note that filtering on metrics occurs after the\nmetrics are aggregated.",
+          "type": "array",
+          "items": {
+            "$ref": "MetricFilterClause"
+          }
+        },
+        "pageSize": {
+          "description": "Page size is for paging and specifies the maximum number of returned rows.\nPage size should be \u003e= 0. A query returns the default of 1,000 rows.\nThe Analytics Core Reporting API returns a maximum of 10,000 rows per\nrequest, no matter how many you ask for. It can also return fewer rows\nthan requested, if there aren't as many dimension segments as you expect.\nFor instance, there are fewer than 300 possible values for `ga:country`,\nso when segmenting only by country, you can't get more than 300 rows,\neven if you set `pageSize` to a higher value.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "hideTotals": {
+          "description": "If set to true, hides the total of all metrics for all the matching rows,\nfor every date range. The default false and will return the totals.",
+          "type": "boolean"
+        },
+        "hideValueRanges": {
+          "description": "If set to true, hides the minimum and maximum across all matching rows.\nThe default is false and the value ranges are returned.",
+          "type": "boolean"
+        },
+        "filtersExpression": {
+          "description": "Dimension or metric filters that restrict the data returned for your\nrequest. To use the `filtersExpression`, supply a dimension or metric on\nwhich to filter, followed by the filter expression. For example, the\nfollowing expression selects `ga:browser` dimension which starts with\nFirefox; `ga:browser=~^Firefox`. For more information on dimensions\nand metric filters, see\n[Filters reference](https://developers.google.com/analytics/devguides/reporting/core/v3/reference#filters).",
+          "type": "string"
+        },
+        "cohortGroup": {
+          "description": "Cohort group associated with this request. If there is a cohort group\nin the request the `ga:cohort` dimension must be present.\nEvery [ReportRequest](#ReportRequest) within a `batchGet` method must\ncontain the same `cohortGroup` definition.",
+          "$ref": "CohortGroup"
+        },
+        "viewId": {
+          "description": "The Analytics\n[view ID](https://support.google.com/analytics/answer/1009618)\nfrom which to retrieve data. Every [ReportRequest](#ReportRequest)\nwithin a `batchGet` method must contain the same `viewId`.",
+          "type": "string"
+        },
+        "metrics": {
+          "description": "The metrics requested.\nRequests must specify at least one metric. Requests can have a\ntotal of 10 metrics.",
+          "type": "array",
+          "items": {
+            "$ref": "Metric"
+          }
+        },
+        "dimensionFilterClauses": {
+          "description": "The dimension filter clauses for filtering Dimension Values. They are\nlogically combined with the `AND` operator. Note that filtering occurs\nbefore any dimensions are aggregated, so that the returned metrics\nrepresent the total for only the relevant dimensions.",
+          "type": "array",
+          "items": {
+            "$ref": "DimensionFilterClause"
+          }
+        },
+        "orderBys": {
+          "type": "array",
+          "items": {
+            "$ref": "OrderBy"
+          },
+          "description": "Sort order on output rows. To compare two rows, the elements of the\nfollowing are applied in order until a difference is found.  All date\nranges in the output get the same row order."
+        },
+        "segments": {
+          "description": "Segment the data returned for the request. A segment definition helps look\nat a subset of the segment request. A request can contain up to four\nsegments. Every [ReportRequest](#ReportRequest) within a\n`batchGet` method must contain the same `segments` definition. Requests\nwith segments must have the `ga:segment` dimension.",
+          "type": "array",
+          "items": {
+            "$ref": "Segment"
+          }
+        },
+        "samplingLevel": {
+          "enumDescriptions": [
+            "If the `samplingLevel` field is unspecified the `DEFAULT` sampling level\nis used.",
+            "Returns response with a sample size that balances speed and\naccuracy.",
+            "It returns a fast response with a smaller sampling size.",
+            "Returns a more accurate response using a large sampling size. But this\nmay result in response being slower."
+          ],
+          "enum": [
+            "SAMPLING_UNSPECIFIED",
+            "DEFAULT",
+            "SMALL",
+            "LARGE"
+          ],
+          "description": "The desired report\n[sample](https://support.google.com/analytics/answer/2637192) size.\nIf the the `samplingLevel` field is unspecified the `DEFAULT` sampling\nlevel is used. Every [ReportRequest](#ReportRequest) within a\n`batchGet` method must contain the same `samplingLevel` definition. See\n[developer guide](/analytics/devguides/reporting/core/v4/basics#sampling)\n for details.",
+          "type": "string"
+        }
+      },
+      "id": "ReportRequest"
+    },
+    "Dimension": {
+      "description": "[Dimensions](https://support.google.com/analytics/answer/1033861)\nare attributes of your data. For example, the dimension `ga:city`\nindicates the city, for example, \"Paris\" or \"New York\", from which\na session originates.",
+      "type": "object",
+      "properties": {
+        "histogramBuckets": {
+          "description": "If non-empty, we place dimension values into buckets after string to\nint64. Dimension values that are not the string representation of an\nintegral value will be converted to zero.  The bucket values have to be in\nincreasing order.  Each bucket is closed on the lower end, and open on the\nupper end. The \"first\" bucket includes all values less than the first\nboundary, the \"last\" bucket includes all values up to infinity. Dimension\nvalues that fall in a bucket get transformed to a new dimension value. For\nexample, if one gives a list of \"0, 1, 3, 4, 7\", then we return the\nfollowing buckets:\n\n- bucket #1: values \u003c 0, dimension value \"\u003c0\"\n- bucket #2: values in [0,1), dimension value \"0\"\n- bucket #3: values in [1,3), dimension value \"1-2\"\n- bucket #4: values in [3,4), dimension value \"3\"\n- bucket #5: values in [4,7), dimension value \"4-6\"\n- bucket #6: values \u003e= 7, dimension value \"7+\"\n\nNOTE: If you are applying histogram mutation on any dimension, and using\nthat dimension in sort, you will want to use the sort type\n`HISTOGRAM_BUCKET` for that purpose. Without that the dimension values\nwill be sorted according to dictionary\n(lexicographic) order. For example the ascending dictionary order is:\n\n   \"\u003c50\", \"1001+\", \"121-1000\", \"50-120\"\n\nAnd the ascending `HISTOGRAM_BUCKET` order is:\n\n   \"\u003c50\", \"50-120\", \"121-1000\", \"1001+\"\n\nThe client has to explicitly request `\"orderType\": \"HISTOGRAM_BUCKET\"`\nfor a histogram-mutated dimension.",
+          "type": "array",
+          "items": {
+            "format": "int64",
+            "type": "string"
+          }
+        },
+        "name": {
+          "description": "Name of the dimension to fetch, for example `ga:browser`.",
+          "type": "string"
+        }
+      },
+      "id": "Dimension"
+    },
+    "DynamicSegment": {
+      "description": "Dynamic segment definition for defining the segment within the request.\nA segment can select users, sessions or both.",
+      "type": "object",
+      "properties": {
+        "sessionSegment": {
+          "$ref": "SegmentDefinition",
+          "description": "Session Segment to select sessions to include in the segment."
+        },
+        "name": {
+          "description": "The name of the dynamic segment.",
+          "type": "string"
+        },
+        "userSegment": {
+          "$ref": "SegmentDefinition",
+          "description": "User Segment to select users to include in the segment."
+        }
+      },
+      "id": "DynamicSegment"
+    },
+    "SimpleSegment": {
+      "description": "A Simple segment conditions consist of one or more dimension/metric\nconditions that can be combined.",
+      "type": "object",
+      "properties": {
+        "orFiltersForSegment": {
+          "description": "A list of segment filters groups which are combined with logical `AND`\noperator.",
+          "type": "array",
+          "items": {
+            "$ref": "OrFiltersForSegment"
+          }
+        }
+      },
+      "id": "SimpleSegment"
+    },
+    "ColumnHeader": {
+      "description": "Column headers.",
+      "type": "object",
+      "properties": {
+        "metricHeader": {
+          "description": "Metric headers for the metrics in the response.",
+          "$ref": "MetricHeader"
+        },
+        "dimensions": {
+          "description": "The dimension names in the response.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "ColumnHeader"
+    },
+    "SegmentFilterClause": {
+      "description": "Filter Clause to be used in a segment definition, can be wither a metric or\na dimension filter.",
+      "type": "object",
+      "properties": {
+        "not": {
+          "type": "boolean",
+          "description": "Matches the complement (`!`) of the filter."
+        },
+        "dimensionFilter": {
+          "description": "Dimension Filter for the segment definition.",
+          "$ref": "SegmentDimensionFilter"
+        },
+        "metricFilter": {
+          "$ref": "SegmentMetricFilter",
+          "description": "Metric Filter for the segment definition."
+        }
+      },
+      "id": "SegmentFilterClause"
+    },
+    "MetricFilterClause": {
+      "id": "MetricFilterClause",
+      "description": "Represents a group of metric filters.\nSet the operator value to specify how the filters are logically combined.",
+      "type": "object",
+      "properties": {
+        "operator": {
+          "description": "The operator for combining multiple metric filters. If unspecified, it is\ntreated as an `OR`.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified operator. It is treated as an `OR`.",
+            "The logical `OR` operator.",
+            "The logical `AND` operator."
+          ],
+          "enum": [
+            "OPERATOR_UNSPECIFIED",
+            "OR",
+            "AND"
+          ]
+        },
+        "filters": {
+          "type": "array",
+          "items": {
+            "$ref": "MetricFilter"
+          },
+          "description": "The repeated set of filters. They are logically combined based on the\noperator specified."
+        }
+      }
+    },
+    "Cohort": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "A unique name for the cohort. If not defined name will be auto-generated\nwith values cohort_[1234...].",
+          "type": "string"
+        },
+        "dateRange": {
+          "$ref": "DateRange",
+          "description": "This is used for `FIRST_VISIT_DATE` cohort, the cohort selects users\nwhose first visit date is between start date and end date defined in the\nDateRange. The date ranges should be aligned for cohort requests. If the\nrequest contains `ga:cohortNthDay` it should be exactly one day long,\nif `ga:cohortNthWeek` it should be aligned to the week boundary (starting\nat Sunday and ending Saturday), and for `ga:cohortNthMonth` the date range\nshould be aligned to the month (starting at the first and ending on the\nlast day of the month).\nFor LTV requests there are no such restrictions.\nYou do not need to supply a date range for the\n`reportsRequest.dateRanges` field."
+        },
+        "type": {
+          "enumDescriptions": [
+            "If unspecified it's treated as `FIRST_VISIT_DATE`.",
+            "Cohorts that are selected based on first visit date."
+          ],
+          "enum": [
+            "UNSPECIFIED_COHORT_TYPE",
+            "FIRST_VISIT_DATE"
+          ],
+          "description": "Type of the cohort. The only supported type as of now is\n`FIRST_VISIT_DATE`. If this field is unspecified the cohort is treated\nas `FIRST_VISIT_DATE` type cohort.",
+          "type": "string"
+        }
+      },
+      "id": "Cohort",
+      "description": "Defines a cohort. A cohort is a group of users who share a common\ncharacteristic. For example, all users with the same acquisition date\nbelong to the same cohort."
     },
     "ReportRow": {
-      "description": "A row in the report.",
-      "type": "object",
       "properties": {
         "dimensions": {
           "description": "List of requested dimensions.",
@@ -917,28 +917,74 @@
           }
         }
       },
-      "id": "ReportRow"
+      "id": "ReportRow",
+      "description": "A row in the report.",
+      "type": "object"
     },
-    "CohortGroup": {
-      "description": "Defines a cohort group.\nFor example:\n\n    \"cohortGroup\": {\n      \"cohorts\": [{\n        \"name\": \"cohort 1\",\n        \"type\": \"FIRST_VISIT_DATE\",\n        \"dateRange\": { \"startDate\": \"2015-08-01\", \"endDate\": \"2015-08-01\" }\n      },{\n        \"name\": \"cohort 2\"\n         \"type\": \"FIRST_VISIT_DATE\"\n         \"dateRange\": { \"startDate\": \"2015-07-01\", \"endDate\": \"2015-07-01\" }\n      }]\n    }",
+    "OrFiltersForSegment": {
+      "description": "A list of segment filters in the `OR` group are combined with the logical OR\noperator.",
       "type": "object",
       "properties": {
-        "lifetimeValue": {
-          "description": "Enable Life Time Value (LTV).  LTV measures lifetime value for users\nacquired through different channels.\nPlease see:\n[Cohort Analysis](https://support.google.com/analytics/answer/6074676) and\n[Lifetime Value](https://support.google.com/analytics/answer/6182550)\nIf the value of lifetimeValue is false:\n\n- The metric values are similar to the values in the web interface cohort\n  report.\n- The cohort definition date ranges must be aligned to the calendar week\n  and month. i.e. while requesting `ga:cohortNthWeek` the `startDate` in\n  the cohort definition should be a Sunday and the `endDate` should be the\n  following Saturday, and for `ga:cohortNthMonth`, the `startDate`\n  should be the 1st of the month and `endDate` should be the last day\n  of the month.\n\nWhen the lifetimeValue is true:\n\n- The metric values will correspond to the values in the web interface\n  LifeTime value report.\n- The Lifetime Value report shows you how user value (Revenue) and\n  engagement (Appviews, Goal Completions, Sessions, and Session Duration)\n  grow during the 90 days after a user is acquired.\n- The metrics are calculated as a cumulative average per user per the time\n  increment.\n- The cohort definition date ranges need not be aligned to the calendar\n  week and month boundaries.\n- The `viewId` must be an\n  [app view ID](https://support.google.com/analytics/answer/2649553#WebVersusAppViews)",
-          "type": "boolean"
-        },
-        "cohorts": {
-          "description": "The definition for the cohort.",
+        "segmentFilterClauses": {
+          "description": "List of segment filters to be combined with a `OR` operator.",
           "type": "array",
           "items": {
-            "$ref": "Cohort"
+            "$ref": "SegmentFilterClause"
           }
         }
       },
-      "id": "CohortGroup"
+      "id": "OrFiltersForSegment"
+    },
+    "MetricHeader": {
+      "description": "The headers for the metrics.",
+      "type": "object",
+      "properties": {
+        "metricHeaderEntries": {
+          "description": "Headers for the metrics in the response.",
+          "type": "array",
+          "items": {
+            "$ref": "MetricHeaderEntry"
+          }
+        },
+        "pivotHeaders": {
+          "description": "Headers for the pivots in the response.",
+          "type": "array",
+          "items": {
+            "$ref": "PivotHeader"
+          }
+        }
+      },
+      "id": "MetricHeader"
+    },
+    "DimensionFilterClause": {
+      "description": "A group of dimension filters. Set the operator value to specify how\nthe filters are logically combined.",
+      "type": "object",
+      "properties": {
+        "operator": {
+          "description": "The operator for combining multiple dimension filters. If unspecified, it\nis treated as an `OR`.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified operator. It is treated as an `OR`.",
+            "The logical `OR` operator.",
+            "The logical `AND` operator."
+          ],
+          "enum": [
+            "OPERATOR_UNSPECIFIED",
+            "OR",
+            "AND"
+          ]
+        },
+        "filters": {
+          "type": "array",
+          "items": {
+            "$ref": "DimensionFilter"
+          },
+          "description": "The repeated set of filters. They are logically combined based on the\noperator specified."
+        }
+      },
+      "id": "DimensionFilterClause"
     },
     "GetReportsResponse": {
-      "description": "The main response class which holds the reports from the Reporting API\n`batchGet` call.",
       "type": "object",
       "properties": {
         "reports": {
@@ -949,196 +995,152 @@
           }
         }
       },
-      "id": "GetReportsResponse"
+      "id": "GetReportsResponse",
+      "description": "The main response class which holds the reports from the Reporting API\n`batchGet` call."
     },
-    "MetricHeaderEntry": {
-      "description": "Header for the metrics.",
-      "type": "object",
+    "SequenceSegment": {
       "properties": {
-        "type": {
-          "description": "The type of the metric, for example `INTEGER`.",
-          "enum": [
-            "METRIC_TYPE_UNSPECIFIED",
-            "INTEGER",
-            "FLOAT",
-            "CURRENCY",
-            "PERCENT",
-            "TIME"
-          ],
-          "enumDescriptions": [
-            "Metric type is unspecified.",
-            "Integer metric.",
-            "Float metric.",
-            "Currency metric.",
-            "Percentage metric.",
-            "Time metric in `HH:MM:SS` format."
-          ],
-          "type": "string"
+        "segmentSequenceSteps": {
+          "description": "The list of steps in the sequence.",
+          "type": "array",
+          "items": {
+            "$ref": "SegmentSequenceStep"
+          }
         },
-        "name": {
-          "description": "The name of the header.",
-          "type": "string"
-        }
-      },
-      "id": "MetricHeaderEntry"
-    },
-    "MetricFilter": {
-      "description": "MetricFilter specifies the filter on a metric.",
-      "type": "object",
-      "properties": {
-        "metricName": {
-          "description": "The metric that will be filtered on. A metricFilter must contain a metric\nname. A metric name can be an alias earlier defined as a metric or it can\nalso be a metric expression.",
-          "type": "string"
-        },
-        "operator": {
-          "description": "Is the metric `EQUAL`, `LESS_THAN` or `GREATER_THAN` the\ncomparisonValue, the default is `EQUAL`. If the operator is\n`IS_MISSING`, checks if the metric is missing and would ignore the\ncomparisonValue.",
-          "enum": [
-            "OPERATOR_UNSPECIFIED",
-            "EQUAL",
-            "LESS_THAN",
-            "GREATER_THAN",
-            "IS_MISSING"
-          ],
-          "enumDescriptions": [
-            "If the operator is not specified, it is treated as `EQUAL`.",
-            "Should the value of the metric be exactly equal to the comparison value.",
-            "Should the value of the metric be less than to the comparison value.",
-            "Should the value of the metric be greater than to the comparison value.",
-            "Validates if the metric is missing.\nDoesn't take comparisonValue into account."
-          ],
-          "type": "string"
-        },
-        "comparisonValue": {
-          "description": "The value to compare against.",
-          "type": "string"
-        },
-        "not": {
-          "description": "Logical `NOT` operator. If this boolean is set to true, then the matching\nmetric values will be excluded in the report. The default is false.",
+        "firstStepShouldMatchFirstHit": {
+          "description": "If set, first step condition must match the first hit of the visitor (in\nthe date range).",
           "type": "boolean"
         }
       },
-      "id": "MetricFilter"
-    },
-    "Dimension": {
-      "description": "[Dimensions](https://support.google.com/analytics/answer/1033861)\nare attributes of your data. For example, the dimension `ga:city`\nindicates the city, for example, \"Paris\" or \"New York\", from which\na session originates.",
-      "type": "object",
-      "properties": {
-        "histogramBuckets": {
-          "description": "If non-empty, we place dimension values into buckets after string to\nint64. Dimension values that are not the string representation of an\nintegral value will be converted to zero.  The bucket values have to be in\nincreasing order.  Each bucket is closed on the lower end, and open on the\nupper end. The \"first\" bucket includes all values less than the first\nboundary, the \"last\" bucket includes all values up to infinity. Dimension\nvalues that fall in a bucket get transformed to a new dimension value. For\nexample, if one gives a list of \"0, 1, 3, 4, 7\", then we return the\nfollowing buckets:\n\n- bucket #1: values \u003c 0, dimension value \"\u003c0\"\n- bucket #2: values in [0,1), dimension value \"0\"\n- bucket #3: values in [1,3), dimension value \"1-2\"\n- bucket #4: values in [3,4), dimension value \"3\"\n- bucket #5: values in [4,7), dimension value \"4-6\"\n- bucket #6: values \u003e= 7, dimension value \"7+\"\n\nNOTE: If you are applying histogram mutation on any dimension, and using\nthat dimension in sort, you will want to use the sort type\n`HISTOGRAM_BUCKET` for that purpose. Without that the dimension values\nwill be sorted according to dictionary\n(lexicographic) order. For example the ascending dictionary order is:\n\n   \"\u003c50\", \"1001+\", \"121-1000\", \"50-120\"\n\nAnd the ascending `HISTOGRAM_BUCKET` order is:\n\n   \"\u003c50\", \"50-120\", \"121-1000\", \"1001+\"\n\nThe client has to explicitly request `\"orderType\": \"HISTOGRAM_BUCKET\"`\nfor a histogram-mutated dimension.",
-          "type": "array",
-          "items": {
-            "type": "string",
-            "format": "int64"
-          }
-        },
-        "name": {
-          "description": "Name of the dimension to fetch, for example `ga:browser`.",
-          "type": "string"
-        }
-      },
-      "id": "Dimension"
-    },
-    "PivotValueRegion": {
-      "description": "The metric values in the pivot region.",
-      "type": "object",
-      "properties": {
-        "values": {
-          "description": "The values of the metrics in each of the pivot regions.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "PivotValueRegion"
+      "id": "SequenceSegment",
+      "description": "Sequence conditions consist of one or more steps, where each step is defined\nby one or more dimension/metric conditions. Multiple steps can be combined\nwith special sequence operators.",
+      "type": "object"
     }
   },
-  "revision": "20161129",
-  "basePath": "",
   "icons": {
     "x32": "http://www.google.com/images/icons/product/search-32.gif",
     "x16": "http://www.google.com/images/icons/product/search-16.gif"
   },
-  "version_module": "True",
+  "protocol": "rest",
   "canonicalName": "AnalyticsReporting",
-  "discoveryVersion": "v1",
-  "baseUrl": "https://analyticsreporting.googleapis.com/",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/analytics.readonly": {
+          "description": "View your Google Analytics data"
+        },
+        "https://www.googleapis.com/auth/analytics": {
+          "description": "View and manage your Google Analytics data"
+        }
+      }
+    }
+  },
+  "rootUrl": "https://analyticsreporting.googleapis.com/",
+  "ownerDomain": "google.com",
   "name": "analyticsreporting",
+  "batchPath": "batch",
+  "title": "Google Analytics Reporting API",
+  "ownerName": "Google",
+  "resources": {
+    "reports": {
+      "methods": {
+        "batchGet": {
+          "response": {
+            "$ref": "GetReportsResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/analytics",
+            "https://www.googleapis.com/auth/analytics.readonly"
+          ],
+          "parameters": {},
+          "flatPath": "v4/reports:batchGet",
+          "path": "v4/reports:batchGet",
+          "id": "analyticsreporting.reports.batchGet",
+          "description": "Returns the Analytics data.",
+          "request": {
+            "$ref": "GetReportsRequest"
+          }
+        }
+      }
+    }
+  },
   "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
       "type": "string",
       "location": "query"
     },
     "prettyPrint": {
+      "location": "query",
       "description": "Returns response with indentations and line breaks.",
-      "default": "true",
       "type": "boolean",
-      "location": "query"
+      "default": "true"
     },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
       "type": "string",
       "location": "query"
     },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
     "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
       "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
+      "description": "Selector specifying which fields to include in a partial response.",
       "type": "string"
     },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
     "callback": {
       "description": "JSONP",
       "type": "string",
       "location": "query"
     },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
     },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+    "alt": {
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string"
+    },
+    "access_token": {
       "type": "string",
+      "location": "query",
+      "description": "OAuth access token."
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true",
       "location": "query"
     },
     "bearer_token": {
@@ -1146,18 +1148,16 @@
       "type": "string",
       "location": "query"
     },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+    "oauth_token": {
       "type": "string",
-      "location": "query"
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user."
     }
   },
-  "documentationLink": "https://developers.google.com/analytics/devguides/reporting/core/v4/",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
-  "servicePath": "",
-  "ownerName": "Google",
   "version": "v4",
-  "rootUrl": "https://analyticsreporting.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "baseUrl": "https://analyticsreporting.googleapis.com/",
+  "kind": "discovery#restDescription",
+  "description": "Accesses Analytics report data.",
+  "servicePath": "",
+  "basePath": ""
 }
diff --git a/analyticsreporting/v4/analyticsreporting-gen.go b/analyticsreporting/v4/analyticsreporting-gen.go
index 055e301..41676f2 100644
--- a/analyticsreporting/v4/analyticsreporting-gen.go
+++ b/analyticsreporting/v4/analyticsreporting-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Reports *ReportsService
 }
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewReportsService(s *Service) *ReportsService {
 	rs := &ReportsService{s: s}
 	return rs
@@ -2072,6 +2077,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.getreportsrequest)
 	if err != nil {
diff --git a/androidenterprise/v1/androidenterprise-api.json b/androidenterprise/v1/androidenterprise-api.json
index a8f48d3..feab812 100644
--- a/androidenterprise/v1/androidenterprise-api.json
+++ b/androidenterprise/v1/androidenterprise-api.json
@@ -1,12 +1,12 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/POjkLwx_Ki840e_TX5U8lbxSuxE\"",
+ "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/qmu3g-0qIQB7C8meI8fD39oNLuA\"",
  "discoveryVersion": "v1",
  "id": "androidenterprise:v1",
  "name": "androidenterprise",
  "canonicalName": "Android Enterprise",
  "version": "v1",
- "revision": "20170117",
+ "revision": "20170131",
  "title": "Google Play EMM API",
  "description": "Manages the deployment of apps to Android for Work users.",
  "ownerDomain": "google.com",
@@ -1048,7 +1048,7 @@
     },
     "productSetBehavior": {
      "type": "string",
-     "description": "The interpretation of this product set. \"unknown\" should never be sent and ignored if received. \"whitelist\" means that this product set constitutes a whitelist. \"includeAll\" means that all products are accessible, including products that are approved, not approved, and even products where approval has been revoked. If the value is \"includeAll\", the value of the productId field is therefore ignored. If a value is not supplied, it is interpreted to be \"whitelist\" for backwards compatibility."
+     "description": "The interpretation of this product set. \"unknown\" should never be sent and is ignored if received. \"whitelist\" means that this product set constitutes a whitelist. \"includeAll\" means that all products are accessible, including products that are approved, products with revoked approval, and products that have never been approved. If the value is \"includeAll\", the value of the productId field is therefore ignored. If a value is not supplied, it is interpreted to be \"whitelist\" for backwards compatibility."
     }
    }
   },
@@ -3873,7 +3873,7 @@
      "id": "androidenterprise.users.setAvailableProductSet",
      "path": "enterprises/{enterpriseId}/users/{userId}/availableProductSet",
      "httpMethod": "PUT",
-     "description": "Modifies the set of products a user is entitled to access.",
+     "description": "Modifies the set of products that a user is entitled to access (referred to as whitelisted products). Only products that are approved or products that were previously approved (products with revoked approval) can be whitelisted.",
      "parameters": {
       "enterpriseId": {
        "type": "string",
diff --git a/androidenterprise/v1/androidenterprise-gen.go b/androidenterprise/v1/androidenterprise-gen.go
index 9b01033..4644de8 100644
--- a/androidenterprise/v1/androidenterprise-gen.go
+++ b/androidenterprise/v1/androidenterprise-gen.go
@@ -74,9 +74,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Devices *DevicesService
 
@@ -114,6 +115,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewDevicesService(s *Service) *DevicesService {
 	rs := &DevicesService{s: s}
 	return rs
@@ -2154,13 +2159,13 @@
 	ProductId []string `json:"productId,omitempty"`
 
 	// ProductSetBehavior: The interpretation of this product set. "unknown"
-	// should never be sent and ignored if received. "whitelist" means that
-	// this product set constitutes a whitelist. "includeAll" means that all
-	// products are accessible, including products that are approved, not
-	// approved, and even products where approval has been revoked. If the
-	// value is "includeAll", the value of the productId field is therefore
-	// ignored. If a value is not supplied, it is interpreted to be
-	// "whitelist" for backwards compatibility.
+	// should never be sent and is ignored if received. "whitelist" means
+	// that this product set constitutes a whitelist. "includeAll" means
+	// that all products are accessible, including products that are
+	// approved, products with revoked approval, and products that have
+	// never been approved. If the value is "includeAll", the value of the
+	// productId field is therefore ignored. If a value is not supplied, it
+	// is interpreted to be "whitelist" for backwards compatibility.
 	ProductSetBehavior string `json:"productSetBehavior,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -2967,6 +2972,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3129,6 +3135,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3284,6 +3291,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3429,6 +3437,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.devicestate)
 	if err != nil {
@@ -3584,6 +3593,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/acknowledgeNotificationSet")
@@ -3686,6 +3696,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/completeSignup")
@@ -3813,6 +3824,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.administratorwebtokenspec)
 	if err != nil {
@@ -3947,6 +3959,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}")
@@ -4043,6 +4056,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.enterprise)
 	if err != nil {
@@ -4184,6 +4198,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/signupUrl")
@@ -4311,6 +4326,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4474,6 +4490,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4626,6 +4643,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4754,6 +4772,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.enterprise)
 	if err != nil {
@@ -4896,6 +4915,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5053,6 +5073,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/pullNotificationSet")
@@ -5179,6 +5200,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/sendTestPushNotification")
@@ -5307,6 +5329,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.enterpriseaccount)
 	if err != nil {
@@ -5447,6 +5470,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.storelayout)
 	if err != nil {
@@ -5578,6 +5602,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/unenroll")
@@ -5678,6 +5703,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}")
@@ -5804,6 +5830,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5960,6 +5987,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6111,6 +6139,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entitlement)
 	if err != nil {
@@ -6279,6 +6308,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.entitlement)
 	if err != nil {
@@ -6445,6 +6475,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6591,6 +6622,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6731,6 +6763,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6873,6 +6906,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}")
@@ -7009,6 +7043,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7175,6 +7210,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7327,6 +7363,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.install)
 	if err != nil {
@@ -7492,6 +7529,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.install)
 	if err != nil {
@@ -7654,6 +7692,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/managedConfigurationsForDevice/{managedConfigurationForDeviceId}")
@@ -7790,6 +7829,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7956,6 +7996,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8109,6 +8150,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.managedconfiguration)
 	if err != nil {
@@ -8273,6 +8315,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.managedconfiguration)
 	if err != nil {
@@ -8433,6 +8476,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/managedConfigurationsForUser/{managedConfigurationForUserId}")
@@ -8560,6 +8604,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8716,6 +8761,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8859,6 +8905,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.managedconfiguration)
 	if err != nil {
@@ -9013,6 +9060,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.managedconfiguration)
 	if err != nil {
@@ -9179,6 +9227,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9320,6 +9369,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.productsapproverequest)
 	if err != nil {
@@ -9451,6 +9501,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/products/{productId}/generateApprovalUrl")
@@ -9609,6 +9660,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9774,6 +9826,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9927,6 +9980,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10117,6 +10171,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10272,6 +10327,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/products/{productId}/unapprove")
@@ -10381,6 +10437,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/serviceAccountKeys/{keyId}")
@@ -10493,6 +10550,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.serviceaccountkey)
 	if err != nil {
@@ -10639,6 +10697,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10769,6 +10828,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/storeLayout/pages/{pageId}/clusters/{clusterId}")
@@ -10895,6 +10955,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11041,6 +11102,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.storecluster)
 	if err != nil {
@@ -11193,6 +11255,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11333,6 +11396,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.storecluster)
 	if err != nil {
@@ -11486,6 +11550,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.storecluster)
 	if err != nil {
@@ -11635,6 +11700,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/storeLayout/pages/{pageId}")
@@ -11751,6 +11817,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11887,6 +11954,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.storepage)
 	if err != nil {
@@ -12029,6 +12097,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12160,6 +12229,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.storepage)
 	if err != nil {
@@ -12303,6 +12373,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.storepage)
 	if err != nil {
@@ -12444,6 +12515,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}")
@@ -12554,6 +12626,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/authenticationToken")
@@ -12691,6 +12764,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/token")
@@ -12835,6 +12909,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12983,6 +13058,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13125,6 +13201,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
 	if err != nil {
@@ -13271,6 +13348,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13414,6 +13492,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
 	if err != nil {
@@ -13556,6 +13635,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "enterprises/{enterpriseId}/users/{userId}/token")
@@ -13623,8 +13703,10 @@
 	header_      http.Header
 }
 
-// SetAvailableProductSet: Modifies the set of products a user is
-// entitled to access.
+// SetAvailableProductSet: Modifies the set of products that a user is
+// entitled to access (referred to as whitelisted products). Only
+// products that are approved or products that were previously approved
+// (products with revoked approval) can be whitelisted.
 func (r *UsersService) SetAvailableProductSet(enterpriseId string, userId string, productset *ProductSet) *UsersSetAvailableProductSetCall {
 	c := &UsersSetAvailableProductSetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.enterpriseId = enterpriseId
@@ -13664,6 +13746,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.productset)
 	if err != nil {
@@ -13720,7 +13803,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Modifies the set of products a user is entitled to access.",
+	//   "description": "Modifies the set of products that a user is entitled to access (referred to as whitelisted products). Only products that are approved or products that were previously approved (products with revoked approval) can be whitelisted.",
 	//   "httpMethod": "PUT",
 	//   "id": "androidenterprise.users.setAvailableProductSet",
 	//   "parameterOrder": [
@@ -13812,6 +13895,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
 	if err != nil {
diff --git a/androidpublisher/v1.1/androidpublisher-gen.go b/androidpublisher/v1.1/androidpublisher-gen.go
index c4d799f..60c4317 100644
--- a/androidpublisher/v1.1/androidpublisher-gen.go
+++ b/androidpublisher/v1.1/androidpublisher-gen.go
@@ -62,9 +62,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Inapppurchases *InapppurchasesService
 
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewInapppurchasesService(s *Service) *InapppurchasesService {
 	rs := &InapppurchasesService{s: s}
 	return rs
@@ -260,6 +265,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -407,6 +413,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/subscriptions/{subscriptionId}/purchases/{token}/cancel")
@@ -534,6 +541,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/androidpublisher/v1/androidpublisher-gen.go b/androidpublisher/v1/androidpublisher-gen.go
index dfa9987..62566d3 100644
--- a/androidpublisher/v1/androidpublisher-gen.go
+++ b/androidpublisher/v1/androidpublisher-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Purchases *PurchasesService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewPurchasesService(s *Service) *PurchasesService {
 	rs := &PurchasesService{s: s}
 	return rs
@@ -183,6 +188,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/subscriptions/{subscriptionId}/purchases/{token}/cancel")
@@ -310,6 +316,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/androidpublisher/v2/androidpublisher-gen.go b/androidpublisher/v2/androidpublisher-gen.go
index 19217d4..ae0640b 100644
--- a/androidpublisher/v2/androidpublisher-gen.go
+++ b/androidpublisher/v2/androidpublisher-gen.go
@@ -65,9 +65,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Edits *EditsService
 
@@ -87,6 +88,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewEditsService(s *Service) *EditsService {
 	rs := &EditsService{s: s}
 	rs.Apklistings = NewEditsApklistingsService(s)
@@ -2514,6 +2519,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}:commit")
@@ -2649,6 +2655,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}")
@@ -2767,6 +2774,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2904,6 +2912,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.appedit)
 	if err != nil {
@@ -3038,6 +3047,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}:validate")
@@ -3176,6 +3186,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks/{apkVersionCode}/listings/{language}")
@@ -3301,6 +3312,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks/{apkVersionCode}/listings")
@@ -3431,6 +3443,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3598,6 +3611,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3751,6 +3765,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.apklisting)
 	if err != nil {
@@ -3916,6 +3931,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.apklisting)
 	if err != nil {
@@ -4080,6 +4096,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.apksaddexternallyhostedrequest)
 	if err != nil {
@@ -4232,6 +4249,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4420,6 +4438,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks")
@@ -4676,6 +4695,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks/{apkVersionCode}/deobfuscationFiles/{deobfuscationFileType}")
@@ -4908,6 +4928,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5047,6 +5068,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.appdetails)
 	if err != nil {
@@ -5190,6 +5212,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.appdetails)
 	if err != nil {
@@ -5346,6 +5369,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5514,6 +5538,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.expansionfile)
 	if err != nil {
@@ -5687,6 +5712,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.expansionfile)
 	if err != nil {
@@ -5910,6 +5936,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}")
@@ -6138,6 +6165,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings/{language}/{imageType}/{imageId}")
@@ -6293,6 +6321,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings/{language}/{imageType}")
@@ -6478,6 +6507,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6709,6 +6739,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings/{language}/{imageType}")
@@ -6946,6 +6977,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings/{language}")
@@ -7059,6 +7091,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/edits/{editId}/listings")
@@ -7177,6 +7210,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7333,6 +7367,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7474,6 +7509,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.listing)
 	if err != nil {
@@ -7627,6 +7663,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.listing)
 	if err != nil {
@@ -7789,6 +7826,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7947,6 +7985,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testers)
 	if err != nil {
@@ -8110,6 +8149,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testers)
 	if err != nil {
@@ -8283,6 +8323,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8450,6 +8491,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8593,6 +8635,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.track2)
 	if err != nil {
@@ -8760,6 +8803,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.track2)
 	if err != nil {
@@ -8957,6 +9001,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9099,6 +9144,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.inappproductsbatchrequest)
 	if err != nil {
@@ -9217,6 +9263,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/inappproducts/{sku}")
@@ -9333,6 +9380,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9478,6 +9526,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.inappproduct)
 	if err != nil {
@@ -9644,6 +9693,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9799,6 +9849,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.inappproduct)
 	if err != nil {
@@ -9957,6 +10008,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.inappproduct)
 	if err != nil {
@@ -10116,6 +10168,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10263,6 +10316,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:cancel")
@@ -10381,6 +10435,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscriptionpurchasesdeferrequest)
 	if err != nil {
@@ -10545,6 +10600,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10693,6 +10749,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:refund")
@@ -10810,6 +10867,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:revoke")
@@ -10971,6 +11029,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11143,6 +11202,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11316,6 +11376,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11464,6 +11525,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.reviewsreplyrequest)
 	if err != nil {
diff --git a/api-list.json b/api-list.json
index 30384f9..eb6855d 100644
--- a/api-list.json
+++ b/api-list.json
@@ -580,6 +580,21 @@
   },
   {
    "kind": "discovery#directoryItem",
+   "id": "cloudtrace:v1",
+   "name": "cloudtrace",
+   "version": "v1",
+   "title": "Stackdriver Trace API",
+   "description": "Send and retrieve trace data from Stackdriver Trace. Data is generated and available by default for all App Engine applications. Data from other applications can be written to Stackdriver Trace for display, reporting, and analysis.",
+   "discoveryRestUrl": "https://cloudtrace.googleapis.com/$discovery/rest?version=v1",
+   "icons": {
+    "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
+    "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
+   },
+   "documentationLink": "https://cloud.google.com/trace",
+   "preferred": true
+  },
+  {
+   "kind": "discovery#directoryItem",
    "id": "clouduseraccounts:alpha",
    "name": "clouduseraccounts",
    "version": "alpha",
@@ -755,6 +770,66 @@
   },
   {
    "kind": "discovery#directoryItem",
+   "id": "dataflow:v1b3",
+   "name": "dataflow",
+   "version": "v1b3",
+   "title": "Google Dataflow API",
+   "description": "Manages Google Cloud Dataflow projects on Google Cloud Platform.",
+   "discoveryRestUrl": "https://dataflow.googleapis.com/$discovery/rest?version=v1b3",
+   "icons": {
+    "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
+    "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
+   },
+   "documentationLink": "https://cloud.google.com/dataflow",
+   "preferred": true
+  },
+  {
+   "kind": "discovery#directoryItem",
+   "id": "dataproc:v1alpha1",
+   "name": "dataproc",
+   "version": "v1alpha1",
+   "title": "Google Cloud Dataproc API",
+   "description": "Manages Hadoop-based clusters and jobs on Google Cloud Platform.",
+   "discoveryRestUrl": "https://dataproc.googleapis.com/$discovery/rest?version=v1alpha1",
+   "icons": {
+    "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
+    "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
+   },
+   "documentationLink": "https://cloud.google.com/dataproc/",
+   "preferred": false
+  },
+  {
+   "kind": "discovery#directoryItem",
+   "id": "dataproc:v1",
+   "name": "dataproc",
+   "version": "v1",
+   "title": "Google Cloud Dataproc API",
+   "description": "Manages Hadoop-based clusters and jobs on Google Cloud Platform.",
+   "discoveryRestUrl": "https://dataproc.googleapis.com/$discovery/rest?version=v1",
+   "icons": {
+    "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
+    "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
+   },
+   "documentationLink": "https://cloud.google.com/dataproc/",
+   "preferred": true
+  },
+  {
+   "kind": "discovery#directoryItem",
+   "id": "dataproc:v1beta1",
+   "name": "dataproc",
+   "version": "v1beta1",
+   "title": "Google Cloud Dataproc API",
+   "description": "Manages Hadoop-based clusters and jobs on Google Cloud Platform.",
+   "discoveryRestUrl": "https://dataproc.googleapis.com/$discovery/rest?version=v1beta1",
+   "icons": {
+    "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
+    "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
+   },
+   "documentationLink": "https://cloud.google.com/dataproc/",
+   "preferred": false
+  },
+  {
+   "kind": "discovery#directoryItem",
    "id": "datastore:v1",
    "name": "datastore",
    "version": "v1",
@@ -1291,21 +1366,6 @@
   },
   {
    "kind": "discovery#directoryItem",
-   "id": "cloudtrace:v1",
-   "name": "cloudtrace",
-   "version": "v1",
-   "title": "Google Cloud Trace API",
-   "description": "Send and retrieve trace data from Google Cloud Trace. Data is generated and available by default for all App Engine applications. Data from other applications can be written to Cloud Trace for display, reporting, and analysis.",
-   "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/cloudtrace/v1/rest",
-   "icons": {
-    "x16": "http://www.google.com/images/icons/product/search-16.gif",
-    "x32": "http://www.google.com/images/icons/product/search-32.gif"
-   },
-   "documentationLink": "https://cloud.google.com/tools/cloud-trace",
-   "preferred": true
-  },
-  {
-   "kind": "discovery#directoryItem",
    "id": "container:v1",
    "name": "container",
    "version": "v1",
@@ -1321,81 +1381,6 @@
   },
   {
    "kind": "discovery#directoryItem",
-   "id": "dataflow:v1b3",
-   "name": "dataflow",
-   "version": "v1b3",
-   "title": "Google Dataflow API",
-   "description": "Manages Google Cloud Dataflow projects on Google Cloud Platform.",
-   "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/dataflow/v1b3/rest",
-   "icons": {
-    "x16": "http://www.google.com/images/icons/product/search-16.gif",
-    "x32": "http://www.google.com/images/icons/product/search-32.gif"
-   },
-   "documentationLink": "https://cloud.google.com/dataflow",
-   "preferred": true
-  },
-  {
-   "kind": "discovery#directoryItem",
-   "id": "dataproc:v1alpha1",
-   "name": "dataproc",
-   "version": "v1alpha1",
-   "title": "Google Cloud Dataproc API",
-   "description": "An API for managing Hadoop-based clusters and jobs on Google Cloud Platform.",
-   "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/dataproc/v1alpha1/rest",
-   "icons": {
-    "x16": "http://www.google.com/images/icons/product/search-16.gif",
-    "x32": "http://www.google.com/images/icons/product/search-32.gif"
-   },
-   "documentationLink": "https://cloud.google.com/dataproc/",
-   "preferred": false
-  },
-  {
-   "kind": "discovery#directoryItem",
-   "id": "dataproc:v1",
-   "name": "dataproc",
-   "version": "v1",
-   "title": "Google Cloud Dataproc API",
-   "description": "An API for managing Hadoop-based clusters and jobs on Google Cloud Platform.",
-   "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/dataproc/v1/rest",
-   "icons": {
-    "x16": "http://www.google.com/images/icons/product/search-16.gif",
-    "x32": "http://www.google.com/images/icons/product/search-32.gif"
-   },
-   "documentationLink": "https://cloud.google.com/dataproc/",
-   "preferred": true
-  },
-  {
-   "kind": "discovery#directoryItem",
-   "id": "dataproc:v1beta1",
-   "name": "dataproc",
-   "version": "v1beta1",
-   "title": "Google Cloud Dataproc API",
-   "description": "An API for managing Hadoop-based clusters and jobs on Google Cloud Platform.",
-   "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/dataproc/v1beta1/rest",
-   "icons": {
-    "x16": "http://www.google.com/images/icons/product/search-16.gif",
-    "x32": "http://www.google.com/images/icons/product/search-32.gif"
-   },
-   "documentationLink": "https://cloud.google.com/dataproc/",
-   "preferred": false
-  },
-  {
-   "kind": "discovery#directoryItem",
-   "id": "iam:v1",
-   "name": "iam",
-   "version": "v1",
-   "title": "Google Identity and Access Management (IAM) API",
-   "description": "Manages identity and access control for Google Cloud Platform resources, including the creation of service accounts, which you can use to authenticate to Google and make API calls.",
-   "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/iam/v1/rest",
-   "icons": {
-    "x16": "http://www.google.com/images/icons/product/search-16.gif",
-    "x32": "http://www.google.com/images/icons/product/search-32.gif"
-   },
-   "documentationLink": "https://cloud.google.com/iam/",
-   "preferred": true
-  },
-  {
-   "kind": "discovery#directoryItem",
    "id": "partners:v2",
    "name": "partners",
    "version": "v2",
@@ -1411,21 +1396,6 @@
   },
   {
    "kind": "discovery#directoryItem",
-   "id": "people:v1",
-   "name": "people",
-   "version": "v1",
-   "title": "Google People API",
-   "description": "The Google People API service gives access to information about profiles and contacts.",
-   "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/people/v1/rest",
-   "icons": {
-    "x16": "http://www.google.com/images/icons/product/search-16.gif",
-    "x32": "http://www.google.com/images/icons/product/search-32.gif"
-   },
-   "documentationLink": "https://developers.google.com/people/",
-   "preferred": true
-  },
-  {
-   "kind": "discovery#directoryItem",
    "id": "playmoviespartner:v1",
    "name": "playmoviespartner",
    "version": "v1",
@@ -1471,21 +1441,6 @@
   },
   {
    "kind": "discovery#directoryItem",
-   "id": "script:v1",
-   "name": "script",
-   "version": "v1",
-   "title": "Google Apps Script Execution API",
-   "description": "Executes Google Apps Script projects.",
-   "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/script/v1/rest",
-   "icons": {
-    "x16": "http://www.google.com/images/icons/product/search-16.gif",
-    "x32": "http://www.google.com/images/icons/product/search-32.gif"
-   },
-   "documentationLink": "https://developers.google.com/apps-script/execution/rest/v1/scripts/run",
-   "preferred": true
-  },
-  {
-   "kind": "discovery#directoryItem",
    "id": "storagetransfer:v1",
    "name": "storagetransfer",
    "version": "v1",
@@ -1501,6 +1456,21 @@
   },
   {
    "kind": "discovery#directoryItem",
+   "id": "iam:v1",
+   "name": "iam",
+   "version": "v1",
+   "title": "Google Identity and Access Management (IAM) API",
+   "description": "Manages identity and access control for Google Cloud Platform resources, including the creation of service accounts, which you can use to authenticate to Google and make API calls.",
+   "discoveryRestUrl": "https://iam.googleapis.com/$discovery/rest?version=v1",
+   "icons": {
+    "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
+    "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
+   },
+   "documentationLink": "https://cloud.google.com/iam/",
+   "preferred": true
+  },
+  {
+   "kind": "discovery#directoryItem",
    "id": "identitytoolkit:v3",
    "name": "identitytoolkit",
    "version": "v3",
@@ -1736,6 +1706,21 @@
   },
   {
    "kind": "discovery#directoryItem",
+   "id": "people:v1",
+   "name": "people",
+   "version": "v1",
+   "title": "Google People API",
+   "description": "Provides access to information about profiles and contacts.",
+   "discoveryRestUrl": "https://people.googleapis.com/$discovery/rest?version=v1",
+   "icons": {
+    "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
+    "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
+   },
+   "documentationLink": "https://developers.google.com/people/",
+   "preferred": true
+  },
+  {
+   "kind": "discovery#directoryItem",
    "id": "plus:v1",
    "name": "plus",
    "version": "v1",
@@ -2053,6 +2038,36 @@
   },
   {
    "kind": "discovery#directoryItem",
+   "id": "script:v1",
+   "name": "script",
+   "version": "v1",
+   "title": "Google Apps Script Execution API",
+   "description": "Executes Google Apps Script projects.",
+   "discoveryRestUrl": "https://script.googleapis.com/$discovery/rest?version=v1",
+   "icons": {
+    "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
+    "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
+   },
+   "documentationLink": "https://developers.google.com/apps-script/execution/rest/v1/scripts/run",
+   "preferred": true
+  },
+  {
+   "kind": "discovery#directoryItem",
+   "id": "searchconsole:v1",
+   "name": "searchconsole",
+   "version": "v1",
+   "title": "Google Search Console URL Testing Tools API",
+   "description": "Provides tools for running validation tests against single URLs",
+   "discoveryRestUrl": "https://searchconsole.googleapis.com/$discovery/rest?version=v1",
+   "icons": {
+    "x16": "https://www.gstatic.com/images/branding/product/1x/googleg_16dp.png",
+    "x32": "https://www.gstatic.com/images/branding/product/1x/googleg_32dp.png"
+   },
+   "documentationLink": "https://developers.google.com/webmaster-tools/search-console-api/",
+   "preferred": true
+  },
+  {
+   "kind": "discovery#directoryItem",
    "id": "servicecontrol:v1",
    "name": "servicecontrol",
    "version": "v1",
diff --git a/appengine/v1/appengine-gen.go b/appengine/v1/appengine-gen.go
index 8c16dd2..6472c5d 100644
--- a/appengine/v1/appengine-gen.go
+++ b/appengine/v1/appengine-gen.go
@@ -67,9 +67,10 @@
 }
 
 type APIService struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Apps *AppsService
 }
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *APIService) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAppsService(s *APIService) *AppsService {
 	rs := &AppsService{s: s}
 	rs.Locations = NewAppsLocationsService(s)
@@ -2374,6 +2379,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.application)
 	if err != nil {
@@ -2502,6 +2508,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2644,6 +2651,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.application)
 	if err != nil {
@@ -2786,6 +2794,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.repairapplicationrequest)
 	if err != nil {
@@ -2930,6 +2939,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3099,6 +3109,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3279,6 +3290,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3451,6 +3463,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3618,6 +3631,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/apps/{appsId}/services/{servicesId}")
@@ -3762,6 +3776,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3923,6 +3938,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4114,6 +4130,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.service)
 	if err != nil {
@@ -4267,6 +4284,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.version)
 	if err != nil {
@@ -4410,6 +4428,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}")
@@ -4577,6 +4596,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4768,6 +4788,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4976,6 +4997,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.version)
 	if err != nil {
@@ -5142,6 +5164,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.debuginstancerequest)
 	if err != nil {
@@ -5303,6 +5326,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}")
@@ -5467,6 +5491,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5648,6 +5673,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/appengine/v1beta4/appengine-gen.go b/appengine/v1beta4/appengine-gen.go
index 7a162fc..f450271 100644
--- a/appengine/v1beta4/appengine-gen.go
+++ b/appengine/v1beta4/appengine-gen.go
@@ -67,9 +67,10 @@
 }
 
 type APIService struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Apps *AppsService
 }
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *APIService) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAppsService(s *APIService) *AppsService {
 	rs := &AppsService{s: s}
 	rs.Locations = NewAppsLocationsService(s)
@@ -2362,6 +2367,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.application)
 	if err != nil {
@@ -2502,6 +2508,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2647,6 +2654,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.application)
 	if err != nil {
@@ -2796,6 +2804,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2965,6 +2974,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3132,6 +3142,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta4/apps/{appsId}/modules/{modulesId}")
@@ -3276,6 +3287,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3437,6 +3449,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3629,6 +3642,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.module)
 	if err != nil {
@@ -3782,6 +3796,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.version)
 	if err != nil {
@@ -3925,6 +3940,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}")
@@ -4092,6 +4108,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4283,6 +4300,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4491,6 +4509,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.version)
 	if err != nil {
@@ -4657,6 +4676,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.debuginstancerequest)
 	if err != nil {
@@ -4818,6 +4838,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}/instances/{instancesId}")
@@ -4982,6 +5003,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5163,6 +5185,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5354,6 +5377,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5526,6 +5550,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/appengine/v1beta5/appengine-gen.go b/appengine/v1beta5/appengine-gen.go
index 616296d..a827ea4 100644
--- a/appengine/v1beta5/appengine-gen.go
+++ b/appengine/v1beta5/appengine-gen.go
@@ -67,9 +67,10 @@
 }
 
 type APIService struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Apps *AppsService
 }
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *APIService) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAppsService(s *APIService) *AppsService {
 	rs := &AppsService{s: s}
 	rs.Locations = NewAppsLocationsService(s)
@@ -2364,6 +2369,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.application)
 	if err != nil {
@@ -2505,6 +2511,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2650,6 +2657,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.application)
 	if err != nil {
@@ -2799,6 +2807,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2968,6 +2977,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3148,6 +3158,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3320,6 +3331,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3487,6 +3499,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta5/apps/{appsId}/services/{servicesId}")
@@ -3631,6 +3644,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3792,6 +3806,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3984,6 +3999,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.service)
 	if err != nil {
@@ -4137,6 +4153,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.version)
 	if err != nil {
@@ -4280,6 +4297,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}")
@@ -4447,6 +4465,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4638,6 +4657,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4846,6 +4866,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.version)
 	if err != nil {
@@ -5012,6 +5033,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.debuginstancerequest)
 	if err != nil {
@@ -5173,6 +5195,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}")
@@ -5337,6 +5360,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5518,6 +5542,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/appsactivity/v1/appsactivity-gen.go b/appsactivity/v1/appsactivity-gen.go
index fc3e25a..c156f55 100644
--- a/appsactivity/v1/appsactivity-gen.go
+++ b/appsactivity/v1/appsactivity-gen.go
@@ -73,9 +73,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Activities *ActivitiesService
 }
@@ -87,6 +88,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewActivitiesService(s *Service) *ActivitiesService {
 	rs := &ActivitiesService{s: s}
 	return rs
@@ -678,6 +683,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/appstate/v1/appstate-gen.go b/appstate/v1/appstate-gen.go
index d1ad1bf..996eb2f 100644
--- a/appstate/v1/appstate-gen.go
+++ b/appstate/v1/appstate-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	States *StatesService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewStatesService(s *Service) *StatesService {
 	rs := &StatesService{s: s}
 	return rs
@@ -300,6 +305,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "states/{stateKey}/clear")
@@ -436,6 +442,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "states/{stateKey}")
@@ -546,6 +553,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -691,6 +699,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -827,6 +836,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.updaterequest)
 	if err != nil {
diff --git a/bigquery/v2/bigquery-gen.go b/bigquery/v2/bigquery-gen.go
index c50d7b4..d1990b6 100644
--- a/bigquery/v2/bigquery-gen.go
+++ b/bigquery/v2/bigquery-gen.go
@@ -83,9 +83,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Datasets *DatasetsService
 
@@ -105,6 +106,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewDatasetsService(s *Service) *DatasetsService {
 	rs := &DatasetsService{s: s}
 	return rs
@@ -3149,6 +3154,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{projectId}/datasets/{datasetId}")
@@ -3271,6 +3277,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3409,6 +3416,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dataset)
 	if err != nil {
@@ -3584,6 +3592,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3761,6 +3770,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dataset)
 	if err != nil {
@@ -3907,6 +3917,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dataset)
 	if err != nil {
@@ -4052,6 +4063,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{projectId}/jobs/{jobId}/cancel")
@@ -4199,6 +4211,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4378,6 +4391,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4614,6 +4628,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.job)
 	if err != nil {
@@ -4872,6 +4887,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5069,6 +5085,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.queryrequest)
 	if err != nil {
@@ -5226,6 +5243,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5381,6 +5399,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.tabledatainsertallrequest)
 	if err != nil {
@@ -5567,6 +5586,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5754,6 +5774,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{projectId}/datasets/{datasetId}/tables/{tableId}")
@@ -5883,6 +5904,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6031,6 +6053,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.table)
 	if err != nil {
@@ -6199,6 +6222,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6376,6 +6400,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.table)
 	if err != nil {
@@ -6532,6 +6557,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.table)
 	if err != nil {
diff --git a/blogger/v2/blogger-gen.go b/blogger/v2/blogger-gen.go
index 71c2c38..00a784a 100644
--- a/blogger/v2/blogger-gen.go
+++ b/blogger/v2/blogger-gen.go
@@ -65,9 +65,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Blogs *BlogsService
 
@@ -87,6 +88,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewBlogsService(s *Service) *BlogsService {
 	rs := &BlogsService{s: s}
 	return rs
@@ -1179,6 +1184,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1320,6 +1326,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1503,6 +1510,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1693,6 +1701,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1845,6 +1854,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1989,6 +1999,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2162,6 +2173,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2342,6 +2354,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2479,6 +2492,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/blogger/v3/blogger-gen.go b/blogger/v3/blogger-gen.go
index 8a509db..37d49a7 100644
--- a/blogger/v3/blogger-gen.go
+++ b/blogger/v3/blogger-gen.go
@@ -71,9 +71,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	BlogUserInfos *BlogUserInfosService
 
@@ -99,6 +100,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewBlogUserInfosService(s *Service) *BlogUserInfosService {
 	rs := &BlogUserInfosService{s: s}
 	return rs
@@ -1615,6 +1620,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1786,6 +1792,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1956,6 +1963,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2154,6 +2162,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2336,6 +2345,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "blogs/{blogId}/posts/{postId}/comments/{commentId}/approve")
@@ -2479,6 +2489,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "blogs/{blogId}/posts/{postId}/comments/{commentId}")
@@ -2620,6 +2631,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2851,6 +2863,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3126,6 +3139,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3323,6 +3337,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "blogs/{blogId}/posts/{postId}/comments/{commentId}/spam")
@@ -3466,6 +3481,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "blogs/{blogId}/posts/{postId}/comments/{commentId}/removecontent")
@@ -3627,6 +3643,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3770,6 +3787,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "blogs/{blogId}/pages/{pageId}")
@@ -3897,6 +3915,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4055,6 +4074,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.page)
 	if err != nil {
@@ -4247,6 +4267,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4457,6 +4478,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.page)
 	if err != nil {
@@ -4608,6 +4630,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "blogs/{blogId}/pages/{pageId}/publish")
@@ -4741,6 +4764,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "blogs/{blogId}/pages/{pageId}/revert")
@@ -4890,6 +4914,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.page)
 	if err != nil {
@@ -5063,6 +5088,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5304,6 +5330,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5540,6 +5567,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "blogs/{blogId}/posts/{postId}")
@@ -5692,6 +5720,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5891,6 +5920,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6070,6 +6100,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.post)
 	if err != nil {
@@ -6314,6 +6345,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6586,6 +6618,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.post)
 	if err != nil {
@@ -6765,6 +6798,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "blogs/{blogId}/posts/{postId}/publish")
@@ -6904,6 +6938,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "blogs/{blogId}/posts/{postId}/revert")
@@ -7066,6 +7101,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7260,6 +7296,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.post)
 	if err != nil {
@@ -7437,6 +7474,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/books/v1/books-gen.go b/books/v1/books-gen.go
index beaf67f..e55a3c9 100644
--- a/books/v1/books-gen.go
+++ b/books/v1/books-gen.go
@@ -72,9 +72,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Bookshelves *BookshelvesService
 
@@ -108,6 +109,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewBookshelvesService(s *Service) *BookshelvesService {
 	rs := &BookshelvesService{s: s}
 	rs.Volumes = NewBookshelvesVolumesService(s)
@@ -4530,6 +4535,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4687,6 +4693,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4860,6 +4867,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5043,6 +5051,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "cloudloading/addBook")
@@ -5172,6 +5181,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "cloudloading/deleteBook")
@@ -5264,6 +5274,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bookscloudloadingresource)
 	if err != nil {
@@ -5392,6 +5403,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5542,6 +5554,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5725,6 +5738,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5934,6 +5948,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6205,6 +6220,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6455,6 +6471,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6710,6 +6727,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6944,6 +6962,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7070,6 +7089,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "myconfig/releaseDownloadAccess")
@@ -7229,6 +7249,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "myconfig/requestAccess")
@@ -7431,6 +7452,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "myconfig/syncVolumeLicenses")
@@ -7600,6 +7622,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.usersettings)
 	if err != nil {
@@ -7724,6 +7747,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "mylibrary/annotations/{annotationId}")
@@ -7846,6 +7870,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.annotation)
 	if err != nil {
@@ -8062,6 +8087,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8251,6 +8277,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "mylibrary/annotations/summary")
@@ -8388,6 +8415,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.annotation)
 	if err != nil {
@@ -8544,6 +8572,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "mylibrary/bookshelves/{shelf}/addVolume")
@@ -8673,6 +8702,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "mylibrary/bookshelves/{shelf}/clearVolumes")
@@ -8792,6 +8822,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8940,6 +8971,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9068,6 +9100,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "mylibrary/bookshelves/{shelf}/moveVolume")
@@ -9201,6 +9234,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "mylibrary/bookshelves/{shelf}/removeVolume")
@@ -9383,6 +9417,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9581,6 +9616,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9755,6 +9791,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "mylibrary/readingpositions/{volumeId}/setPosition")
@@ -9925,6 +9962,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10074,6 +10112,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10244,6 +10283,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10451,6 +10491,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10636,6 +10677,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "promooffer/accept")
@@ -10799,6 +10841,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "promooffer/dismiss")
@@ -10963,6 +11006,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11117,6 +11161,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11265,6 +11310,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11457,6 +11503,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11752,6 +11799,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12058,6 +12106,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12297,6 +12346,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12520,6 +12570,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12672,6 +12723,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "volumes/recommended/rate")
@@ -12876,6 +12928,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/calendar/v3/calendar-gen.go b/calendar/v3/calendar-gen.go
index 2caa3c3..2af431c 100644
--- a/calendar/v3/calendar-gen.go
+++ b/calendar/v3/calendar-gen.go
@@ -71,9 +71,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Acl *AclService
 
@@ -99,6 +100,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAclService(s *Service) *AclService {
 	rs := &AclService{s: s}
 	return rs
@@ -1872,6 +1877,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "calendars/{calendarId}/acl/{ruleId}")
@@ -1988,6 +1994,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2125,6 +2132,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.aclrule)
 	if err != nil {
@@ -2307,6 +2315,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2482,6 +2491,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.aclrule)
 	if err != nil {
@@ -2625,6 +2635,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.aclrule)
 	if err != nil {
@@ -2806,6 +2817,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -2961,6 +2973,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "users/me/calendarList/{calendarId}")
@@ -3067,6 +3080,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3204,6 +3218,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.calendarlistentry)
 	if err != nil {
@@ -3402,6 +3417,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3596,6 +3612,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.calendarlistentry)
 	if err != nil {
@@ -3744,6 +3761,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.calendarlistentry)
 	if err != nil {
@@ -3945,6 +3963,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -4112,6 +4131,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "calendars/{calendarId}/clear")
@@ -4208,6 +4228,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "calendars/{calendarId}")
@@ -4314,6 +4335,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4441,6 +4463,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.calendar)
 	if err != nil {
@@ -4561,6 +4584,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.calendar)
 	if err != nil {
@@ -4694,6 +4718,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.calendar)
 	if err != nil {
@@ -4825,6 +4850,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -4925,6 +4951,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5048,6 +5075,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "calendars/{calendarId}/events/{eventId}")
@@ -5197,6 +5225,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5360,6 +5389,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.event)
 	if err != nil {
@@ -5523,6 +5553,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.event)
 	if err != nil {
@@ -5761,6 +5792,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6160,6 +6192,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6424,6 +6457,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "calendars/{calendarId}/events/{eventId}/move")
@@ -6608,6 +6642,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.event)
 	if err != nil {
@@ -6778,6 +6813,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "calendars/{calendarId}/events/quickAdd")
@@ -6954,6 +6990,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.event)
 	if err != nil {
@@ -7297,6 +7334,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -7534,6 +7572,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.freebusyrequest)
 	if err != nil {
@@ -7663,6 +7702,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7828,6 +7868,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8011,6 +8052,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
diff --git a/civicinfo/v2/civicinfo-gen.go b/civicinfo/v2/civicinfo-gen.go
index 3c2a869..0a36fba 100644
--- a/civicinfo/v2/civicinfo-gen.go
+++ b/civicinfo/v2/civicinfo-gen.go
@@ -57,9 +57,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Divisions *DivisionsService
 
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewDivisionsService(s *Service) *DivisionsService {
 	rs := &DivisionsService{s: s}
 	return rs
@@ -1495,6 +1500,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1625,6 +1631,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1775,6 +1782,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1986,6 +1994,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2237,6 +2246,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/classroom/v1/classroom-gen.go b/classroom/v1/classroom-gen.go
index 6269fad..10de697 100644
--- a/classroom/v1/classroom-gen.go
+++ b/classroom/v1/classroom-gen.go
@@ -104,9 +104,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Courses *CoursesService
 
@@ -122,6 +123,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewCoursesService(s *Service) *CoursesService {
 	rs := &CoursesService{s: s}
 	rs.Aliases = NewCoursesAliasesService(s)
@@ -2063,6 +2068,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.course)
 	if err != nil {
@@ -2183,6 +2189,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/courses/{id}")
@@ -2320,6 +2327,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2513,6 +2521,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2703,6 +2712,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.course)
 	if err != nil {
@@ -2845,6 +2855,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.course)
 	if err != nil {
@@ -2982,6 +2993,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.coursealias)
 	if err != nil {
@@ -3118,6 +3130,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/courses/{courseId}/aliases/{alias}")
@@ -3281,6 +3294,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3454,6 +3468,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.coursework)
 	if err != nil {
@@ -3596,6 +3611,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/courses/{courseId}/courseWork/{id}")
@@ -3744,6 +3760,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3943,6 +3960,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4153,6 +4171,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.coursework)
 	if err != nil {
@@ -4316,6 +4335,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4543,6 +4563,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4760,6 +4781,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.modifyattachmentsrequest)
 	if err != nil {
@@ -4935,6 +4957,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.studentsubmission)
 	if err != nil {
@@ -5108,6 +5131,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.reclaimstudentsubmissionrequest)
 	if err != nil {
@@ -5274,6 +5298,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.returnstudentsubmissionrequest)
 	if err != nil {
@@ -5438,6 +5463,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.turninstudentsubmissionrequest)
 	if err != nil {
@@ -5605,6 +5631,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.student)
 	if err != nil {
@@ -5749,6 +5776,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/courses/{courseId}/students/{userId}")
@@ -5897,6 +5925,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6065,6 +6094,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6236,6 +6266,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.teacher)
 	if err != nil {
@@ -6376,6 +6407,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/courses/{courseId}/teachers/{userId}")
@@ -6524,6 +6556,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6692,6 +6725,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6861,6 +6895,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/invitations/{id}:accept")
@@ -6992,6 +7027,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.invitation)
 	if err != nil {
@@ -7112,6 +7148,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/invitations/{id}")
@@ -7249,6 +7286,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7423,6 +7461,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7594,6 +7633,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7749,6 +7789,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.guardianinvitation)
 	if err != nil {
@@ -7900,6 +7941,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8093,6 +8135,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8292,6 +8335,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.guardianinvitation)
 	if err != nil {
@@ -8447,6 +8491,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/userProfiles/{studentId}/guardians/{guardianId}")
@@ -8599,6 +8644,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8784,6 +8830,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/cloudbilling/v1/cloudbilling-gen.go b/cloudbilling/v1/cloudbilling-gen.go
index a2a1474..91cd415 100644
--- a/cloudbilling/v1/cloudbilling-gen.go
+++ b/cloudbilling/v1/cloudbilling-gen.go
@@ -62,9 +62,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	BillingAccounts *BillingAccountsService
 
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewBillingAccountsService(s *Service) *BillingAccountsService {
 	rs := &BillingAccountsService{s: s}
 	rs.Projects = NewBillingAccountsProjectsService(s)
@@ -354,6 +359,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -508,6 +514,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -684,6 +691,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -857,6 +865,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1013,6 +1022,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.projectbillinginfo)
 	if err != nil {
diff --git a/cloudbuild/v1/cloudbuild-api.json b/cloudbuild/v1/cloudbuild-api.json
index 6d78a3b..6cee850 100644
--- a/cloudbuild/v1/cloudbuild-api.json
+++ b/cloudbuild/v1/cloudbuild-api.json
@@ -1,346 +1,11 @@
 {
+  "discoveryVersion": "v1",
+  "version_module": "True",
   "schemas": {
-    "BuildOptions": {
-      "properties": {
-        "requestedVerifyOption": {
-          "description": "Requested verifiability options.",
-          "type": "string",
-          "enumDescriptions": [
-            "Not a verifiable build. (default)",
-            "Verified build."
-          ],
-          "enum": [
-            "NOT_VERIFIED",
-            "VERIFIED"
-          ]
-        },
-        "sourceProvenanceHash": {
-          "description": "Requested hash for SourceProvenance.",
-          "type": "array",
-          "items": {
-            "type": "string",
-            "enum": [
-              "NONE",
-              "SHA256"
-            ]
-          },
-          "enumDescriptions": [
-            "No hash requested.",
-            "Use a sha256 hash."
-          ]
-        }
-      },
-      "id": "BuildOptions",
-      "description": "Optional arguments to enable specific features of builds.",
-      "type": "object"
-    },
-    "StorageSource": {
-      "description": "StorageSource describes the location of the source in an archive file in\nGoogle Cloud Storage.",
-      "type": "object",
-      "properties": {
-        "bucket": {
-          "description": "Google Cloud Storage bucket containing source (see\n[Bucket Name\nRequirements](https://cloud.google.com/storage/docs/bucket-naming#requirements)).",
-          "type": "string"
-        },
-        "object": {
-          "type": "string",
-          "description": "Google Cloud Storage object containing source.\n\nThis object must be a gzipped archive file (.tar.gz) containing source to\nbuild."
-        },
-        "generation": {
-          "type": "string",
-          "description": "Google Cloud Storage generation for the object. If the generation is\nomitted, the latest generation will be used.",
-          "format": "int64"
-        }
-      },
-      "id": "StorageSource"
-    },
-    "Results": {
-      "type": "object",
-      "properties": {
-        "buildStepImages": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          },
-          "description": "List of build step digests, in order corresponding to build step indices."
-        },
-        "images": {
-          "description": "Images that were built as a part of the build.",
-          "type": "array",
-          "items": {
-            "$ref": "BuiltImage"
-          }
-        }
-      },
-      "id": "Results",
-      "description": "Results describes the artifacts created by the build pipeline."
-    },
-    "BuildOperationMetadata": {
-      "description": "Metadata for build operations.",
-      "type": "object",
-      "properties": {
-        "build": {
-          "$ref": "Build",
-          "description": "The build that the operation is tracking."
-        }
-      },
-      "id": "BuildOperationMetadata"
-    },
-    "SourceProvenance": {
-      "description": "Provenance of the source. Ways to find the original source, or verify that\nsome source was used for this build.",
-      "type": "object",
-      "properties": {
-        "resolvedRepoSource": {
-          "description": "A copy of the build's source.repo_source, if exists, with any\nrevisions resolved.",
-          "$ref": "RepoSource"
-        },
-        "resolvedStorageSource": {
-          "$ref": "StorageSource",
-          "description": "A copy of the build's source.storage_source, if exists, with any\ngenerations resolved."
-        },
-        "fileHashes": {
-          "type": "object",
-          "additionalProperties": {
-            "$ref": "FileHashes"
-          },
-          "description": "Hash(es) of the build source, which can be used to verify that the original\nsource integrity was maintained in the build. Note that FileHashes will\nonly be populated if BuildOptions has requested a SourceProvenanceHash.\n\nThe keys to this map are file paths used as build source and the values\ncontain the hash values for those files.\n\nIf the build source came in a single package such as a gzipped tarfile\n(.tar.gz), the FileHash will be for the single path to that file.\n@OutputOnly"
-        }
-      },
-      "id": "SourceProvenance"
-    },
-    "CancelOperationRequest": {
-      "description": "The request message for Operations.CancelOperation.",
-      "type": "object",
-      "properties": {},
-      "id": "CancelOperationRequest"
-    },
-    "Operation": {
-      "description": "This resource represents a long-running operation that is the result of a\nnetwork API call.",
-      "type": "object",
-      "properties": {
-        "response": {
-          "description": "The normal response of the operation in case of success.  If the original\nmethod returns no data on success, such as `Delete`, the response is\n`google.protobuf.Empty`.  If the original method is standard\n`Get`/`Create`/`Update`, the response should be the resource.  For other\nmethods, the response should have the type `XxxResponse`, where `Xxx`\nis the original method name.  For example, if the original method name\nis `TakeSnapshot()`, the inferred response type is\n`TakeSnapshotResponse`.",
-          "type": "object",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          }
-        },
-        "name": {
-          "type": "string",
-          "description": "The server-assigned name, which is only unique within the same service that\noriginally returns it. If you use the default HTTP mapping, the\n`name` should have the format of `operations/some/unique/name`."
-        },
-        "error": {
-          "$ref": "Status",
-          "description": "The error result of the operation in case of failure or cancellation."
-        },
-        "metadata": {
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "description": "Service-specific metadata associated with the operation.  It typically\ncontains progress information and common metadata such as create time.\nSome services might not provide such metadata.  Any method that returns a\nlong-running operation should document the metadata type, if any.",
-          "type": "object"
-        },
-        "done": {
-          "type": "boolean",
-          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable."
-        }
-      },
-      "id": "Operation"
-    },
-    "ListBuildTriggersResponse": {
-      "id": "ListBuildTriggersResponse",
-      "description": "Response containing existing BuildTriggers.",
-      "type": "object",
-      "properties": {
-        "triggers": {
-          "description": "BuildTriggers for the project, sorted by create_time descending.",
-          "type": "array",
-          "items": {
-            "$ref": "BuildTrigger"
-          }
-        }
-      }
-    },
-    "BuiltImage": {
-      "description": "BuiltImage describes an image built by the pipeline.",
-      "type": "object",
-      "properties": {
-        "name": {
-          "description": "Name used to push the container image to Google Container Registry, as\npresented to `docker push`.",
-          "type": "string"
-        },
-        "digest": {
-          "description": "Docker Registry 2.0 digest.",
-          "type": "string"
-        }
-      },
-      "id": "BuiltImage"
-    },
-    "BuildStep": {
-      "id": "BuildStep",
-      "description": "BuildStep describes a step to perform in the build pipeline.",
-      "type": "object",
-      "properties": {
-        "dir": {
-          "description": "Working directory (relative to project source root) to use when running\nthis operation's container.",
-          "type": "string"
-        },
-        "env": {
-          "description": "A list of environment variable definitions to be used when running a step.\n\nThe elements are of the form \"KEY=VALUE\" for the environment variable \"KEY\"\nbeing given the value \"VALUE\".",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "waitFor": {
-          "description": "The ID(s) of the step(s) that this build step depends on.\nThis build step will not start until all the build steps in wait_for\nhave completed successfully. If wait_for is empty, this build step will\nstart when all previous build steps in the Build.Steps list have completed\nsuccessfully.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "args": {
-          "description": "A list of arguments that will be presented to the step when it is started.\n\nIf the image used to run the step's container has an entrypoint, these args\nwill be used as arguments to that entrypoint. If the image does not define\nan entrypoint, the first element in args will be used as the entrypoint,\nand the remainder will be used as arguments.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "name": {
-          "description": "The name of the container image that will run this particular build step.\n\nIf the image is already available in the host's Docker daemon's cache, it\nwill be run directly. If not, the host will attempt to pull the image\nfirst, using the builder service account's credentials if necessary.\n\nThe Docker daemon's cache will already have the latest versions of all of\nthe officially supported build steps\n(https://github.com/GoogleCloudPlatform/cloud-builders). The Docker daemon\nwill also have cached many of the layers for some popular images, like\n\"ubuntu\", \"debian\", but they will be refreshed at the time you attempt to\nuse them.\n\nIf you built an image in a previous build step, it will be stored in the\nhost's Docker daemon's cache and is available to use as the name for a\nlater build step.",
-          "type": "string"
-        },
-        "entrypoint": {
-          "description": "Optional entrypoint to be used instead of the build step image's default\nIf unset, the image's default will be used.",
-          "type": "string"
-        },
-        "id": {
-          "description": "Optional unique identifier for this build step, used in wait_for to\nreference this build step as a dependency.",
-          "type": "string"
-        }
-      }
-    },
-    "RepoSource": {
-      "type": "object",
-      "properties": {
-        "tagName": {
-          "description": "Name of the tag to build.",
-          "type": "string"
-        },
-        "commitSha": {
-          "description": "Explicit commit SHA to build.",
-          "type": "string"
-        },
-        "projectId": {
-          "description": "ID of the project that owns the repo. If omitted, the project ID requesting\nthe build is assumed.",
-          "type": "string"
-        },
-        "repoName": {
-          "description": "Name of the repo. If omitted, the name \"default\" is assumed.",
-          "type": "string"
-        },
-        "branchName": {
-          "description": "Name of the branch to build.",
-          "type": "string"
-        }
-      },
-      "id": "RepoSource",
-      "description": "RepoSource describes the location of the source in a Google Cloud Source\nRepository."
-    },
-    "Hash": {
-      "id": "Hash",
-      "description": "Container message for hash values.",
-      "type": "object",
-      "properties": {
-        "type": {
-          "type": "string",
-          "enumDescriptions": [
-            "No hash requested.",
-            "Use a sha256 hash."
-          ],
-          "enum": [
-            "NONE",
-            "SHA256"
-          ],
-          "description": "The type of hash that was performed."
-        },
-        "value": {
-          "description": "The hash value.",
-          "format": "byte",
-          "type": "string"
-        }
-      }
-    },
-    "FileHashes": {
-      "description": "Container message for hashes of byte content of files, used in\nSourceProvenance messages to verify integrity of source input to the build.",
-      "type": "object",
-      "properties": {
-        "fileHash": {
-          "description": "Collection of file hashes.",
-          "type": "array",
-          "items": {
-            "$ref": "Hash"
-          }
-        }
-      },
-      "id": "FileHashes"
-    },
-    "Status": {
-      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
-      "type": "object",
-      "properties": {
-        "code": {
-          "description": "The status code, which should be an enum value of google.rpc.Code.",
-          "format": "int32",
-          "type": "integer"
-        },
-        "message": {
-          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
-          "type": "string"
-        },
-        "details": {
-          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
-          "type": "array",
-          "items": {
-            "type": "object",
-            "additionalProperties": {
-              "type": "any",
-              "description": "Properties of the object. Contains field @type with type URL."
-            }
-          }
-        }
-      },
-      "id": "Status"
-    },
-    "Empty": {
-      "properties": {},
-      "id": "Empty",
-      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
-      "type": "object"
-    },
     "BuildTrigger": {
       "description": "Configuration for an automated build in response to source repository\nchanges.",
       "type": "object",
       "properties": {
-        "disabled": {
-          "description": "If true, the trigger will never result in a build.",
-          "type": "boolean"
-        },
-        "createTime": {
-          "description": "Time when the trigger was created.\n\n@OutputOnly",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "filename": {
-          "description": "Path, from the source root, to a file whose contents is used for the\ntemplate.",
-          "type": "string"
-        },
-        "triggerTemplate": {
-          "$ref": "RepoSource",
-          "description": "Template describing the types of source changes to trigger a build.\n\nBranch and tag names in trigger templates are interpreted as regular\nexpressions. Any branch or tag change that matches that regular expression\nwill trigger a build."
-        },
         "id": {
           "description": "Unique identifier of the trigger.\n\n@OutputOnly",
           "type": "string"
@@ -349,9 +14,33 @@
           "$ref": "Build",
           "description": "Contents of the build template."
         },
+        "substitutions": {
+          "description": "Substitutions data for Build resource.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
         "description": {
           "description": "Human-readable description of this trigger.",
           "type": "string"
+        },
+        "createTime": {
+          "description": "Time when the trigger was created.\n\n@OutputOnly",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "disabled": {
+          "description": "If true, the trigger will never result in a build.",
+          "type": "boolean"
+        },
+        "triggerTemplate": {
+          "$ref": "RepoSource",
+          "description": "Template describing the types of source changes to trigger a build.\n\nBranch and tag names in trigger templates are interpreted as regular\nexpressions. Any branch or tag change that matches that regular expression\nwill trigger a build."
+        },
+        "filename": {
+          "description": "Path, from the source root, to a file whose contents is used for the\ntemplate.",
+          "type": "string"
         }
       },
       "id": "BuildTrigger"
@@ -360,6 +49,50 @@
       "description": "A build resource in the Container Builder API.\n\nAt a high level, a Build describes where to find source code, how to build\nit (for example, the builder image to run on the source), and what tag to\napply to the built image when it is pushed to Google Container Registry.\n\nFields can include the following variables which will be expanded when the\nbuild is created:\n\n- $PROJECT_ID: the project ID of the build.\n- $BUILD_ID: the autogenerated ID of the build.\n- $REPO_NAME: the source repository name specified by RepoSource.\n- $BRANCH_NAME: the branch name specified by RepoSource.\n- $TAG_NAME: the tag name specified by RepoSource.\n- $REVISION_ID or $COMMIT_SHA: the commit SHA specified by RepoSource or\n  resolved from the specified branch or tag.",
       "type": "object",
       "properties": {
+        "results": {
+          "$ref": "Results",
+          "description": "Results of the build.\n@OutputOnly"
+        },
+        "logsBucket": {
+          "description": "Google Cloud Storage bucket where logs should be written (see\n[Bucket Name\nRequirements](https://cloud.google.com/storage/docs/bucket-naming#requirements)).\nLogs file names will be of the format `${logs_bucket}/log-${build_id}.txt`.",
+          "type": "string"
+        },
+        "steps": {
+          "type": "array",
+          "items": {
+            "$ref": "BuildStep"
+          },
+          "description": "Describes the operations to be performed on the workspace."
+        },
+        "buildTriggerId": {
+          "description": "The ID of the BuildTrigger that triggered this build, if it was\ntriggered automatically.\n@OutputOnly",
+          "type": "string"
+        },
+        "id": {
+          "description": "Unique identifier of the build.\n@OutputOnly",
+          "type": "string"
+        },
+        "substitutions": {
+          "description": "Substitutions data for Build resource.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "startTime": {
+          "description": "Time at which execution of the build was started.\n@OutputOnly",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "sourceProvenance": {
+          "$ref": "SourceProvenance",
+          "description": "A permanent fixed identifier for source.\n@OutputOnly"
+        },
+        "createTime": {
+          "description": "Time at which the request to create the build was received.\n@OutputOnly",
+          "format": "google-datetime",
+          "type": "string"
+        },
         "images": {
           "description": "A list of images to be pushed upon the successful completion of all build\nsteps.\n\nThe images will be pushed using the builder service account's credentials.\n\nThe digests of the pushed images will be stored in the Build resource's\nresults field.\n\nIf any of the images fail to be pushed, the build is marked FAILURE.",
           "type": "array",
@@ -368,8 +101,8 @@
           }
         },
         "projectId": {
-          "description": "ID of the project.\n@OutputOnly.",
-          "type": "string"
+          "type": "string",
+          "description": "ID of the project.\n@OutputOnly."
         },
         "finishTime": {
           "description": "Time at which execution of the build was finished.\n\nThe difference between finish_time and start_time is the duration of the\nbuild's execution.\n@OutputOnly",
@@ -380,19 +113,21 @@
           "description": "URL to logs for this build in Google Cloud Logging.\n@OutputOnly",
           "type": "string"
         },
-        "options": {
-          "$ref": "BuildOptions",
-          "description": "Special options for this build."
-        },
         "source": {
           "$ref": "Source",
           "description": "Describes where to find the source files to build."
         },
-        "statusDetail": {
-          "description": "Customer-readable message about the current status.\n@OutputOnly",
-          "type": "string"
+        "options": {
+          "description": "Special options for this build.",
+          "$ref": "BuildOptions"
+        },
+        "timeout": {
+          "type": "string",
+          "description": "Amount of time that this build should be allowed to run, to second\ngranularity. If this amount of time elapses, work on the build will cease\nand the build status will be TIMEOUT.\n\nDefault time is ten minutes.",
+          "format": "google-duration"
         },
         "status": {
+          "description": "Status of the build.\n@OutputOnly",
           "type": "string",
           "enumDescriptions": [
             "Status of the build is unknown.",
@@ -413,49 +148,10 @@
             "INTERNAL_ERROR",
             "TIMEOUT",
             "CANCELLED"
-          ],
-          "description": "Status of the build.\n@OutputOnly"
+          ]
         },
-        "timeout": {
-          "description": "Amount of time that this build should be allowed to run, to second\ngranularity. If this amount of time elapses, work on the build will cease\nand the build status will be TIMEOUT.\n\nDefault time is ten minutes.",
-          "format": "google-duration",
-          "type": "string"
-        },
-        "results": {
-          "description": "Results of the build.\n@OutputOnly",
-          "$ref": "Results"
-        },
-        "logsBucket": {
-          "description": "Google Cloud Storage bucket where logs should be written (see\n[Bucket Name\nRequirements](https://cloud.google.com/storage/docs/bucket-naming#requirements)).\nLogs file names will be of the format `${logs_bucket}/log-${build_id}.txt`.",
-          "type": "string"
-        },
-        "steps": {
-          "description": "Describes the operations to be performed on the workspace.",
-          "type": "array",
-          "items": {
-            "$ref": "BuildStep"
-          }
-        },
-        "buildTriggerId": {
-          "description": "The ID of the BuildTrigger that triggered this build, if it was\ntriggered automatically.\n@OutputOnly",
-          "type": "string"
-        },
-        "id": {
-          "description": "Unique identifier of the build.\n@OutputOnly",
-          "type": "string"
-        },
-        "startTime": {
-          "description": "Time at which execution of the build was started.\n@OutputOnly",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "sourceProvenance": {
-          "description": "A permanent fixed identifier for source.\n@OutputOnly",
-          "$ref": "SourceProvenance"
-        },
-        "createTime": {
-          "description": "Time at which the request to create the build was received.\n@OutputOnly",
-          "format": "google-datetime",
+        "statusDetail": {
+          "description": "Customer-readable message about the current status.\n@OutputOnly",
           "type": "string"
         }
       },
@@ -489,16 +185,16 @@
       "description": "The response message for Operations.ListOperations.",
       "type": "object",
       "properties": {
-        "nextPageToken": {
-          "type": "string",
-          "description": "The standard List next-page token."
-        },
         "operations": {
+          "description": "A list of operations that matches the specified filter in the request.",
           "type": "array",
           "items": {
             "$ref": "Operation"
-          },
-          "description": "A list of operations that matches the specified filter in the request."
+          }
+        },
+        "nextPageToken": {
+          "description": "The standard List next-page token.",
+          "type": "string"
         }
       },
       "id": "ListOperationsResponse"
@@ -508,8 +204,8 @@
       "type": "object",
       "properties": {
         "storageSource": {
-          "description": "If provided, get the source from this location in in Google Cloud\nStorage.",
-          "$ref": "StorageSource"
+          "$ref": "StorageSource",
+          "description": "If provided, get the source from this location in in Google Cloud\nStorage."
         },
         "repoSource": {
           "description": "If provided, get source from this location in a Cloud Repo.",
@@ -517,11 +213,331 @@
         }
       },
       "id": "Source"
+    },
+    "BuildOptions": {
+      "properties": {
+        "sourceProvenanceHash": {
+          "description": "Requested hash for SourceProvenance.",
+          "type": "array",
+          "items": {
+            "enum": [
+              "NONE",
+              "SHA256"
+            ],
+            "type": "string"
+          },
+          "enumDescriptions": [
+            "No hash requested.",
+            "Use a sha256 hash."
+          ]
+        },
+        "requestedVerifyOption": {
+          "enum": [
+            "NOT_VERIFIED",
+            "VERIFIED"
+          ],
+          "description": "Requested verifiability options.",
+          "type": "string",
+          "enumDescriptions": [
+            "Not a verifiable build. (default)",
+            "Verified build."
+          ]
+        }
+      },
+      "id": "BuildOptions",
+      "description": "Optional arguments to enable specific features of builds.",
+      "type": "object"
+    },
+    "StorageSource": {
+      "id": "StorageSource",
+      "description": "StorageSource describes the location of the source in an archive file in\nGoogle Cloud Storage.",
+      "type": "object",
+      "properties": {
+        "generation": {
+          "description": "Google Cloud Storage generation for the object. If the generation is\nomitted, the latest generation will be used.",
+          "format": "int64",
+          "type": "string"
+        },
+        "bucket": {
+          "description": "Google Cloud Storage bucket containing source (see\n[Bucket Name\nRequirements](https://cloud.google.com/storage/docs/bucket-naming#requirements)).",
+          "type": "string"
+        },
+        "object": {
+          "description": "Google Cloud Storage object containing source.\n\nThis object must be a gzipped archive file (.tar.gz) containing source to\nbuild.",
+          "type": "string"
+        }
+      }
+    },
+    "Results": {
+      "description": "Results describes the artifacts created by the build pipeline.",
+      "type": "object",
+      "properties": {
+        "buildStepImages": {
+          "description": "List of build step digests, in order corresponding to build step indices.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "images": {
+          "description": "Images that were built as a part of the build.",
+          "type": "array",
+          "items": {
+            "$ref": "BuiltImage"
+          }
+        }
+      },
+      "id": "Results"
+    },
+    "BuildOperationMetadata": {
+      "description": "Metadata for build operations.",
+      "type": "object",
+      "properties": {
+        "build": {
+          "description": "The build that the operation is tracking.",
+          "$ref": "Build"
+        }
+      },
+      "id": "BuildOperationMetadata"
+    },
+    "SourceProvenance": {
+      "description": "Provenance of the source. Ways to find the original source, or verify that\nsome source was used for this build.",
+      "type": "object",
+      "properties": {
+        "resolvedRepoSource": {
+          "description": "A copy of the build's source.repo_source, if exists, with any\nrevisions resolved.",
+          "$ref": "RepoSource"
+        },
+        "resolvedStorageSource": {
+          "$ref": "StorageSource",
+          "description": "A copy of the build's source.storage_source, if exists, with any\ngenerations resolved."
+        },
+        "fileHashes": {
+          "additionalProperties": {
+            "$ref": "FileHashes"
+          },
+          "description": "Hash(es) of the build source, which can be used to verify that the original\nsource integrity was maintained in the build. Note that FileHashes will\nonly be populated if BuildOptions has requested a SourceProvenanceHash.\n\nThe keys to this map are file paths used as build source and the values\ncontain the hash values for those files.\n\nIf the build source came in a single package such as a gzipped tarfile\n(.tar.gz), the FileHash will be for the single path to that file.\n@OutputOnly",
+          "type": "object"
+        }
+      },
+      "id": "SourceProvenance"
+    },
+    "CancelOperationRequest": {
+      "id": "CancelOperationRequest",
+      "description": "The request message for Operations.CancelOperation.",
+      "type": "object",
+      "properties": {}
+    },
+    "ListBuildTriggersResponse": {
+      "id": "ListBuildTriggersResponse",
+      "description": "Response containing existing BuildTriggers.",
+      "type": "object",
+      "properties": {
+        "triggers": {
+          "description": "BuildTriggers for the project, sorted by create_time descending.",
+          "type": "array",
+          "items": {
+            "$ref": "BuildTrigger"
+          }
+        }
+      }
+    },
+    "Operation": {
+      "description": "This resource represents a long-running operation that is the result of a\nnetwork API call.",
+      "type": "object",
+      "properties": {
+        "done": {
+          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
+          "type": "boolean"
+        },
+        "response": {
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "The normal response of the operation in case of success.  If the original\nmethod returns no data on success, such as `Delete`, the response is\n`google.protobuf.Empty`.  If the original method is standard\n`Get`/`Create`/`Update`, the response should be the resource.  For other\nmethods, the response should have the type `XxxResponse`, where `Xxx`\nis the original method name.  For example, if the original method name\nis `TakeSnapshot()`, the inferred response type is\n`TakeSnapshotResponse`."
+        },
+        "name": {
+          "type": "string",
+          "description": "The server-assigned name, which is only unique within the same service that\noriginally returns it. If you use the default HTTP mapping, the\n`name` should have the format of `operations/some/unique/name`."
+        },
+        "error": {
+          "description": "The error result of the operation in case of failure or cancellation.",
+          "$ref": "Status"
+        },
+        "metadata": {
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "Service-specific metadata associated with the operation.  It typically\ncontains progress information and common metadata such as create time.\nSome services might not provide such metadata.  Any method that returns a\nlong-running operation should document the metadata type, if any."
+        }
+      },
+      "id": "Operation"
+    },
+    "BuiltImage": {
+      "properties": {
+        "name": {
+          "type": "string",
+          "description": "Name used to push the container image to Google Container Registry, as\npresented to `docker push`."
+        },
+        "digest": {
+          "description": "Docker Registry 2.0 digest.",
+          "type": "string"
+        }
+      },
+      "id": "BuiltImage",
+      "description": "BuiltImage describes an image built by the pipeline.",
+      "type": "object"
+    },
+    "BuildStep": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The name of the container image that will run this particular build step.\n\nIf the image is already available in the host's Docker daemon's cache, it\nwill be run directly. If not, the host will attempt to pull the image\nfirst, using the builder service account's credentials if necessary.\n\nThe Docker daemon's cache will already have the latest versions of all of\nthe officially supported build steps\n(https://github.com/GoogleCloudPlatform/cloud-builders). The Docker daemon\nwill also have cached many of the layers for some popular images, like\n\"ubuntu\", \"debian\", but they will be refreshed at the time you attempt to\nuse them.\n\nIf you built an image in a previous build step, it will be stored in the\nhost's Docker daemon's cache and is available to use as the name for a\nlater build step.",
+          "type": "string"
+        },
+        "entrypoint": {
+          "description": "Optional entrypoint to be used instead of the build step image's default\nIf unset, the image's default will be used.",
+          "type": "string"
+        },
+        "id": {
+          "description": "Optional unique identifier for this build step, used in wait_for to\nreference this build step as a dependency.",
+          "type": "string"
+        },
+        "dir": {
+          "description": "Working directory (relative to project source root) to use when running\nthis operation's container.",
+          "type": "string"
+        },
+        "env": {
+          "description": "A list of environment variable definitions to be used when running a step.\n\nThe elements are of the form \"KEY=VALUE\" for the environment variable \"KEY\"\nbeing given the value \"VALUE\".",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "waitFor": {
+          "description": "The ID(s) of the step(s) that this build step depends on.\nThis build step will not start until all the build steps in wait_for\nhave completed successfully. If wait_for is empty, this build step will\nstart when all previous build steps in the Build.Steps list have completed\nsuccessfully.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "args": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "A list of arguments that will be presented to the step when it is started.\n\nIf the image used to run the step's container has an entrypoint, these args\nwill be used as arguments to that entrypoint. If the image does not define\nan entrypoint, the first element in args will be used as the entrypoint,\nand the remainder will be used as arguments."
+        }
+      },
+      "id": "BuildStep",
+      "description": "BuildStep describes a step to perform in the build pipeline."
+    },
+    "RepoSource": {
+      "description": "RepoSource describes the location of the source in a Google Cloud Source\nRepository.",
+      "type": "object",
+      "properties": {
+        "projectId": {
+          "type": "string",
+          "description": "ID of the project that owns the repo. If omitted, the project ID requesting\nthe build is assumed."
+        },
+        "repoName": {
+          "type": "string",
+          "description": "Name of the repo. If omitted, the name \"default\" is assumed."
+        },
+        "branchName": {
+          "type": "string",
+          "description": "Name of the branch to build."
+        },
+        "tagName": {
+          "description": "Name of the tag to build.",
+          "type": "string"
+        },
+        "commitSha": {
+          "description": "Explicit commit SHA to build.",
+          "type": "string"
+        }
+      },
+      "id": "RepoSource"
+    },
+    "Hash": {
+      "description": "Container message for hash values.",
+      "type": "object",
+      "properties": {
+        "type": {
+          "description": "The type of hash that was performed.",
+          "type": "string",
+          "enumDescriptions": [
+            "No hash requested.",
+            "Use a sha256 hash."
+          ],
+          "enum": [
+            "NONE",
+            "SHA256"
+          ]
+        },
+        "value": {
+          "description": "The hash value.",
+          "format": "byte",
+          "type": "string"
+        }
+      },
+      "id": "Hash"
+    },
+    "FileHashes": {
+      "id": "FileHashes",
+      "description": "Container message for hashes of byte content of files, used in\nSourceProvenance messages to verify integrity of source input to the build.",
+      "type": "object",
+      "properties": {
+        "fileHash": {
+          "type": "array",
+          "items": {
+            "$ref": "Hash"
+          },
+          "description": "Collection of file hashes."
+        }
+      }
+    },
+    "Status": {
+      "type": "object",
+      "properties": {
+        "code": {
+          "description": "The status code, which should be an enum value of google.rpc.Code.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "message": {
+          "type": "string",
+          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client."
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "additionalProperties": {
+              "type": "any",
+              "description": "Properties of the object. Contains field @type with type URL."
+            },
+            "type": "object"
+          },
+          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use."
+        }
+      },
+      "id": "Status",
+      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons."
+    },
+    "Empty": {
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
+      "type": "object",
+      "properties": {},
+      "id": "Empty"
     }
   },
   "icons": {
-    "x32": "http://www.google.com/images/icons/product/search-32.gif",
-    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
   },
   "protocol": "rest",
   "canonicalName": "Cloud Build",
@@ -541,24 +557,120 @@
   "title": "Google Cloud Container Builder API",
   "ownerName": "Google",
   "resources": {
+    "operations": {
+      "methods": {
+        "cancel": {
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameterOrder": [
+            "name"
+          ],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "name": {
+              "required": true,
+              "type": "string",
+              "pattern": "^operations/.+$",
+              "location": "path",
+              "description": "The name of the operation resource to be cancelled."
+            }
+          },
+          "flatPath": "v1/operations/{operationsId}:cancel",
+          "path": "v1/{+name}:cancel",
+          "id": "cloudbuild.operations.cancel",
+          "description": "Starts asynchronous cancellation on a long-running operation.  The server\nmakes a best effort to cancel the operation, but success is not\nguaranteed.  If the server doesn't support this method, it returns\n`google.rpc.Code.UNIMPLEMENTED`.  Clients can use\nOperations.GetOperation or\nother methods to check whether the cancellation succeeded or whether the\noperation completed despite cancellation. On successful cancellation,\nthe operation is not deleted; instead, it becomes an operation with\nan Operation.error value with a google.rpc.Status.code of 1,\ncorresponding to `Code.CANCELLED`.",
+          "request": {
+            "$ref": "CancelOperationRequest"
+          }
+        },
+        "list": {
+          "parameters": {
+            "name": {
+              "pattern": "^operations$",
+              "location": "path",
+              "description": "The name of the operation collection.",
+              "required": true,
+              "type": "string"
+            },
+            "pageToken": {
+              "location": "query",
+              "description": "The standard list page token.",
+              "type": "string"
+            },
+            "pageSize": {
+              "type": "integer",
+              "location": "query",
+              "description": "The standard list page size.",
+              "format": "int32"
+            },
+            "filter": {
+              "location": "query",
+              "description": "The standard list filter.",
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "flatPath": "v1/operations",
+          "path": "v1/{+name}",
+          "id": "cloudbuild.operations.list",
+          "description": "Lists operations that match the specified filter in the request. If the\nserver doesn't support this method, it returns `UNIMPLEMENTED`.\n\nNOTE: the `name` binding below allows API services to override the binding\nto use different resource name schemes, such as `users/*/operations`.",
+          "response": {
+            "$ref": "ListOperationsResponse"
+          },
+          "parameterOrder": [
+            "name"
+          ],
+          "httpMethod": "GET"
+        },
+        "get": {
+          "httpMethod": "GET",
+          "parameterOrder": [
+            "name"
+          ],
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "name": {
+              "pattern": "^operations/.+$",
+              "location": "path",
+              "description": "The name of the operation resource.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1/operations/{operationsId}",
+          "id": "cloudbuild.operations.get",
+          "path": "v1/{+name}",
+          "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice."
+        }
+      }
+    },
     "projects": {
       "resources": {
         "builds": {
           "methods": {
-            "cancel": {
-              "flatPath": "v1/projects/{projectId}/builds/{id}:cancel",
-              "path": "v1/projects/{projectId}/builds/{id}:cancel",
-              "id": "cloudbuild.projects.builds.cancel",
-              "description": "Cancels a requested build in progress.",
+            "create": {
+              "path": "v1/projects/{projectId}/builds",
+              "id": "cloudbuild.projects.builds.create",
+              "description": "Starts a build with the specified configuration.\n\nThe long-running Operation returned by this method will include the ID of\nthe build, which can be passed to GetBuild to determine its status (e.g.,\nsuccess or failure).",
               "request": {
-                "$ref": "CancelBuildRequest"
-              },
-              "response": {
                 "$ref": "Build"
               },
+              "response": {
+                "$ref": "Operation"
+              },
               "parameterOrder": [
-                "projectId",
-                "id"
+                "projectId"
               ],
               "httpMethod": "POST",
               "scopes": [
@@ -566,22 +678,20 @@
               ],
               "parameters": {
                 "projectId": {
-                  "description": "ID of the project.",
-                  "required": true,
-                  "type": "string",
-                  "location": "path"
-                },
-                "id": {
                   "location": "path",
-                  "description": "ID of the build.",
+                  "description": "ID of the project.",
                   "required": true,
                   "type": "string"
                 }
-              }
+              },
+              "flatPath": "v1/projects/{projectId}/builds"
             },
-            "get": {
-              "description": "Returns information about a previously requested build.\n\nThe Build that is returned includes its status (e.g., success or failure,\nor in-progress), and timing information.",
-              "httpMethod": "GET",
+            "cancel": {
+              "request": {
+                "$ref": "CancelBuildRequest"
+              },
+              "description": "Cancels a requested build in progress.",
+              "httpMethod": "POST",
               "parameterOrder": [
                 "projectId",
                 "id"
@@ -606,68 +716,69 @@
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform"
               ],
+              "flatPath": "v1/projects/{projectId}/builds/{id}:cancel",
+              "id": "cloudbuild.projects.builds.cancel",
+              "path": "v1/projects/{projectId}/builds/{id}:cancel"
+            },
+            "get": {
+              "description": "Returns information about a previously requested build.\n\nThe Build that is returned includes its status (e.g., success or failure,\nor in-progress), and timing information.",
+              "response": {
+                "$ref": "Build"
+              },
+              "parameterOrder": [
+                "projectId",
+                "id"
+              ],
+              "httpMethod": "GET",
+              "parameters": {
+                "projectId": {
+                  "location": "path",
+                  "description": "ID of the project.",
+                  "required": true,
+                  "type": "string"
+                },
+                "id": {
+                  "description": "ID of the build.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
               "flatPath": "v1/projects/{projectId}/builds/{id}",
-              "id": "cloudbuild.projects.builds.get",
-              "path": "v1/projects/{projectId}/builds/{id}"
+              "path": "v1/projects/{projectId}/builds/{id}",
+              "id": "cloudbuild.projects.builds.get"
             },
             "list": {
-              "parameters": {
-                "projectId": {
-                  "location": "path",
-                  "description": "ID of the project.",
-                  "required": true,
-                  "type": "string"
-                },
-                "filter": {
-                  "type": "string",
-                  "location": "query",
-                  "description": "The raw filter text to constrain the results."
-                },
-                "pageToken": {
-                  "location": "query",
-                  "description": "Token to provide to skip to a particular spot in the list.",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "description": "Number of results to return in the list.",
-                  "format": "int32",
-                  "type": "integer",
-                  "location": "query"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "flatPath": "v1/projects/{projectId}/builds",
-              "id": "cloudbuild.projects.builds.list",
-              "path": "v1/projects/{projectId}/builds",
-              "description": "Lists previously requested builds.\n\nPreviously requested builds may still be in-progress, or may have finished\nsuccessfully or unsuccessfully.",
               "httpMethod": "GET",
               "response": {
                 "$ref": "ListBuildsResponse"
               },
               "parameterOrder": [
                 "projectId"
-              ]
-            },
-            "create": {
-              "id": "cloudbuild.projects.builds.create",
-              "path": "v1/projects/{projectId}/builds",
-              "description": "Starts a build with the specified configuration.\n\nThe long-running Operation returned by this method will include the ID of\nthe build, which can be passed to GetBuild to determine its status (e.g.,\nsuccess or failure).",
-              "request": {
-                "$ref": "Build"
-              },
-              "httpMethod": "POST",
-              "parameterOrder": [
-                "projectId"
               ],
-              "response": {
-                "$ref": "Operation"
-              },
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform"
               ],
               "parameters": {
+                "filter": {
+                  "location": "query",
+                  "description": "The raw filter text to constrain the results.",
+                  "type": "string"
+                },
+                "pageToken": {
+                  "type": "string",
+                  "location": "query",
+                  "description": "Token to provide to skip to a particular spot in the list."
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "Number of results to return in the list.",
+                  "format": "int32",
+                  "type": "integer"
+                },
                 "projectId": {
                   "location": "path",
                   "description": "ID of the project.",
@@ -675,30 +786,33 @@
                   "type": "string"
                 }
               },
-              "flatPath": "v1/projects/{projectId}/builds"
+              "flatPath": "v1/projects/{projectId}/builds",
+              "id": "cloudbuild.projects.builds.list",
+              "path": "v1/projects/{projectId}/builds",
+              "description": "Lists previously requested builds.\n\nPreviously requested builds may still be in-progress, or may have finished\nsuccessfully or unsuccessfully."
             }
           }
         },
         "triggers": {
           "methods": {
-            "delete": {
+            "get": {
               "response": {
-                "$ref": "Empty"
+                "$ref": "BuildTrigger"
               },
               "parameterOrder": [
                 "projectId",
                 "triggerId"
               ],
-              "httpMethod": "DELETE",
+              "httpMethod": "GET",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform"
               ],
               "parameters": {
                 "triggerId": {
+                  "description": "ID of the BuildTrigger to get.",
                   "required": true,
                   "type": "string",
-                  "location": "path",
-                  "description": "ID of the BuildTrigger to delete."
+                  "location": "path"
                 },
                 "projectId": {
                   "required": true,
@@ -709,51 +823,20 @@
               },
               "flatPath": "v1/projects/{projectId}/triggers/{triggerId}",
               "path": "v1/projects/{projectId}/triggers/{triggerId}",
-              "id": "cloudbuild.projects.triggers.delete",
-              "description": "Deletes an BuildTrigger by its project ID and trigger ID.\n\nThis API is experimental."
-            },
-            "get": {
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "projectId",
-                "triggerId"
-              ],
-              "response": {
-                "$ref": "BuildTrigger"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "parameters": {
-                "triggerId": {
-                  "location": "path",
-                  "description": "ID of the BuildTrigger to get.",
-                  "required": true,
-                  "type": "string"
-                },
-                "projectId": {
-                  "description": "ID of the project that owns the trigger.",
-                  "required": true,
-                  "type": "string",
-                  "location": "path"
-                }
-              },
-              "flatPath": "v1/projects/{projectId}/triggers/{triggerId}",
               "id": "cloudbuild.projects.triggers.get",
-              "path": "v1/projects/{projectId}/triggers/{triggerId}",
               "description": "Gets information about a BuildTrigger.\n\nThis API is experimental."
             },
             "list": {
+              "id": "cloudbuild.projects.triggers.list",
+              "path": "v1/projects/{projectId}/triggers",
+              "description": "Lists existing BuildTrigger.\n\nThis API is experimental.",
+              "httpMethod": "GET",
               "response": {
                 "$ref": "ListBuildTriggersResponse"
               },
               "parameterOrder": [
                 "projectId"
               ],
-              "httpMethod": "GET",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
               "parameters": {
                 "projectId": {
                   "description": "ID of the project for which to list BuildTriggers.",
@@ -762,29 +845,12 @@
                   "location": "path"
                 }
               },
-              "flatPath": "v1/projects/{projectId}/triggers",
-              "path": "v1/projects/{projectId}/triggers",
-              "id": "cloudbuild.projects.triggers.list",
-              "description": "Lists existing BuildTrigger.\n\nThis API is experimental."
-            },
-            "patch": {
-              "path": "v1/projects/{projectId}/triggers/{triggerId}",
-              "id": "cloudbuild.projects.triggers.patch",
-              "description": "Updates an BuildTrigger by its project ID and trigger ID.\n\nThis API is experimental.",
-              "request": {
-                "$ref": "BuildTrigger"
-              },
-              "response": {
-                "$ref": "BuildTrigger"
-              },
-              "parameterOrder": [
-                "projectId",
-                "triggerId"
-              ],
-              "httpMethod": "PATCH",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform"
               ],
+              "flatPath": "v1/projects/{projectId}/triggers"
+            },
+            "patch": {
               "parameters": {
                 "triggerId": {
                   "location": "path",
@@ -799,20 +865,37 @@
                   "type": "string"
                 }
               },
-              "flatPath": "v1/projects/{projectId}/triggers/{triggerId}"
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1/projects/{projectId}/triggers/{triggerId}",
+              "id": "cloudbuild.projects.triggers.patch",
+              "path": "v1/projects/{projectId}/triggers/{triggerId}",
+              "request": {
+                "$ref": "BuildTrigger"
+              },
+              "description": "Updates an BuildTrigger by its project ID and trigger ID.\n\nThis API is experimental.",
+              "httpMethod": "PATCH",
+              "parameterOrder": [
+                "projectId",
+                "triggerId"
+              ],
+              "response": {
+                "$ref": "BuildTrigger"
+              }
             },
             "create": {
               "description": "Creates a new BuildTrigger.\n\nThis API is experimental.",
               "request": {
                 "$ref": "BuildTrigger"
               },
-              "response": {
-                "$ref": "BuildTrigger"
-              },
+              "httpMethod": "POST",
               "parameterOrder": [
                 "projectId"
               ],
-              "httpMethod": "POST",
+              "response": {
+                "$ref": "BuildTrigger"
+              },
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform"
               ],
@@ -825,138 +908,50 @@
                 }
               },
               "flatPath": "v1/projects/{projectId}/triggers",
-              "path": "v1/projects/{projectId}/triggers",
-              "id": "cloudbuild.projects.triggers.create"
+              "id": "cloudbuild.projects.triggers.create",
+              "path": "v1/projects/{projectId}/triggers"
+            },
+            "delete": {
+              "flatPath": "v1/projects/{projectId}/triggers/{triggerId}",
+              "id": "cloudbuild.projects.triggers.delete",
+              "path": "v1/projects/{projectId}/triggers/{triggerId}",
+              "description": "Deletes an BuildTrigger by its project ID and trigger ID.\n\nThis API is experimental.",
+              "httpMethod": "DELETE",
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "projectId",
+                "triggerId"
+              ],
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "triggerId": {
+                  "location": "path",
+                  "description": "ID of the BuildTrigger to delete.",
+                  "required": true,
+                  "type": "string"
+                },
+                "projectId": {
+                  "description": "ID of the project that owns the trigger.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                }
+              }
             }
           }
         }
       }
-    },
-    "operations": {
-      "methods": {
-        "list": {
-          "httpMethod": "GET",
-          "response": {
-            "$ref": "ListOperationsResponse"
-          },
-          "parameterOrder": [
-            "name"
-          ],
-          "parameters": {
-            "filter": {
-              "description": "The standard list filter.",
-              "type": "string",
-              "location": "query"
-            },
-            "name": {
-              "pattern": "^operations$",
-              "location": "path",
-              "description": "The name of the operation collection.",
-              "required": true,
-              "type": "string"
-            },
-            "pageToken": {
-              "location": "query",
-              "description": "The standard list page token.",
-              "type": "string"
-            },
-            "pageSize": {
-              "location": "query",
-              "description": "The standard list page size.",
-              "format": "int32",
-              "type": "integer"
-            }
-          },
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ],
-          "flatPath": "v1/operations",
-          "id": "cloudbuild.operations.list",
-          "path": "v1/{+name}",
-          "description": "Lists operations that match the specified filter in the request. If the\nserver doesn't support this method, it returns `UNIMPLEMENTED`.\n\nNOTE: the `name` binding below allows API services to override the binding\nto use different resource name schemes, such as `users/*/operations`."
-        },
-        "get": {
-          "path": "v1/{+name}",
-          "id": "cloudbuild.operations.get",
-          "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice.",
-          "response": {
-            "$ref": "Operation"
-          },
-          "parameterOrder": [
-            "name"
-          ],
-          "httpMethod": "GET",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ],
-          "parameters": {
-            "name": {
-              "pattern": "^operations/.+$",
-              "location": "path",
-              "description": "The name of the operation resource.",
-              "required": true,
-              "type": "string"
-            }
-          },
-          "flatPath": "v1/operations/{operationsId}"
-        },
-        "cancel": {
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [
-            "name"
-          ],
-          "httpMethod": "POST",
-          "parameters": {
-            "name": {
-              "description": "The name of the operation resource to be cancelled.",
-              "required": true,
-              "type": "string",
-              "pattern": "^operations/.+$",
-              "location": "path"
-            }
-          },
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ],
-          "flatPath": "v1/operations/{operationsId}:cancel",
-          "path": "v1/{+name}:cancel",
-          "id": "cloudbuild.operations.cancel",
-          "request": {
-            "$ref": "CancelOperationRequest"
-          },
-          "description": "Starts asynchronous cancellation on a long-running operation.  The server\nmakes a best effort to cancel the operation, but success is not\nguaranteed.  If the server doesn't support this method, it returns\n`google.rpc.Code.UNIMPLEMENTED`.  Clients can use\nOperations.GetOperation or\nother methods to check whether the cancellation succeeded or whether the\noperation completed despite cancellation. On successful cancellation,\nthe operation is not deleted; instead, it becomes an operation with\nan Operation.error value with a google.rpc.Status.code of 1,\ncorresponding to `Code.CANCELLED`."
-        }
-      }
     }
   },
   "parameters": {
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "location": "query",
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string"
-    },
-    "upload_protocol": {
-      "location": "query",
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "type": "boolean",
-      "default": "true",
-      "location": "query"
-    },
     "fields": {
+      "location": "query",
       "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
+      "type": "string"
     },
     "uploadType": {
       "location": "query",
@@ -964,22 +959,22 @@
       "type": "string"
     },
     "callback": {
+      "location": "query",
       "description": "JSONP",
-      "type": "string",
-      "location": "query"
+      "type": "string"
     },
     "$.xgafv": {
-      "enum": [
-        "1",
-        "2"
-      ],
       "description": "V1 error format.",
       "type": "string",
       "enumDescriptions": [
         "v1 error format",
         "v2 error format"
       ],
-      "location": "query"
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ]
     },
     "alt": {
       "enum": [
@@ -997,37 +992,56 @@
       "description": "Data format for response.",
       "default": "json"
     },
-    "access_token": {
-      "location": "query",
-      "description": "OAuth access token.",
-      "type": "string"
-    },
     "key": {
       "location": "query",
       "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
       "type": "string"
     },
-    "quotaUser": {
+    "access_token": {
       "location": "query",
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "description": "OAuth access token.",
       "type": "string"
     },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string",
+      "location": "query"
+    },
     "pp": {
       "description": "Pretty-print response.",
       "type": "boolean",
       "default": "true",
       "location": "query"
+    },
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
+    },
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    },
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "prettyPrint": {
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
     }
   },
   "version": "v1",
   "baseUrl": "https://cloudbuild.googleapis.com/",
   "servicePath": "",
-  "kind": "discovery#restDescription",
   "description": "Builds container images in the cloud.",
+  "kind": "discovery#restDescription",
   "basePath": "",
-  "revision": "20170125",
-  "documentationLink": "https://cloud.google.com/container-builder/docs/",
+  "revision": "20170207",
   "id": "cloudbuild:v1",
-  "discoveryVersion": "v1",
-  "version_module": "True"
+  "documentationLink": "https://cloud.google.com/container-builder/docs/"
 }
diff --git a/cloudbuild/v1/cloudbuild-gen.go b/cloudbuild/v1/cloudbuild-gen.go
index a6887f7..32541a0 100644
--- a/cloudbuild/v1/cloudbuild-gen.go
+++ b/cloudbuild/v1/cloudbuild-gen.go
@@ -62,9 +62,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Operations *OperationsService
 
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewOperationsService(s *Service) *OperationsService {
 	rs := &OperationsService{s: s}
 	return rs
@@ -240,6 +245,9 @@
 	// Steps: Describes the operations to be performed on the workspace.
 	Steps []*BuildStep `json:"steps,omitempty"`
 
+	// Substitutions: Substitutions data for Build resource.
+	Substitutions map[string]string `json:"substitutions,omitempty"`
+
 	// Timeout: Amount of time that this build should be allowed to run, to
 	// second
 	// granularity. If this amount of time elapses, work on the build will
@@ -476,6 +484,9 @@
 	// @OutputOnly
 	Id string `json:"id,omitempty"`
 
+	// Substitutions: Substitutions data for Build resource.
+	Substitutions map[string]string `json:"substitutions,omitempty"`
+
 	// TriggerTemplate: Template describing the types of source changes to
 	// trigger a build.
 	//
@@ -1222,6 +1233,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.canceloperationrequest)
 	if err != nil {
@@ -1370,6 +1382,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1537,6 +1550,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1706,6 +1720,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cancelbuildrequest)
 	if err != nil {
@@ -1854,6 +1869,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.build)
 	if err != nil {
@@ -2003,6 +2019,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2174,6 +2191,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2342,6 +2360,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.buildtrigger)
 	if err != nil {
@@ -2479,6 +2498,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/triggers/{triggerId}")
@@ -2626,6 +2646,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2774,6 +2795,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2908,6 +2930,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.buildtrigger)
 	if err != nil {
diff --git a/clouddebugger/v2/clouddebugger-api.json b/clouddebugger/v2/clouddebugger-api.json
index 25ada33..52327d5 100644
--- a/clouddebugger/v2/clouddebugger-api.json
+++ b/clouddebugger/v2/clouddebugger-api.json
@@ -1,261 +1,67 @@
 {
-  "id": "clouddebugger:v2",
+  "canonicalName": "Cloud Debugger",
   "auth": {
     "oauth2": {
       "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        },
         "https://www.googleapis.com/auth/cloud_debugger": {
           "description": "Manage cloud debugger"
+        },
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
         }
       }
     }
   },
-  "description": "Examines the call stack and variables of a running application without stopping or slowing it down.\n",
-  "protocol": "rest",
+  "rootUrl": "https://clouddebugger.googleapis.com/",
+  "ownerDomain": "google.com",
+  "name": "clouddebugger",
+  "batchPath": "batch",
   "title": "Stackdriver Debugger API",
+  "ownerName": "Google",
   "resources": {
-    "controller": {
-      "resources": {
-        "debuggees": {
-          "resources": {
-            "breakpoints": {
-              "methods": {
-                "update": {
-                  "id": "clouddebugger.controller.debuggees.breakpoints.update",
-                  "response": {
-                    "$ref": "UpdateActiveBreakpointResponse"
-                  },
-                  "parameterOrder": [
-                    "debuggeeId",
-                    "id"
-                  ],
-                  "description": "Updates the breakpoint state or mutable fields.\nThe entire Breakpoint message must be sent back to the controller\nservice.\n\nUpdates to active breakpoint fields are only allowed if the new value\ndoes not change the breakpoint specification. Updates to the `location`,\n`condition` and `expression` fields should not alter the breakpoint\nsemantics. These may only make changes such as canonicalizing a value\nor snapping the location to the correct line of code.",
-                  "request": {
-                    "$ref": "UpdateActiveBreakpointRequest"
-                  },
-                  "flatPath": "v2/controller/debuggees/{debuggeeId}/breakpoints/{id}",
-                  "httpMethod": "PUT",
-                  "parameters": {
-                    "debuggeeId": {
-                      "description": "Identifies the debuggee being debugged.",
-                      "required": true,
-                      "location": "path",
-                      "type": "string"
-                    },
-                    "id": {
-                      "description": "Breakpoint identifier, unique in the scope of the debuggee.",
-                      "required": true,
-                      "location": "path",
-                      "type": "string"
-                    }
-                  },
-                  "path": "v2/controller/debuggees/{debuggeeId}/breakpoints/{id}",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloud_debugger"
-                  ]
-                },
-                "list": {
-                  "id": "clouddebugger.controller.debuggees.breakpoints.list",
-                  "response": {
-                    "$ref": "ListActiveBreakpointsResponse"
-                  },
-                  "parameterOrder": [
-                    "debuggeeId"
-                  ],
-                  "description": "Returns the list of all active breakpoints for the debuggee.\n\nThe breakpoint specification (location, condition, and expression\nfields) is semantically immutable, although the field values may\nchange. For example, an agent may update the location line number\nto reflect the actual line where the breakpoint was set, but this\ndoesn't change the breakpoint semantics.\n\nThis means that an agent does not need to check if a breakpoint has changed\nwhen it encounters the same breakpoint on a successive call.\nMoreover, an agent should remember the breakpoints that are completed\nuntil the controller removes them from the active list to avoid\nsetting those breakpoints again.",
-                  "flatPath": "v2/controller/debuggees/{debuggeeId}/breakpoints",
-                  "httpMethod": "GET",
-                  "parameters": {
-                    "debuggeeId": {
-                      "description": "Identifies the debuggee.",
-                      "required": true,
-                      "location": "path",
-                      "type": "string"
-                    },
-                    "successOnTimeout": {
-                      "description": "If set to `true`, returns `google.rpc.Code.OK` status and sets the\n`wait_expired` response field to `true` when the server-selected timeout\nhas expired (recommended).\n\nIf set to `false`, returns `google.rpc.Code.ABORTED` status when the\nserver-selected timeout has expired (deprecated).",
-                      "location": "query",
-                      "type": "boolean"
-                    },
-                    "waitToken": {
-                      "description": "A wait token that, if specified, blocks the method call until the list\nof active breakpoints has changed, or a server selected timeout has\nexpired.  The value should be set from the last returned response.",
-                      "location": "query",
-                      "type": "string"
-                    }
-                  },
-                  "path": "v2/controller/debuggees/{debuggeeId}/breakpoints",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloud_debugger"
-                  ]
-                }
-              }
-            }
-          },
-          "methods": {
-            "register": {
-              "id": "clouddebugger.controller.debuggees.register",
-              "response": {
-                "$ref": "RegisterDebuggeeResponse"
-              },
-              "parameterOrder": [],
-              "description": "Registers the debuggee with the controller service.\n\nAll agents attached to the same application should call this method with\nthe same request content to get back the same stable `debuggee_id`. Agents\nshould call this method again whenever `google.rpc.Code.NOT_FOUND` is\nreturned from any controller method.\n\nThis allows the controller service to disable the agent or recover from any\ndata loss. If the debuggee is disabled by the server, the response will\nhave `is_disabled` set to `true`.",
-              "request": {
-                "$ref": "RegisterDebuggeeRequest"
-              },
-              "flatPath": "v2/controller/debuggees/register",
-              "httpMethod": "POST",
-              "parameters": {},
-              "path": "v2/controller/debuggees/register",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud_debugger"
-              ]
-            }
-          }
-        }
-      }
-    },
     "debugger": {
       "resources": {
         "debuggees": {
           "resources": {
             "breakpoints": {
               "methods": {
-                "get": {
-                  "id": "clouddebugger.debugger.debuggees.breakpoints.get",
-                  "response": {
-                    "$ref": "GetBreakpointResponse"
-                  },
-                  "parameterOrder": [
-                    "debuggeeId",
-                    "breakpointId"
-                  ],
-                  "description": "Gets breakpoint information.",
-                  "flatPath": "v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}",
-                  "httpMethod": "GET",
-                  "parameters": {
-                    "debuggeeId": {
-                      "description": "ID of the debuggee whose breakpoint to get.",
-                      "required": true,
-                      "location": "path",
-                      "type": "string"
-                    },
-                    "breakpointId": {
-                      "description": "ID of the breakpoint to get.",
-                      "required": true,
-                      "location": "path",
-                      "type": "string"
-                    },
-                    "clientVersion": {
-                      "description": "The client version making the call.\nFollowing: `domain/type/version` (e.g., `google.com/intellij/v1`).",
-                      "location": "query",
-                      "type": "string"
-                    }
-                  },
-                  "path": "v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloud_debugger"
-                  ]
-                },
-                "list": {
-                  "id": "clouddebugger.debugger.debuggees.breakpoints.list",
-                  "response": {
-                    "$ref": "ListBreakpointsResponse"
-                  },
+                "set": {
+                  "httpMethod": "POST",
                   "parameterOrder": [
                     "debuggeeId"
                   ],
-                  "description": "Lists all breakpoints for the debuggee.",
-                  "flatPath": "v2/debugger/debuggees/{debuggeeId}/breakpoints",
-                  "httpMethod": "GET",
-                  "parameters": {
-                    "debuggeeId": {
-                      "description": "ID of the debuggee whose breakpoints to list.",
-                      "required": true,
-                      "location": "path",
-                      "type": "string"
-                    },
-                    "clientVersion": {
-                      "description": "The client version making the call.\nFollowing: `domain/type/version` (e.g., `google.com/intellij/v1`).",
-                      "location": "query",
-                      "type": "string"
-                    },
-                    "includeAllUsers": {
-                      "description": "When set to `true`, the response includes the list of breakpoints set by\nany user. Otherwise, it includes only breakpoints set by the caller.",
-                      "location": "query",
-                      "type": "boolean"
-                    },
-                    "stripResults": {
-                      "description": "This field is deprecated. The following fields are always stripped out of\nthe result: `stack_frames`, `evaluated_expressions` and `variable_table`.",
-                      "location": "query",
-                      "type": "boolean"
-                    },
-                    "action.value": {
-                      "description": "Only breakpoints with the specified action will pass the filter.",
-                      "enum": [
-                        "CAPTURE",
-                        "LOG"
-                      ],
-                      "location": "query",
-                      "type": "string"
-                    },
-                    "includeInactive": {
-                      "description": "When set to `true`, the response includes active and inactive\nbreakpoints. Otherwise, it includes only active breakpoints.",
-                      "location": "query",
-                      "type": "boolean"
-                    },
-                    "waitToken": {
-                      "description": "A wait token that, if specified, blocks the call until the breakpoints\nlist has changed, or a server selected timeout has expired.  The value\nshould be set from the last response. The error code\n`google.rpc.Code.ABORTED` (RPC) is returned on wait timeout, which\nshould be called again with the same `wait_token`.",
-                      "location": "query",
-                      "type": "string"
-                    }
-                  },
-                  "path": "v2/debugger/debuggees/{debuggeeId}/breakpoints",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloud_debugger"
-                  ]
-                },
-                "set": {
-                  "id": "clouddebugger.debugger.debuggees.breakpoints.set",
                   "response": {
                     "$ref": "SetBreakpointResponse"
                   },
-                  "parameterOrder": [
-                    "debuggeeId"
-                  ],
-                  "description": "Sets the breakpoint to the debuggee.",
-                  "request": {
-                    "$ref": "Breakpoint"
-                  },
-                  "flatPath": "v2/debugger/debuggees/{debuggeeId}/breakpoints/set",
-                  "httpMethod": "POST",
-                  "parameters": {
-                    "debuggeeId": {
-                      "description": "ID of the debuggee where the breakpoint is to be set.",
-                      "required": true,
-                      "location": "path",
-                      "type": "string"
-                    },
-                    "clientVersion": {
-                      "description": "The client version making the call.\nFollowing: `domain/type/version` (e.g., `google.com/intellij/v1`).",
-                      "location": "query",
-                      "type": "string"
-                    }
-                  },
-                  "path": "v2/debugger/debuggees/{debuggeeId}/breakpoints/set",
                   "scopes": [
                     "https://www.googleapis.com/auth/cloud-platform",
                     "https://www.googleapis.com/auth/cloud_debugger"
-                  ]
+                  ],
+                  "parameters": {
+                    "clientVersion": {
+                      "location": "query",
+                      "description": "The client version making the call.\nFollowing: `domain/type/version` (e.g., `google.com/intellij/v1`).",
+                      "type": "string"
+                    },
+                    "debuggeeId": {
+                      "location": "path",
+                      "description": "ID of the debuggee where the breakpoint is to be set.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v2/debugger/debuggees/{debuggeeId}/breakpoints/set",
+                  "id": "clouddebugger.debugger.debuggees.breakpoints.set",
+                  "path": "v2/debugger/debuggees/{debuggeeId}/breakpoints/set",
+                  "description": "Sets the breakpoint to the debuggee.",
+                  "request": {
+                    "$ref": "Breakpoint"
+                  }
                 },
                 "delete": {
+                  "path": "v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}",
                   "id": "clouddebugger.debugger.debuggees.breakpoints.delete",
+                  "description": "Deletes the breakpoint from the debuggee.",
                   "response": {
                     "$ref": "Empty"
                   },
@@ -263,260 +69,415 @@
                     "debuggeeId",
                     "breakpointId"
                   ],
-                  "description": "Deletes the breakpoint from the debuggee.",
-                  "flatPath": "v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}",
                   "httpMethod": "DELETE",
                   "parameters": {
-                    "debuggeeId": {
-                      "description": "ID of the debuggee whose breakpoint to delete.",
-                      "required": true,
-                      "location": "path",
+                    "clientVersion": {
+                      "location": "query",
+                      "description": "The client version making the call.\nFollowing: `domain/type/version` (e.g., `google.com/intellij/v1`).",
                       "type": "string"
                     },
                     "breakpointId": {
                       "description": "ID of the breakpoint to delete.",
                       "required": true,
-                      "location": "path",
-                      "type": "string"
+                      "type": "string",
+                      "location": "path"
                     },
-                    "clientVersion": {
-                      "description": "The client version making the call.\nFollowing: `domain/type/version` (e.g., `google.com/intellij/v1`).",
-                      "location": "query",
-                      "type": "string"
+                    "debuggeeId": {
+                      "description": "ID of the debuggee whose breakpoint to delete.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
                     }
                   },
-                  "path": "v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}",
                   "scopes": [
                     "https://www.googleapis.com/auth/cloud-platform",
                     "https://www.googleapis.com/auth/cloud_debugger"
-                  ]
+                  ],
+                  "flatPath": "v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}"
+                },
+                "get": {
+                  "httpMethod": "GET",
+                  "response": {
+                    "$ref": "GetBreakpointResponse"
+                  },
+                  "parameterOrder": [
+                    "debuggeeId",
+                    "breakpointId"
+                  ],
+                  "parameters": {
+                    "clientVersion": {
+                      "location": "query",
+                      "description": "The client version making the call.\nFollowing: `domain/type/version` (e.g., `google.com/intellij/v1`).",
+                      "type": "string"
+                    },
+                    "breakpointId": {
+                      "location": "path",
+                      "description": "ID of the breakpoint to get.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "debuggeeId": {
+                      "location": "path",
+                      "description": "ID of the debuggee whose breakpoint to get.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloud_debugger"
+                  ],
+                  "flatPath": "v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}",
+                  "id": "clouddebugger.debugger.debuggees.breakpoints.get",
+                  "path": "v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}",
+                  "description": "Gets breakpoint information."
+                },
+                "list": {
+                  "httpMethod": "GET",
+                  "response": {
+                    "$ref": "ListBreakpointsResponse"
+                  },
+                  "parameterOrder": [
+                    "debuggeeId"
+                  ],
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloud_debugger"
+                  ],
+                  "parameters": {
+                    "includeInactive": {
+                      "location": "query",
+                      "description": "When set to `true`, the response includes active and inactive\nbreakpoints. Otherwise, it includes only active breakpoints.",
+                      "type": "boolean"
+                    },
+                    "includeAllUsers": {
+                      "description": "When set to `true`, the response includes the list of breakpoints set by\nany user. Otherwise, it includes only breakpoints set by the caller.",
+                      "type": "boolean",
+                      "location": "query"
+                    },
+                    "stripResults": {
+                      "description": "This field is deprecated. The following fields are always stripped out of\nthe result: `stack_frames`, `evaluated_expressions` and `variable_table`.",
+                      "type": "boolean",
+                      "location": "query"
+                    },
+                    "debuggeeId": {
+                      "description": "ID of the debuggee whose breakpoints to list.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "waitToken": {
+                      "location": "query",
+                      "description": "A wait token that, if specified, blocks the call until the breakpoints\nlist has changed, or a server selected timeout has expired.  The value\nshould be set from the last response. The error code\n`google.rpc.Code.ABORTED` (RPC) is returned on wait timeout, which\nshould be called again with the same `wait_token`.",
+                      "type": "string"
+                    },
+                    "clientVersion": {
+                      "location": "query",
+                      "description": "The client version making the call.\nFollowing: `domain/type/version` (e.g., `google.com/intellij/v1`).",
+                      "type": "string"
+                    },
+                    "action.value": {
+                      "enum": [
+                        "CAPTURE",
+                        "LOG"
+                      ],
+                      "description": "Only breakpoints with the specified action will pass the filter.",
+                      "type": "string",
+                      "location": "query"
+                    }
+                  },
+                  "flatPath": "v2/debugger/debuggees/{debuggeeId}/breakpoints",
+                  "id": "clouddebugger.debugger.debuggees.breakpoints.list",
+                  "path": "v2/debugger/debuggees/{debuggeeId}/breakpoints",
+                  "description": "Lists all breakpoints for the debuggee."
                 }
               }
             }
           },
           "methods": {
             "list": {
-              "id": "clouddebugger.debugger.debuggees.list",
               "response": {
                 "$ref": "ListDebuggeesResponse"
               },
-              "parameterOrder": [],
-              "description": "Lists all the debuggees that the user can set breakpoints to.",
-              "flatPath": "v2/debugger/debuggees",
               "httpMethod": "GET",
+              "parameterOrder": [],
               "parameters": {
-                "includeInactive": {
-                  "description": "When set to `true`, the result includes all debuggees. Otherwise, the\nresult includes only debuggees that are active.",
-                  "location": "query",
-                  "type": "boolean"
-                },
-                "project": {
-                  "description": "Project number of a Google Cloud project whose debuggees to list.",
-                  "location": "query",
-                  "type": "string"
-                },
                 "clientVersion": {
                   "description": "The client version making the call.\nFollowing: `domain/type/version` (e.g., `google.com/intellij/v1`).",
+                  "type": "string",
+                  "location": "query"
+                },
+                "includeInactive": {
+                  "description": "When set to `true`, the result includes all debuggees. Otherwise, the\nresult includes only debuggees that are active.",
+                  "type": "boolean",
+                  "location": "query"
+                },
+                "project": {
                   "location": "query",
+                  "description": "Project number of a Google Cloud project whose debuggees to list.",
                   "type": "string"
                 }
               },
-              "path": "v2/debugger/debuggees",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/cloud_debugger"
-              ]
+              ],
+              "flatPath": "v2/debugger/debuggees",
+              "path": "v2/debugger/debuggees",
+              "id": "clouddebugger.debugger.debuggees.list",
+              "description": "Lists all the debuggees that the user can set breakpoints to."
+            }
+          }
+        }
+      }
+    },
+    "controller": {
+      "resources": {
+        "debuggees": {
+          "methods": {
+            "register": {
+              "path": "v2/controller/debuggees/register",
+              "id": "clouddebugger.controller.debuggees.register",
+              "description": "Registers the debuggee with the controller service.\n\nAll agents attached to the same application should call this method with\nthe same request content to get back the same stable `debuggee_id`. Agents\nshould call this method again whenever `google.rpc.Code.NOT_FOUND` is\nreturned from any controller method.\n\nThis allows the controller service to disable the agent or recover from any\ndata loss. If the debuggee is disabled by the server, the response will\nhave `is_disabled` set to `true`.",
+              "request": {
+                "$ref": "RegisterDebuggeeRequest"
+              },
+              "response": {
+                "$ref": "RegisterDebuggeeResponse"
+              },
+              "parameterOrder": [],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud_debugger"
+              ],
+              "parameters": {},
+              "flatPath": "v2/controller/debuggees/register"
+            }
+          },
+          "resources": {
+            "breakpoints": {
+              "methods": {
+                "list": {
+                  "httpMethod": "GET",
+                  "parameterOrder": [
+                    "debuggeeId"
+                  ],
+                  "response": {
+                    "$ref": "ListActiveBreakpointsResponse"
+                  },
+                  "parameters": {
+                    "waitToken": {
+                      "location": "query",
+                      "description": "A wait token that, if specified, blocks the method call until the list\nof active breakpoints has changed, or a server selected timeout has\nexpired.  The value should be set from the last returned response.",
+                      "type": "string"
+                    },
+                    "debuggeeId": {
+                      "location": "path",
+                      "description": "Identifies the debuggee.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "successOnTimeout": {
+                      "description": "If set to `true`, returns `google.rpc.Code.OK` status and sets the\n`wait_expired` response field to `true` when the server-selected timeout\nhas expired (recommended).\n\nIf set to `false`, returns `google.rpc.Code.ABORTED` status when the\nserver-selected timeout has expired (deprecated).",
+                      "type": "boolean",
+                      "location": "query"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloud_debugger"
+                  ],
+                  "flatPath": "v2/controller/debuggees/{debuggeeId}/breakpoints",
+                  "id": "clouddebugger.controller.debuggees.breakpoints.list",
+                  "path": "v2/controller/debuggees/{debuggeeId}/breakpoints",
+                  "description": "Returns the list of all active breakpoints for the debuggee.\n\nThe breakpoint specification (location, condition, and expression\nfields) is semantically immutable, although the field values may\nchange. For example, an agent may update the location line number\nto reflect the actual line where the breakpoint was set, but this\ndoesn't change the breakpoint semantics.\n\nThis means that an agent does not need to check if a breakpoint has changed\nwhen it encounters the same breakpoint on a successive call.\nMoreover, an agent should remember the breakpoints that are completed\nuntil the controller removes them from the active list to avoid\nsetting those breakpoints again."
+                },
+                "update": {
+                  "response": {
+                    "$ref": "UpdateActiveBreakpointResponse"
+                  },
+                  "parameterOrder": [
+                    "debuggeeId",
+                    "id"
+                  ],
+                  "httpMethod": "PUT",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloud_debugger"
+                  ],
+                  "parameters": {
+                    "id": {
+                      "description": "Breakpoint identifier, unique in the scope of the debuggee.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "debuggeeId": {
+                      "description": "Identifies the debuggee being debugged.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "flatPath": "v2/controller/debuggees/{debuggeeId}/breakpoints/{id}",
+                  "path": "v2/controller/debuggees/{debuggeeId}/breakpoints/{id}",
+                  "id": "clouddebugger.controller.debuggees.breakpoints.update",
+                  "description": "Updates the breakpoint state or mutable fields.\nThe entire Breakpoint message must be sent back to the controller\nservice.\n\nUpdates to active breakpoint fields are only allowed if the new value\ndoes not change the breakpoint specification. Updates to the `location`,\n`condition` and `expression` fields should not alter the breakpoint\nsemantics. These may only make changes such as canonicalizing a value\nor snapping the location to the correct line of code.",
+                  "request": {
+                    "$ref": "UpdateActiveBreakpointRequest"
+                  }
+                }
+              }
             }
           }
         }
       }
     }
   },
-  "schemas": {
-    "Debuggee": {
-      "description": "Represents the application to debug. The application may include one or more\nreplicated processes executing the same code. Each of these processes is\nattached with a debugger agent, carrying out the debugging commands.\nThe agents attached to the same debuggee are identified by using exactly the\nsame field values when registering.",
-      "type": "object",
-      "properties": {
-        "id": {
-          "description": "Unique identifier for the debuggee generated by the controller service.",
-          "type": "string"
-        },
-        "project": {
-          "description": "Project the debuggee is associated with.\nUse the project number when registering a Google Cloud Platform project.",
-          "type": "string"
-        },
-        "extSourceContexts": {
-          "description": "References to the locations and revisions of the source code used in the\ndeployed application.\n\nContexts describing a remote repo related to the source code\nhave a `category` label of `remote_repo`. Source snapshot source\ncontexts have a `category` of `snapshot`.",
-          "type": "array",
-          "items": {
-            "$ref": "ExtendedSourceContext"
-          }
-        },
-        "description": {
-          "description": "Human readable description of the debuggee.\nIncluding a human-readable project name, environment name and version\ninformation is recommended.",
-          "type": "string"
-        },
-        "isDisabled": {
-          "description": "If set to `true`, indicates that the agent should disable itself and\ndetach from the debuggee.",
-          "type": "boolean"
-        },
-        "status": {
-          "description": "Human readable message to be displayed to the user about this debuggee.\nAbsence of this field indicates no status. The message can be either\ninformational or an error status.",
-          "$ref": "StatusMessage"
-        },
-        "isInactive": {
-          "description": "If set to `true`, indicates that the debuggee is considered as inactive by\nthe Controller service.",
-          "type": "boolean"
-        },
-        "agentVersion": {
-          "description": "Version ID of the agent release. The version ID is structured as\nfollowing: `domain/type/vmajor.minor` (for example\n`google.com/gcp-java/v1.1`).",
-          "type": "string"
-        },
-        "labels": {
-          "description": "A set of custom debuggee properties, populated by the agent, to be\ndisplayed to the user.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "uniquifier": {
-          "description": "Debuggee uniquifier within the project.\nAny string that identifies the application within the project can be used.\nIncluding environment and version or build IDs is recommended.",
-          "type": "string"
-        },
-        "sourceContexts": {
-          "description": "References to the locations and revisions of the source code used in the\ndeployed application.\n\nNOTE: This field is deprecated. Consumers should use\n`ext_source_contexts` if it is not empty. Debug agents should populate\nboth this field and `ext_source_contexts`.",
-          "type": "array",
-          "items": {
-            "$ref": "SourceContext"
-          }
-        }
-      },
-      "id": "Debuggee"
+  "parameters": {
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
     },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string",
+      "location": "query"
+    },
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "$.xgafv": {
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "alt": {
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string",
+      "location": "query"
+    },
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    },
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
+    }
+  },
+  "version": "v2",
+  "baseUrl": "https://clouddebugger.googleapis.com/",
+  "kind": "discovery#restDescription",
+  "servicePath": "",
+  "description": "Examines the call stack and variables of a running application without stopping or slowing it down.\n",
+  "basePath": "",
+  "documentationLink": "http://cloud.google.com/debugger",
+  "revision": "20170208",
+  "id": "clouddebugger:v2",
+  "discoveryVersion": "v1",
+  "version_module": "True",
+  "schemas": {
     "StackFrame": {
-      "description": "Represents a stack frame context.",
-      "type": "object",
       "properties": {
-        "locals": {
-          "description": "Set of local variables at the stack frame location.\nNote that this might not be populated for all stack frames.",
-          "type": "array",
-          "items": {
-            "$ref": "Variable"
-          }
-        },
         "function": {
           "description": "Demangled function name at the call site.",
           "type": "string"
         },
-        "location": {
-          "description": "Source location of the call site.",
-          "$ref": "SourceLocation"
-        },
         "arguments": {
           "description": "Set of arguments passed to this function.\nNote that this might not be populated for all stack frames.",
           "type": "array",
           "items": {
             "$ref": "Variable"
           }
-        }
-      },
-      "id": "StackFrame"
-    },
-    "ListBreakpointsResponse": {
-      "description": "Response for listing breakpoints.",
-      "type": "object",
-      "properties": {
-        "breakpoints": {
-          "description": "List of breakpoints matching the request.\nThe fields `id` and `location` are guaranteed to be set on each breakpoint.\nThe fields: `stack_frames`, `evaluated_expressions` and `variable_table`\nare cleared on each breakpoint regardless of it's status.",
-          "type": "array",
-          "items": {
-            "$ref": "Breakpoint"
-          }
         },
-        "nextWaitToken": {
-          "description": "A wait token that can be used in the next call to `list` (REST) or\n`ListBreakpoints` (RPC) to block until the list of breakpoints has changes.",
-          "type": "string"
-        }
-      },
-      "id": "ListBreakpointsResponse"
-    },
-    "Variable": {
-      "description": "Represents a variable or an argument possibly of a compound object type.\nNote how the following variables are represented:\n\n1) A simple variable:\n\n    int x = 5\n\n    { name: \"x\", value: \"5\", type: \"int\" }  // Captured variable\n\n2) A compound object:\n\n    struct T {\n        int m1;\n        int m2;\n    };\n    T x = { 3, 7 };\n\n    {  // Captured variable\n        name: \"x\",\n        type: \"T\",\n        members { name: \"m1\", value: \"3\", type: \"int\" },\n        members { name: \"m2\", value: \"7\", type: \"int\" }\n    }\n\n3) A pointer where the pointee was captured:\n\n    T x = { 3, 7 };\n    T* p = &x;\n\n    {   // Captured variable\n        name: \"p\",\n        type: \"T*\",\n        value: \"0x00500500\",\n        members { name: \"m1\", value: \"3\", type: \"int\" },\n        members { name: \"m2\", value: \"7\", type: \"int\" }\n    }\n\n4) A pointer where the pointee was not captured:\n\n    T* p = new T;\n\n    {   // Captured variable\n        name: \"p\",\n        type: \"T*\",\n        value: \"0x00400400\"\n        status { is_error: true, description { format: \"unavailable\" } }\n    }\n\nThe status should describe the reason for the missing value,\nsuch as `\u003coptimized out\u003e`, `\u003cinaccessible\u003e`, `\u003cpointers limit reached\u003e`.\n\nNote that a null pointer should not have members.\n\n5) An unnamed value:\n\n    int* p = new int(7);\n\n    {   // Captured variable\n        name: \"p\",\n        value: \"0x00500500\",\n        type: \"int*\",\n        members { value: \"7\", type: \"int\" } }\n\n6) An unnamed pointer where the pointee was not captured:\n\n    int* p = new int(7);\n    int** pp = &p;\n\n    {  // Captured variable\n        name: \"pp\",\n        value: \"0x00500500\",\n        type: \"int**\",\n        members {\n            value: \"0x00400400\",\n            type: \"int*\"\n            status {\n                is_error: true,\n                description: { format: \"unavailable\" } }\n            }\n        }\n    }\n\nTo optimize computation, memory and network traffic, variables that\nrepeat in the output multiple times can be stored once in a shared\nvariable table and be referenced using the `var_table_index` field.  The\nvariables stored in the shared table are nameless and are essentially\na partition of the complete variable. To reconstruct the complete\nvariable, merge the referencing variable with the referenced variable.\n\nWhen using the shared variable table, the following variables:\n\n    T x = { 3, 7 };\n    T* p = &x;\n    T& r = x;\n\n    { name: \"x\", var_table_index: 3, type: \"T\" }  // Captured variables\n    { name: \"p\", value \"0x00500500\", type=\"T*\", var_table_index: 3 }\n    { name: \"r\", type=\"T&\", var_table_index: 3 }\n\n    {  // Shared variable table entry #3:\n        members { name: \"m1\", value: \"3\", type: \"int\" },\n        members { name: \"m2\", value: \"7\", type: \"int\" }\n    }\n\nNote that the pointer address is stored with the referencing variable\nand not with the referenced variable. This allows the referenced variable\nto be shared between pointers and references.\n\nThe type field is optional. The debugger agent may or may not support it.",
-      "type": "object",
-      "properties": {
-        "varTableIndex": {
-          "description": "Reference to a variable in the shared variable table. More than\none variable can reference the same variable in the table. The\n`var_table_index` field is an index into `variable_table` in Breakpoint.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "status": {
-          "description": "Status associated with the variable. This field will usually stay\nunset. A status of a single variable only applies to that variable or\nexpression. The rest of breakpoint data still remains valid. Variables\nmight be reported in error state even when breakpoint is not in final\nstate.\n\nThe message may refer to variable name with `refers_to` set to\n`VARIABLE_NAME`. Alternatively `refers_to` will be set to `VARIABLE_VALUE`.\nIn either case variable value and members will be unset.\n\nExample of error message applied to name: `Invalid expression syntax`.\n\nExample of information message applied to value: `Not captured`.\n\nExamples of error message applied to value:\n\n*   `Malformed string`,\n*   `Field f not found in class C`\n*   `Null pointer dereference`",
-          "$ref": "StatusMessage"
-        },
-        "members": {
-          "description": "Members contained or pointed to by the variable.",
+        "locals": {
+          "description": "Set of local variables at the stack frame location.\nNote that this might not be populated for all stack frames.",
           "type": "array",
           "items": {
             "$ref": "Variable"
           }
         },
-        "name": {
-          "description": "Name of the variable, if any.",
-          "type": "string"
-        },
-        "value": {
-          "description": "Simple value of the variable.",
-          "type": "string"
-        },
-        "type": {
-          "description": "Variable type (e.g. `MyClass`). If the variable is split with\n`var_table_index`, `type` goes next to `value`. The interpretation of\na type is agent specific. It is recommended to include the dynamic type\nrather than a static type of an object.",
-          "type": "string"
+        "location": {
+          "$ref": "SourceLocation",
+          "description": "Source location of the call site."
         }
       },
-      "id": "Variable"
+      "id": "StackFrame",
+      "description": "Represents a stack frame context.",
+      "type": "object"
     },
-    "SourceLocation": {
-      "description": "Represents a location in the source code.",
-      "type": "object",
+    "RepoId": {
       "properties": {
-        "path": {
-          "description": "Path to the source file within the source context of the target binary.",
-          "type": "string"
+        "projectRepoId": {
+          "$ref": "ProjectRepoId",
+          "description": "A combination of a project ID and a repo name."
         },
-        "line": {
-          "description": "Line inside the file. The first line in the file has the value `1`.",
-          "type": "integer",
-          "format": "int32"
-        }
-      },
-      "id": "SourceLocation"
-    },
-    "GerritSourceContext": {
-      "description": "A SourceContext referring to a Gerrit project.",
-      "type": "object",
-      "properties": {
-        "hostUri": {
-          "description": "The URI of a running Gerrit instance.",
-          "type": "string"
-        },
-        "aliasName": {
-          "description": "The name of an alias (branch, tag, etc.).",
-          "type": "string"
-        },
-        "aliasContext": {
-          "description": "An alias, which may be a branch or tag.",
-          "$ref": "AliasContext"
-        },
-        "gerritProject": {
-          "description": "The full project name within the host. Projects may be nested, so\n\"project/subproject\" is a valid project name.\nThe \"repo name\" is hostURI/project.",
-          "type": "string"
-        },
-        "revisionId": {
-          "description": "A revision (commit) ID.",
+        "uid": {
+          "description": "A server-assigned, globally unique identifier.",
           "type": "string"
         }
       },
-      "id": "GerritSourceContext"
+      "id": "RepoId",
+      "description": "A unique identifier for a cloud repo.",
+      "type": "object"
     },
     "FormatMessage": {
       "description": "Represents a message with parameters.",
@@ -536,282 +497,50 @@
       },
       "id": "FormatMessage"
     },
-    "RegisterDebuggeeResponse": {
-      "description": "Response for registering a debuggee.",
-      "type": "object",
+    "ExtendedSourceContext": {
       "properties": {
-        "debuggee": {
-          "description": "Debuggee resource.\nThe field `id` is guranteed to be set (in addition to the echoed fields).",
-          "$ref": "Debuggee"
+        "context": {
+          "$ref": "SourceContext",
+          "description": "Any source context."
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Labels with user defined metadata.",
+          "type": "object"
         }
       },
-      "id": "RegisterDebuggeeResponse"
-    },
-    "GetBreakpointResponse": {
-      "description": "Response for getting breakpoint information.",
-      "type": "object",
-      "properties": {
-        "breakpoint": {
-          "description": "Complete breakpoint state.\nThe fields `id` and `location` are guaranteed to be set.",
-          "$ref": "Breakpoint"
-        }
-      },
-      "id": "GetBreakpointResponse"
+      "id": "ExtendedSourceContext",
+      "description": "An ExtendedSourceContext is a SourceContext combined with additional\ndetails describing the context.",
+      "type": "object"
     },
     "AliasContext": {
-      "description": "An alias to a repo revision.",
-      "type": "object",
       "properties": {
+        "name": {
+          "description": "The alias name.",
+          "type": "string"
+        },
         "kind": {
-          "description": "The alias kind.",
-          "enum": [
-            "ANY",
-            "FIXED",
-            "MOVABLE",
-            "OTHER"
-          ],
           "enumDescriptions": [
             "Do not use.",
             "Git tag",
             "Git branch",
             "OTHER is used to specify non-standard aliases, those not of the kinds\nabove. For example, if a Git repo has a ref named \"refs/foo/bar\", it\nis considered to be of kind OTHER."
           ],
-          "type": "string"
-        },
-        "name": {
-          "description": "The alias name.",
-          "type": "string"
-        }
-      },
-      "id": "AliasContext"
-    },
-    "CloudWorkspaceId": {
-      "description": "A CloudWorkspaceId is a unique identifier for a cloud workspace.\nA cloud workspace is a place associated with a repo where modified files\ncan be stored before they are committed.",
-      "type": "object",
-      "properties": {
-        "repoId": {
-          "description": "The ID of the repo containing the workspace.",
-          "$ref": "RepoId"
-        },
-        "name": {
-          "description": "The unique name of the workspace within the repo.  This is the name\nchosen by the client in the Source API's CreateWorkspace method.",
-          "type": "string"
-        }
-      },
-      "id": "CloudWorkspaceId"
-    },
-    "Breakpoint": {
-      "description": "Represents the breakpoint specification, status and results.",
-      "type": "object",
-      "properties": {
-        "id": {
-          "description": "Breakpoint identifier, unique in the scope of the debuggee.",
-          "type": "string"
-        },
-        "stackFrames": {
-          "description": "The stack at breakpoint time.",
-          "type": "array",
-          "items": {
-            "$ref": "StackFrame"
-          }
-        },
-        "location": {
-          "description": "Breakpoint source location.",
-          "$ref": "SourceLocation"
-        },
-        "status": {
-          "description": "Breakpoint status.\n\nThe status includes an error flag and a human readable message.\nThis field is usually unset. The message can be either\ninformational or an error message. Regardless, clients should always\ndisplay the text message back to the user.\n\nError status indicates complete failure of the breakpoint.\n\nExample (non-final state): `Still loading symbols...`\n\nExamples (final state):\n\n*   `Invalid line number` referring to location\n*   `Field f not found in class C` referring to condition",
-          "$ref": "StatusMessage"
-        },
-        "userEmail": {
-          "description": "E-mail address of the user that created this breakpoint",
-          "type": "string"
-        },
-        "condition": {
-          "description": "Condition that triggers the breakpoint.\nThe condition is a compound boolean expression composed using expressions\nin a programming language at the source location.",
-          "type": "string"
-        },
-        "finalTime": {
-          "description": "Time this breakpoint was finalized as seen by the server in seconds\nresolution.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "action": {
-          "description": "Action that the agent should perform when the code at the\nbreakpoint location is hit.",
           "enum": [
-            "CAPTURE",
-            "LOG"
+            "ANY",
+            "FIXED",
+            "MOVABLE",
+            "OTHER"
           ],
-          "enumDescriptions": [
-            "Capture stack frame and variables and update the breakpoint.\nThe data is only captured once. After that the breakpoint is set\nin a final state.",
-            "Log each breakpoint hit. The breakpoint remains active until\ndeleted or expired."
-          ],
-          "type": "string"
-        },
-        "labels": {
-          "description": "A set of custom breakpoint properties, populated by the agent, to be\ndisplayed to the user.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "logMessageFormat": {
-          "description": "Only relevant when action is `LOG`. Defines the message to log when\nthe breakpoint hits. The message may include parameter placeholders `$0`,\n`$1`, etc. These placeholders are replaced with the evaluated value\nof the appropriate expression. Expressions not referenced in\n`log_message_format` are not logged.\n\nExample: `Message received, id = $0, count = $1` with\n`expressions` = `[ message.id, message.count ]`.",
-          "type": "string"
-        },
-        "createTime": {
-          "description": "Time this breakpoint was created by the server in seconds resolution.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "logLevel": {
-          "description": "Indicates the severity of the log. Only relevant when action is `LOG`.",
-          "enum": [
-            "INFO",
-            "WARNING",
-            "ERROR"
-          ],
-          "enumDescriptions": [
-            "Information log message.",
-            "Warning log message.",
-            "Error log message."
-          ],
-          "type": "string"
-        },
-        "evaluatedExpressions": {
-          "description": "Values of evaluated expressions at breakpoint time.\nThe evaluated expressions appear in exactly the same order they\nare listed in the `expressions` field.\nThe `name` field holds the original expression text, the `value` or\n`members` field holds the result of the evaluated expression.\nIf the expression cannot be evaluated, the `status` inside the `Variable`\nwill indicate an error and contain the error text.",
-          "type": "array",
-          "items": {
-            "$ref": "Variable"
-          }
-        },
-        "isFinalState": {
-          "description": "When true, indicates that this is a final result and the\nbreakpoint state will not change from here on.",
-          "type": "boolean"
-        },
-        "expressions": {
-          "description": "List of read-only expressions to evaluate at the breakpoint location.\nThe expressions are composed using expressions in the programming language\nat the source location. If the breakpoint action is `LOG`, the evaluated\nexpressions are included in log statements.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "variableTable": {
-          "description": "The `variable_table` exists to aid with computation, memory and network\ntraffic optimization.  It enables storing a variable once and reference\nit from multiple variables, including variables stored in the\n`variable_table` itself.\nFor example, the same `this` object, which may appear at many levels of\nthe stack, can have all of its data stored once in this table.  The\nstack frame variables then would hold only a reference to it.\n\nThe variable `var_table_index` field is an index into this repeated field.\nThe stored objects are nameless and get their name from the referencing\nvariable. The effective variable is a merge of the referencing variable\nand the referenced variable.",
-          "type": "array",
-          "items": {
-            "$ref": "Variable"
-          }
-        }
-      },
-      "id": "Breakpoint"
-    },
-    "SetBreakpointResponse": {
-      "description": "Response for setting a breakpoint.",
-      "type": "object",
-      "properties": {
-        "breakpoint": {
-          "description": "Breakpoint resource.\nThe field `id` is guaranteed to be set (in addition to the echoed fileds).",
-          "$ref": "Breakpoint"
-        }
-      },
-      "id": "SetBreakpointResponse"
-    },
-    "ListActiveBreakpointsResponse": {
-      "description": "Response for listing active breakpoints.",
-      "type": "object",
-      "properties": {
-        "waitExpired": {
-          "description": "The `wait_expired` field is set to true by the server when the\nrequest times out and the field `success_on_timeout` is set to true.",
-          "type": "boolean"
-        },
-        "breakpoints": {
-          "description": "List of all active breakpoints.\nThe fields `id` and `location` are guaranteed to be set on each breakpoint.",
-          "type": "array",
-          "items": {
-            "$ref": "Breakpoint"
-          }
-        },
-        "nextWaitToken": {
-          "description": "A wait token that can be used in the next method call to block until\nthe list of breakpoints changes.",
+          "description": "The alias kind.",
           "type": "string"
         }
       },
-      "id": "ListActiveBreakpointsResponse"
-    },
-    "ExtendedSourceContext": {
-      "description": "An ExtendedSourceContext is a SourceContext combined with additional\ndetails describing the context.",
-      "type": "object",
-      "properties": {
-        "labels": {
-          "description": "Labels with user defined metadata.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "context": {
-          "description": "Any source context.",
-          "$ref": "SourceContext"
-        }
-      },
-      "id": "ExtendedSourceContext"
-    },
-    "RegisterDebuggeeRequest": {
-      "description": "Request to register a debuggee.",
-      "type": "object",
-      "properties": {
-        "debuggee": {
-          "description": "Debuggee information to register.\nThe fields `project`, `uniquifier`, `description` and `agent_version`\nof the debuggee must be set.",
-          "$ref": "Debuggee"
-        }
-      },
-      "id": "RegisterDebuggeeRequest"
-    },
-    "RepoId": {
-      "description": "A unique identifier for a cloud repo.",
-      "type": "object",
-      "properties": {
-        "projectRepoId": {
-          "description": "A combination of a project ID and a repo name.",
-          "$ref": "ProjectRepoId"
-        },
-        "uid": {
-          "description": "A server-assigned, globally unique identifier.",
-          "type": "string"
-        }
-      },
-      "id": "RepoId"
-    },
-    "ProjectRepoId": {
-      "description": "Selects a repo using a Google Cloud Platform project ID\n(e.g. winged-cargo-31) and a repo name within that project.",
-      "type": "object",
-      "properties": {
-        "repoName": {
-          "description": "The name of the repo. Leave empty for the default repo.",
-          "type": "string"
-        },
-        "projectId": {
-          "description": "The ID of the project.",
-          "type": "string"
-        }
-      },
-      "id": "ProjectRepoId"
-    },
-    "CloudWorkspaceSourceContext": {
-      "description": "A CloudWorkspaceSourceContext denotes a workspace at a particular snapshot.",
-      "type": "object",
-      "properties": {
-        "snapshotId": {
-          "description": "The ID of the snapshot.\nAn empty snapshot_id refers to the most recent snapshot.",
-          "type": "string"
-        },
-        "workspaceId": {
-          "description": "The ID of the workspace.",
-          "$ref": "CloudWorkspaceId"
-        }
-      },
-      "id": "CloudWorkspaceSourceContext"
+      "id": "AliasContext",
+      "description": "An alias to a repo revision.",
+      "type": "object"
     },
     "ListDebuggeesResponse": {
       "description": "Response for listing debuggees.",
@@ -827,47 +556,343 @@
       },
       "id": "ListDebuggeesResponse"
     },
-    "CloudRepoSourceContext": {
-      "description": "A CloudRepoSourceContext denotes a particular revision in a cloud\nrepo (a repo hosted by the Google Cloud Platform).",
+    "Empty": {
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
+      "type": "object",
+      "properties": {},
+      "id": "Empty"
+    },
+    "SourceLocation": {
+      "description": "Represents a location in the source code.",
       "type": "object",
       "properties": {
-        "aliasName": {
-          "description": "The name of an alias (branch, tag, etc.).",
-          "type": "string"
+        "line": {
+          "description": "Line inside the file. The first line in the file has the value `1`.",
+          "format": "int32",
+          "type": "integer"
         },
-        "aliasContext": {
-          "description": "An alias, which may be a branch or tag.",
-          "$ref": "AliasContext"
-        },
-        "repoId": {
-          "description": "The ID of the repo.",
-          "$ref": "RepoId"
-        },
-        "revisionId": {
-          "description": "A revision ID.",
+        "path": {
+          "description": "Path to the source file within the source context of the target binary.",
           "type": "string"
         }
       },
-      "id": "CloudRepoSourceContext"
+      "id": "SourceLocation"
+    },
+    "Debuggee": {
+      "properties": {
+        "extSourceContexts": {
+          "description": "References to the locations and revisions of the source code used in the\ndeployed application.\n\nContexts describing a remote repo related to the source code\nhave a `category` label of `remote_repo`. Source snapshot source\ncontexts have a `category` of `snapshot`.",
+          "type": "array",
+          "items": {
+            "$ref": "ExtendedSourceContext"
+          }
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "A set of custom debuggee properties, populated by the agent, to be\ndisplayed to the user.",
+          "type": "object"
+        },
+        "isInactive": {
+          "description": "If set to `true`, indicates that the debuggee is considered as inactive by\nthe Controller service.",
+          "type": "boolean"
+        },
+        "status": {
+          "description": "Human readable message to be displayed to the user about this debuggee.\nAbsence of this field indicates no status. The message can be either\ninformational or an error status.",
+          "$ref": "StatusMessage"
+        },
+        "project": {
+          "description": "Project the debuggee is associated with.\nUse the project number when registering a Google Cloud Platform project.",
+          "type": "string"
+        },
+        "isDisabled": {
+          "description": "If set to `true`, indicates that the agent should disable itself and\ndetach from the debuggee.",
+          "type": "boolean"
+        },
+        "agentVersion": {
+          "description": "Version ID of the agent release. The version ID is structured as\nfollowing: `domain/type/vmajor.minor` (for example\n`google.com/gcp-java/v1.1`).",
+          "type": "string"
+        },
+        "id": {
+          "description": "Unique identifier for the debuggee generated by the controller service.",
+          "type": "string"
+        },
+        "uniquifier": {
+          "description": "Debuggee uniquifier within the project.\nAny string that identifies the application within the project can be used.\nIncluding environment and version or build IDs is recommended.",
+          "type": "string"
+        },
+        "description": {
+          "description": "Human readable description of the debuggee.\nIncluding a human-readable project name, environment name and version\ninformation is recommended.",
+          "type": "string"
+        },
+        "sourceContexts": {
+          "description": "References to the locations and revisions of the source code used in the\ndeployed application.\n\nNOTE: This field is deprecated. Consumers should use\n`ext_source_contexts` if it is not empty. Debug agents should populate\nboth this field and `ext_source_contexts`.",
+          "type": "array",
+          "items": {
+            "$ref": "SourceContext"
+          }
+        }
+      },
+      "id": "Debuggee",
+      "description": "Represents the application to debug. The application may include one or more\nreplicated processes executing the same code. Each of these processes is\nattached with a debugger agent, carrying out the debugging commands.\nThe agents attached to the same debuggee are identified by using exactly the\nsame field values when registering.",
+      "type": "object"
+    },
+    "ProjectRepoId": {
+      "description": "Selects a repo using a Google Cloud Platform project ID\n(e.g. winged-cargo-31) and a repo name within that project.",
+      "type": "object",
+      "properties": {
+        "projectId": {
+          "description": "The ID of the project.",
+          "type": "string"
+        },
+        "repoName": {
+          "description": "The name of the repo. Leave empty for the default repo.",
+          "type": "string"
+        }
+      },
+      "id": "ProjectRepoId"
+    },
+    "ListActiveBreakpointsResponse": {
+      "description": "Response for listing active breakpoints.",
+      "type": "object",
+      "properties": {
+        "breakpoints": {
+          "description": "List of all active breakpoints.\nThe fields `id` and `location` are guaranteed to be set on each breakpoint.",
+          "type": "array",
+          "items": {
+            "$ref": "Breakpoint"
+          }
+        },
+        "waitExpired": {
+          "description": "The `wait_expired` field is set to true by the server when the\nrequest times out and the field `success_on_timeout` is set to true.",
+          "type": "boolean"
+        },
+        "nextWaitToken": {
+          "description": "A wait token that can be used in the next method call to block until\nthe list of breakpoints changes.",
+          "type": "string"
+        }
+      },
+      "id": "ListActiveBreakpointsResponse"
+    },
+    "CloudWorkspaceSourceContext": {
+      "properties": {
+        "snapshotId": {
+          "description": "The ID of the snapshot.\nAn empty snapshot_id refers to the most recent snapshot.",
+          "type": "string"
+        },
+        "workspaceId": {
+          "$ref": "CloudWorkspaceId",
+          "description": "The ID of the workspace."
+        }
+      },
+      "id": "CloudWorkspaceSourceContext",
+      "description": "A CloudWorkspaceSourceContext denotes a workspace at a particular snapshot.",
+      "type": "object"
+    },
+    "UpdateActiveBreakpointResponse": {
+      "properties": {},
+      "id": "UpdateActiveBreakpointResponse",
+      "description": "Response for updating an active breakpoint.\nThe message is defined to allow future extensions.",
+      "type": "object"
+    },
+    "GerritSourceContext": {
+      "properties": {
+        "gerritProject": {
+          "description": "The full project name within the host. Projects may be nested, so\n\"project/subproject\" is a valid project name.\nThe \"repo name\" is hostURI/project.",
+          "type": "string"
+        },
+        "aliasContext": {
+          "$ref": "AliasContext",
+          "description": "An alias, which may be a branch or tag."
+        },
+        "hostUri": {
+          "description": "The URI of a running Gerrit instance.",
+          "type": "string"
+        },
+        "revisionId": {
+          "description": "A revision (commit) ID.",
+          "type": "string"
+        },
+        "aliasName": {
+          "description": "The name of an alias (branch, tag, etc.).",
+          "type": "string"
+        }
+      },
+      "id": "GerritSourceContext",
+      "description": "A SourceContext referring to a Gerrit project.",
+      "type": "object"
+    },
+    "CloudWorkspaceId": {
+      "description": "A CloudWorkspaceId is a unique identifier for a cloud workspace.\nA cloud workspace is a place associated with a repo where modified files\ncan be stored before they are committed.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The unique name of the workspace within the repo.  This is the name\nchosen by the client in the Source API's CreateWorkspace method.",
+          "type": "string"
+        },
+        "repoId": {
+          "$ref": "RepoId",
+          "description": "The ID of the repo containing the workspace."
+        }
+      },
+      "id": "CloudWorkspaceId"
+    },
+    "ListBreakpointsResponse": {
+      "properties": {
+        "nextWaitToken": {
+          "description": "A wait token that can be used in the next call to `list` (REST) or\n`ListBreakpoints` (RPC) to block until the list of breakpoints has changes.",
+          "type": "string"
+        },
+        "breakpoints": {
+          "description": "List of breakpoints matching the request.\nThe fields `id` and `location` are guaranteed to be set on each breakpoint.\nThe fields: `stack_frames`, `evaluated_expressions` and `variable_table`\nare cleared on each breakpoint regardless of it's status.",
+          "type": "array",
+          "items": {
+            "$ref": "Breakpoint"
+          }
+        }
+      },
+      "id": "ListBreakpointsResponse",
+      "description": "Response for listing breakpoints.",
+      "type": "object"
+    },
+    "Breakpoint": {
+      "properties": {
+        "userEmail": {
+          "description": "E-mail address of the user that created this breakpoint",
+          "type": "string"
+        },
+        "action": {
+          "enumDescriptions": [
+            "Capture stack frame and variables and update the breakpoint.\nThe data is only captured once. After that the breakpoint is set\nin a final state.",
+            "Log each breakpoint hit. The breakpoint remains active until\ndeleted or expired."
+          ],
+          "enum": [
+            "CAPTURE",
+            "LOG"
+          ],
+          "description": "Action that the agent should perform when the code at the\nbreakpoint location is hit.",
+          "type": "string"
+        },
+        "logLevel": {
+          "enumDescriptions": [
+            "Information log message.",
+            "Warning log message.",
+            "Error log message."
+          ],
+          "enum": [
+            "INFO",
+            "WARNING",
+            "ERROR"
+          ],
+          "description": "Indicates the severity of the log. Only relevant when action is `LOG`.",
+          "type": "string"
+        },
+        "id": {
+          "description": "Breakpoint identifier, unique in the scope of the debuggee.",
+          "type": "string"
+        },
+        "location": {
+          "description": "Breakpoint source location.",
+          "$ref": "SourceLocation"
+        },
+        "finalTime": {
+          "description": "Time this breakpoint was finalized as seen by the server in seconds\nresolution.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "variableTable": {
+          "description": "The `variable_table` exists to aid with computation, memory and network\ntraffic optimization.  It enables storing a variable once and reference\nit from multiple variables, including variables stored in the\n`variable_table` itself.\nFor example, the same `this` object, which may appear at many levels of\nthe stack, can have all of its data stored once in this table.  The\nstack frame variables then would hold only a reference to it.\n\nThe variable `var_table_index` field is an index into this repeated field.\nThe stored objects are nameless and get their name from the referencing\nvariable. The effective variable is a merge of the referencing variable\nand the referenced variable.",
+          "type": "array",
+          "items": {
+            "$ref": "Variable"
+          }
+        },
+        "createTime": {
+          "description": "Time this breakpoint was created by the server in seconds resolution.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "A set of custom breakpoint properties, populated by the agent, to be\ndisplayed to the user.",
+          "type": "object"
+        },
+        "logMessageFormat": {
+          "description": "Only relevant when action is `LOG`. Defines the message to log when\nthe breakpoint hits. The message may include parameter placeholders `$0`,\n`$1`, etc. These placeholders are replaced with the evaluated value\nof the appropriate expression. Expressions not referenced in\n`log_message_format` are not logged.\n\nExample: `Message received, id = $0, count = $1` with\n`expressions` = `[ message.id, message.count ]`.",
+          "type": "string"
+        },
+        "expressions": {
+          "description": "List of read-only expressions to evaluate at the breakpoint location.\nThe expressions are composed using expressions in the programming language\nat the source location. If the breakpoint action is `LOG`, the evaluated\nexpressions are included in log statements.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "evaluatedExpressions": {
+          "description": "Values of evaluated expressions at breakpoint time.\nThe evaluated expressions appear in exactly the same order they\nare listed in the `expressions` field.\nThe `name` field holds the original expression text, the `value` or\n`members` field holds the result of the evaluated expression.\nIf the expression cannot be evaluated, the `status` inside the `Variable`\nwill indicate an error and contain the error text.",
+          "type": "array",
+          "items": {
+            "$ref": "Variable"
+          }
+        },
+        "isFinalState": {
+          "description": "When true, indicates that this is a final result and the\nbreakpoint state will not change from here on.",
+          "type": "boolean"
+        },
+        "stackFrames": {
+          "description": "The stack at breakpoint time.",
+          "type": "array",
+          "items": {
+            "$ref": "StackFrame"
+          }
+        },
+        "condition": {
+          "description": "Condition that triggers the breakpoint.\nThe condition is a compound boolean expression composed using expressions\nin a programming language at the source location.",
+          "type": "string"
+        },
+        "status": {
+          "$ref": "StatusMessage",
+          "description": "Breakpoint status.\n\nThe status includes an error flag and a human readable message.\nThis field is usually unset. The message can be either\ninformational or an error message. Regardless, clients should always\ndisplay the text message back to the user.\n\nError status indicates complete failure of the breakpoint.\n\nExample (non-final state): `Still loading symbols...`\n\nExamples (final state):\n\n*   `Invalid line number` referring to location\n*   `Field f not found in class C` referring to condition"
+        }
+      },
+      "id": "Breakpoint",
+      "description": "Represents the breakpoint specification, status and results.",
+      "type": "object"
+    },
+    "SetBreakpointResponse": {
+      "properties": {
+        "breakpoint": {
+          "$ref": "Breakpoint",
+          "description": "Breakpoint resource.\nThe field `id` is guaranteed to be set (in addition to the echoed fileds)."
+        }
+      },
+      "id": "SetBreakpointResponse",
+      "description": "Response for setting a breakpoint.",
+      "type": "object"
     },
     "UpdateActiveBreakpointRequest": {
       "description": "Request to update an active breakpoint.",
       "type": "object",
       "properties": {
         "breakpoint": {
-          "description": "Updated breakpoint information.\nThe field 'id' must be set.",
-          "$ref": "Breakpoint"
+          "$ref": "Breakpoint",
+          "description": "Updated breakpoint information.\nThe field 'id' must be set."
         }
       },
       "id": "UpdateActiveBreakpointRequest"
     },
     "SourceContext": {
-      "description": "A SourceContext is a reference to a tree of files. A SourceContext together\nwith a path point to a unique revision of a single file or directory.",
-      "type": "object",
       "properties": {
+        "gerrit": {
+          "description": "A SourceContext referring to a Gerrit project.",
+          "$ref": "GerritSourceContext"
+        },
         "cloudRepo": {
-          "description": "A SourceContext referring to a revision in a cloud repo.",
-          "$ref": "CloudRepoSourceContext"
+          "$ref": "CloudRepoSourceContext",
+          "description": "A SourceContext referring to a revision in a cloud repo."
         },
         "cloudWorkspace": {
           "description": "A SourceContext referring to a snapshot in a cloud workspace.",
@@ -876,34 +901,67 @@
         "git": {
           "description": "A SourceContext referring to any third party Git repo (e.g. GitHub).",
           "$ref": "GitSourceContext"
-        },
-        "gerrit": {
-          "description": "A SourceContext referring to a Gerrit project.",
-          "$ref": "GerritSourceContext"
         }
       },
-      "id": "SourceContext"
+      "id": "SourceContext",
+      "description": "A SourceContext is a reference to a tree of files. A SourceContext together\nwith a path point to a unique revision of a single file or directory.",
+      "type": "object"
     },
-    "Empty": {
-      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
-      "type": "object",
-      "properties": {},
-      "id": "Empty"
-    },
-    "GitSourceContext": {
-      "description": "A GitSourceContext denotes a particular revision in a third party Git\nrepository (e.g. GitHub).",
-      "type": "object",
+    "CloudRepoSourceContext": {
       "properties": {
-        "url": {
-          "description": "Git repository URL.",
-          "type": "string"
+        "aliasContext": {
+          "$ref": "AliasContext",
+          "description": "An alias, which may be a branch or tag."
         },
         "revisionId": {
-          "description": "Git commit hash.\nrequired.",
+          "description": "A revision ID.",
           "type": "string"
+        },
+        "aliasName": {
+          "description": "The name of an alias (branch, tag, etc.).",
+          "type": "string"
+        },
+        "repoId": {
+          "description": "The ID of the repo.",
+          "$ref": "RepoId"
         }
       },
-      "id": "GitSourceContext"
+      "id": "CloudRepoSourceContext",
+      "description": "A CloudRepoSourceContext denotes a particular revision in a cloud\nrepo (a repo hosted by the Google Cloud Platform).",
+      "type": "object"
+    },
+    "RegisterDebuggeeResponse": {
+      "properties": {
+        "debuggee": {
+          "$ref": "Debuggee",
+          "description": "Debuggee resource.\nThe field `id` is guranteed to be set (in addition to the echoed fields)."
+        }
+      },
+      "id": "RegisterDebuggeeResponse",
+      "description": "Response for registering a debuggee.",
+      "type": "object"
+    },
+    "RegisterDebuggeeRequest": {
+      "properties": {
+        "debuggee": {
+          "description": "Debuggee information to register.\nThe fields `project`, `uniquifier`, `description` and `agent_version`\nof the debuggee must be set.",
+          "$ref": "Debuggee"
+        }
+      },
+      "id": "RegisterDebuggeeRequest",
+      "description": "Request to register a debuggee.",
+      "type": "object"
+    },
+    "GetBreakpointResponse": {
+      "properties": {
+        "breakpoint": {
+          "$ref": "Breakpoint",
+          "description": "Complete breakpoint state.\nThe fields `id` and `location` are guaranteed to be set."
+        }
+      },
+      "id": "GetBreakpointResponse",
+      "description": "Response for getting breakpoint information.",
+      "type": "object"
     },
     "StatusMessage": {
       "description": "Represents a contextual status message.\nThe message can indicate an error or informational status, and refer to\nspecific parts of the containing object.\nFor example, the `Breakpoint.status` field can indicate an error referring\nto the `BREAKPOINT_SOURCE_LOCATION` with the message `Location not found`.",
@@ -918,16 +976,6 @@
           "$ref": "FormatMessage"
         },
         "refersTo": {
-          "description": "Reference to which the message applies.",
-          "enum": [
-            "UNSPECIFIED",
-            "BREAKPOINT_SOURCE_LOCATION",
-            "BREAKPOINT_CONDITION",
-            "BREAKPOINT_EXPRESSION",
-            "BREAKPOINT_AGE",
-            "VARIABLE_NAME",
-            "VARIABLE_VALUE"
-          ],
           "enumDescriptions": [
             "Status doesn't refer to any particular input.",
             "Status applies to the breakpoint and is related to its location.",
@@ -937,123 +985,75 @@
             "Status applies to the entire variable.",
             "Status applies to variable value (variable name is valid)."
           ],
+          "enum": [
+            "UNSPECIFIED",
+            "BREAKPOINT_SOURCE_LOCATION",
+            "BREAKPOINT_CONDITION",
+            "BREAKPOINT_EXPRESSION",
+            "BREAKPOINT_AGE",
+            "VARIABLE_NAME",
+            "VARIABLE_VALUE"
+          ],
+          "description": "Reference to which the message applies.",
           "type": "string"
         }
       },
       "id": "StatusMessage"
     },
-    "UpdateActiveBreakpointResponse": {
-      "description": "Response for updating an active breakpoint.\nThe message is defined to allow future extensions.",
+    "GitSourceContext": {
+      "properties": {
+        "revisionId": {
+          "description": "Git commit hash.\nrequired.",
+          "type": "string"
+        },
+        "url": {
+          "description": "Git repository URL.",
+          "type": "string"
+        }
+      },
+      "id": "GitSourceContext",
+      "description": "A GitSourceContext denotes a particular revision in a third party Git\nrepository (e.g. GitHub).",
+      "type": "object"
+    },
+    "Variable": {
+      "description": "Represents a variable or an argument possibly of a compound object type.\nNote how the following variables are represented:\n\n1) A simple variable:\n\n    int x = 5\n\n    { name: \"x\", value: \"5\", type: \"int\" }  // Captured variable\n\n2) A compound object:\n\n    struct T {\n        int m1;\n        int m2;\n    };\n    T x = { 3, 7 };\n\n    {  // Captured variable\n        name: \"x\",\n        type: \"T\",\n        members { name: \"m1\", value: \"3\", type: \"int\" },\n        members { name: \"m2\", value: \"7\", type: \"int\" }\n    }\n\n3) A pointer where the pointee was captured:\n\n    T x = { 3, 7 };\n    T* p = &x;\n\n    {   // Captured variable\n        name: \"p\",\n        type: \"T*\",\n        value: \"0x00500500\",\n        members { name: \"m1\", value: \"3\", type: \"int\" },\n        members { name: \"m2\", value: \"7\", type: \"int\" }\n    }\n\n4) A pointer where the pointee was not captured:\n\n    T* p = new T;\n\n    {   // Captured variable\n        name: \"p\",\n        type: \"T*\",\n        value: \"0x00400400\"\n        status { is_error: true, description { format: \"unavailable\" } }\n    }\n\nThe status should describe the reason for the missing value,\nsuch as `\u003coptimized out\u003e`, `\u003cinaccessible\u003e`, `\u003cpointers limit reached\u003e`.\n\nNote that a null pointer should not have members.\n\n5) An unnamed value:\n\n    int* p = new int(7);\n\n    {   // Captured variable\n        name: \"p\",\n        value: \"0x00500500\",\n        type: \"int*\",\n        members { value: \"7\", type: \"int\" } }\n\n6) An unnamed pointer where the pointee was not captured:\n\n    int* p = new int(7);\n    int** pp = &p;\n\n    {  // Captured variable\n        name: \"pp\",\n        value: \"0x00500500\",\n        type: \"int**\",\n        members {\n            value: \"0x00400400\",\n            type: \"int*\"\n            status {\n                is_error: true,\n                description: { format: \"unavailable\" } }\n            }\n        }\n    }\n\nTo optimize computation, memory and network traffic, variables that\nrepeat in the output multiple times can be stored once in a shared\nvariable table and be referenced using the `var_table_index` field.  The\nvariables stored in the shared table are nameless and are essentially\na partition of the complete variable. To reconstruct the complete\nvariable, merge the referencing variable with the referenced variable.\n\nWhen using the shared variable table, the following variables:\n\n    T x = { 3, 7 };\n    T* p = &x;\n    T& r = x;\n\n    { name: \"x\", var_table_index: 3, type: \"T\" }  // Captured variables\n    { name: \"p\", value \"0x00500500\", type=\"T*\", var_table_index: 3 }\n    { name: \"r\", type=\"T&\", var_table_index: 3 }\n\n    {  // Shared variable table entry #3:\n        members { name: \"m1\", value: \"3\", type: \"int\" },\n        members { name: \"m2\", value: \"7\", type: \"int\" }\n    }\n\nNote that the pointer address is stored with the referencing variable\nand not with the referenced variable. This allows the referenced variable\nto be shared between pointers and references.\n\nThe type field is optional. The debugger agent may or may not support it.",
       "type": "object",
-      "properties": {},
-      "id": "UpdateActiveBreakpointResponse"
+      "properties": {
+        "name": {
+          "description": "Name of the variable, if any.",
+          "type": "string"
+        },
+        "type": {
+          "description": "Variable type (e.g. `MyClass`). If the variable is split with\n`var_table_index`, `type` goes next to `value`. The interpretation of\na type is agent specific. It is recommended to include the dynamic type\nrather than a static type of an object.",
+          "type": "string"
+        },
+        "varTableIndex": {
+          "description": "Reference to a variable in the shared variable table. More than\none variable can reference the same variable in the table. The\n`var_table_index` field is an index into `variable_table` in Breakpoint.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "value": {
+          "description": "Simple value of the variable.",
+          "type": "string"
+        },
+        "members": {
+          "description": "Members contained or pointed to by the variable.",
+          "type": "array",
+          "items": {
+            "$ref": "Variable"
+          }
+        },
+        "status": {
+          "$ref": "StatusMessage",
+          "description": "Status associated with the variable. This field will usually stay\nunset. A status of a single variable only applies to that variable or\nexpression. The rest of breakpoint data still remains valid. Variables\nmight be reported in error state even when breakpoint is not in final\nstate.\n\nThe message may refer to variable name with `refers_to` set to\n`VARIABLE_NAME`. Alternatively `refers_to` will be set to `VARIABLE_VALUE`.\nIn either case variable value and members will be unset.\n\nExample of error message applied to name: `Invalid expression syntax`.\n\nExample of information message applied to value: `Not captured`.\n\nExamples of error message applied to value:\n\n*   `Malformed string`,\n*   `Field f not found in class C`\n*   `Null pointer dereference`"
+        }
+      },
+      "id": "Variable"
     }
   },
-  "revision": "20170117",
-  "basePath": "",
   "icons": {
     "x32": "http://www.google.com/images/icons/product/search-32.gif",
     "x16": "http://www.google.com/images/icons/product/search-16.gif"
   },
-  "version_module": "True",
-  "canonicalName": "Cloud Debugger",
-  "discoveryVersion": "v1",
-  "baseUrl": "https://clouddebugger.googleapis.com/",
-  "name": "clouddebugger",
-  "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    }
-  },
-  "documentationLink": "http://cloud.google.com/debugger",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
-  "servicePath": "",
-  "ownerName": "Google",
-  "version": "v2",
-  "rootUrl": "https://clouddebugger.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "protocol": "rest"
 }
diff --git a/clouddebugger/v2/clouddebugger-gen.go b/clouddebugger/v2/clouddebugger-gen.go
index 98f3871..08f2d9c 100644
--- a/clouddebugger/v2/clouddebugger-gen.go
+++ b/clouddebugger/v2/clouddebugger-gen.go
@@ -65,9 +65,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Controller *ControllerService
 
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewControllerService(s *Service) *ControllerService {
 	rs := &ControllerService{s: s}
 	rs.Debuggees = NewControllerDebuggeesService(s)
@@ -1523,6 +1528,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.registerdebuggeerequest)
 	if err != nil {
@@ -1700,6 +1706,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1855,6 +1862,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.updateactivebreakpointrequest)
 	if err != nil {
@@ -2029,6 +2037,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2171,6 +2180,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}")
@@ -2330,6 +2340,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2541,6 +2552,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2713,6 +2725,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.breakpoint)
 	if err != nil {
diff --git a/clouderrorreporting/v1beta1/clouderrorreporting-api.json b/clouderrorreporting/v1beta1/clouderrorreporting-api.json
index bfbc8a7..ddf4ff9 100644
--- a/clouderrorreporting/v1beta1/clouderrorreporting-api.json
+++ b/clouderrorreporting/v1beta1/clouderrorreporting-api.json
@@ -1,204 +1,109 @@
 {
-  "id": "clouderrorreporting:v1beta1",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        }
-      }
-    }
-  },
-  "description": "Stackdriver Error Reporting groups and counts similar errors from cloud services. The Stackdriver Error Reporting API provides a way to report new errors and read access to error groups and their associated errors.\n",
-  "protocol": "rest",
   "title": "Stackdriver Error Reporting API",
+  "ownerName": "Google",
   "resources": {
     "projects": {
+      "methods": {
+        "deleteEvents": {
+          "response": {
+            "$ref": "DeleteEventsResponse"
+          },
+          "parameterOrder": [
+            "projectName"
+          ],
+          "httpMethod": "DELETE",
+          "parameters": {
+            "projectName": {
+              "required": true,
+              "type": "string",
+              "pattern": "^projects/[^/]+$",
+              "location": "path",
+              "description": "[Required] The resource name of the Google Cloud Platform project. Written\nas `projects/` plus the\n[Google Cloud Platform project\nID](https://support.google.com/cloud/answer/6158840).\nExample: `projects/my-project-123`."
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "flatPath": "v1beta1/projects/{projectsId}/events",
+          "path": "v1beta1/{+projectName}/events",
+          "id": "clouderrorreporting.projects.deleteEvents",
+          "description": "Deletes all error events of a given project."
+        }
+      },
       "resources": {
-        "events": {
+        "groups": {
           "methods": {
-            "list": {
-              "id": "clouderrorreporting.projects.events.list",
-              "response": {
-                "$ref": "ListEventsResponse"
-              },
-              "parameterOrder": [
-                "projectName"
-              ],
-              "description": "Lists the specified events.",
-              "flatPath": "v1beta1/projects/{projectsId}/events",
+            "get": {
+              "flatPath": "v1beta1/projects/{projectsId}/groups/{groupsId}",
+              "id": "clouderrorreporting.projects.groups.get",
+              "path": "v1beta1/{+groupName}",
+              "description": "Get the specified group.",
               "httpMethod": "GET",
+              "parameterOrder": [
+                "groupName"
+              ],
+              "response": {
+                "$ref": "ErrorGroup"
+              },
               "parameters": {
-                "timeRange.period": {
-                  "description": "Restricts the query to the specified time range.",
-                  "enum": [
-                    "PERIOD_UNSPECIFIED",
-                    "PERIOD_1_HOUR",
-                    "PERIOD_6_HOURS",
-                    "PERIOD_1_DAY",
-                    "PERIOD_1_WEEK",
-                    "PERIOD_30_DAYS"
-                  ],
-                  "location": "query",
-                  "type": "string"
-                },
-                "serviceFilter.resourceType": {
-                  "description": "[Optional] The exact value to match against\n[`ServiceContext.resource_type`](/error-reporting/reference/rest/v1beta1/ServiceContext#FIELDS.resource_type).",
-                  "location": "query",
-                  "type": "string"
-                },
-                "projectName": {
-                  "description": "[Required] The resource name of the Google Cloud Platform project. Written\nas `projects/` plus the\n[Google Cloud Platform project\nID](https://support.google.com/cloud/answer/6158840).\nExample: `projects/my-project-123`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+$",
+                "groupName": {
                   "location": "path",
-                  "type": "string"
-                },
-                "serviceFilter.service": {
-                  "description": "[Optional] The exact value to match against\n[`ServiceContext.service`](/error-reporting/reference/rest/v1beta1/ServiceContext#FIELDS.service).",
-                  "location": "query",
-                  "type": "string"
-                },
-                "groupId": {
-                  "description": "[Required] The group for which events shall be returned.",
-                  "location": "query",
-                  "type": "string"
-                },
-                "serviceFilter.version": {
-                  "description": "[Optional] The exact value to match against\n[`ServiceContext.version`](/error-reporting/reference/rest/v1beta1/ServiceContext#FIELDS.version).",
-                  "location": "query",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "description": "[Optional] The maximum number of results to return per response.",
-                  "location": "query",
-                  "type": "integer",
-                  "format": "int32"
-                },
-                "pageToken": {
-                  "description": "[Optional] A `next_page_token` provided by a previous response.",
-                  "location": "query",
-                  "type": "string"
+                  "description": "[Required] The group resource name. Written as\n\u003ccode\u003eprojects/\u003cvar\u003eprojectID\u003c/var\u003e/groups/\u003cvar\u003egroup_name\u003c/var\u003e\u003c/code\u003e.\nCall\n\u003ca href=\"/error-reporting/reference/rest/v1beta1/projects.groupStats/list\"\u003e\n\u003ccode\u003egroupStats.list\u003c/code\u003e\u003c/a\u003e to return a list of groups belonging to\nthis project.\n\nExample: \u003ccode\u003eprojects/my-project-123/groups/my-group\u003c/code\u003e",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/groups/[^/]+$"
                 }
               },
-              "path": "v1beta1/{+projectName}/events",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform"
               ]
             },
-            "report": {
-              "id": "clouderrorreporting.projects.events.report",
-              "response": {
-                "$ref": "ReportErrorEventResponse"
-              },
-              "parameterOrder": [
-                "projectName"
-              ],
-              "description": "Report an individual error event.\n\nThis endpoint accepts \u003cstrong\u003eeither\u003c/strong\u003e an OAuth token,\n\u003cstrong\u003eor\u003c/strong\u003e an\n\u003ca href=\"https://support.google.com/cloud/answer/6158862\"\u003eAPI key\u003c/a\u003e\nfor authentication. To use an API key, append it to the URL as the value of\na `key` parameter. For example:\n\u003cpre\u003ePOST https://clouderrorreporting.googleapis.com/v1beta1/projects/example-project/events:report?key=123ABC456\u003c/pre\u003e",
-              "request": {
-                "$ref": "ReportedErrorEvent"
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/events:report",
-              "httpMethod": "POST",
-              "parameters": {
-                "projectName": {
-                  "description": "[Required] The resource name of the Google Cloud Platform project. Written\nas `projects/` plus the\n[Google Cloud Platform project ID](https://support.google.com/cloud/answer/6158840).\nExample: `projects/my-project-123`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta1/{+projectName}/events:report",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ]
-            }
-          }
-        },
-        "groups": {
-          "methods": {
             "update": {
-              "id": "clouderrorreporting.projects.groups.update",
+              "request": {
+                "$ref": "ErrorGroup"
+              },
+              "description": "Replace the data for the specified group.\nFails if the group does not exist.",
               "response": {
                 "$ref": "ErrorGroup"
               },
               "parameterOrder": [
                 "name"
               ],
-              "description": "Replace the data for the specified group.\nFails if the group does not exist.",
-              "request": {
-                "$ref": "ErrorGroup"
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/groups/{groupsId}",
               "httpMethod": "PUT",
               "parameters": {
                 "name": {
+                  "location": "path",
                   "description": "The group resource name.\nExample: \u003ccode\u003eprojects/my-project-123/groups/my-groupid\u003c/code\u003e",
                   "required": true,
-                  "pattern": "^projects/[^/]+/groups/[^/]+$",
-                  "location": "path",
-                  "type": "string"
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/groups/[^/]+$"
                 }
               },
-              "path": "v1beta1/{+name}",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform"
-              ]
-            },
-            "get": {
-              "id": "clouderrorreporting.projects.groups.get",
-              "response": {
-                "$ref": "ErrorGroup"
-              },
-              "parameterOrder": [
-                "groupName"
               ],
-              "description": "Get the specified group.",
               "flatPath": "v1beta1/projects/{projectsId}/groups/{groupsId}",
-              "httpMethod": "GET",
-              "parameters": {
-                "groupName": {
-                  "description": "[Required] The group resource name. Written as\n\u003ccode\u003eprojects/\u003cvar\u003eprojectID\u003c/var\u003e/groups/\u003cvar\u003egroup_name\u003c/var\u003e\u003c/code\u003e.\nCall\n\u003ca href=\"/error-reporting/reference/rest/v1beta1/projects.groupStats/list\"\u003e\n\u003ccode\u003egroupStats.list\u003c/code\u003e\u003c/a\u003e to return a list of groups belonging to\nthis project.\n\nExample: \u003ccode\u003eprojects/my-project-123/groups/my-group\u003c/code\u003e",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/groups/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta1/{+groupName}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ]
+              "path": "v1beta1/{+name}",
+              "id": "clouderrorreporting.projects.groups.update"
             }
           }
         },
         "groupStats": {
           "methods": {
             "list": {
-              "id": "clouderrorreporting.projects.groupStats.list",
               "response": {
                 "$ref": "ListGroupStatsResponse"
               },
               "parameterOrder": [
                 "projectName"
               ],
-              "description": "Lists the specified groups.",
-              "flatPath": "v1beta1/projects/{projectsId}/groupStats",
               "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
               "parameters": {
-                "alignment": {
-                  "description": "[Optional] The alignment of the timed counts to be returned.\nDefault is `ALIGNMENT_EQUAL_AT_END`.",
-                  "enum": [
-                    "ERROR_COUNT_ALIGNMENT_UNSPECIFIED",
-                    "ALIGNMENT_EQUAL_ROUNDED",
-                    "ALIGNMENT_EQUAL_AT_END"
-                  ],
-                  "location": "query",
-                  "type": "string"
-                },
                 "timeRange.period": {
-                  "description": "Restricts the query to the specified time range.",
+                  "location": "query",
                   "enum": [
                     "PERIOD_UNSPECIFIED",
                     "PERIOD_1_HOUR",
@@ -207,23 +112,44 @@
                     "PERIOD_1_WEEK",
                     "PERIOD_30_DAYS"
                   ],
-                  "location": "query",
+                  "description": "Restricts the query to the specified time range.",
                   "type": "string"
                 },
-                "serviceFilter.resourceType": {
-                  "description": "[Optional] The exact value to match against\n[`ServiceContext.resource_type`](/error-reporting/reference/rest/v1beta1/ServiceContext#FIELDS.resource_type).",
+                "alignment": {
+                  "type": "string",
                   "location": "query",
-                  "type": "string"
+                  "enum": [
+                    "ERROR_COUNT_ALIGNMENT_UNSPECIFIED",
+                    "ALIGNMENT_EQUAL_ROUNDED",
+                    "ALIGNMENT_EQUAL_AT_END"
+                  ],
+                  "description": "[Optional] The alignment of the timed counts to be returned.\nDefault is `ALIGNMENT_EQUAL_AT_END`."
                 },
-                "projectName": {
-                  "description": "[Required] The resource name of the Google Cloud Platform project. Written\nas \u003ccode\u003eprojects/\u003c/code\u003e plus the\n\u003ca href=\"https://support.google.com/cloud/answer/6158840\"\u003eGoogle Cloud\nPlatform project ID\u003c/a\u003e.\n\nExample: \u003ccode\u003eprojects/my-project-123\u003c/code\u003e.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "type": "string"
+                "groupId": {
+                  "location": "query",
+                  "description": "[Optional] List all \u003ccode\u003eErrorGroupStats\u003c/code\u003e with these IDs.",
+                  "type": "string",
+                  "repeated": true
+                },
+                "serviceFilter.service": {
+                  "type": "string",
+                  "location": "query",
+                  "description": "[Optional] The exact value to match against\n[`ServiceContext.service`](/error-reporting/reference/rest/v1beta1/ServiceContext#FIELDS.service)."
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "[Optional] The maximum number of results to return per response.\nDefault is 20.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "serviceFilter.version": {
+                  "type": "string",
+                  "location": "query",
+                  "description": "[Optional] The exact value to match against\n[`ServiceContext.version`](/error-reporting/reference/rest/v1beta1/ServiceContext#FIELDS.version)."
                 },
                 "order": {
-                  "description": "[Optional] The sort order in which the results are returned.\nDefault is `COUNT_DESC`.",
+                  "type": "string",
+                  "location": "query",
                   "enum": [
                     "GROUP_ORDER_UNSPECIFIED",
                     "COUNT_DESC",
@@ -231,167 +157,359 @@
                     "CREATED_DESC",
                     "AFFECTED_USERS_DESC"
                   ],
-                  "location": "query",
-                  "type": "string"
+                  "description": "[Optional] The sort order in which the results are returned.\nDefault is `COUNT_DESC`."
                 },
-                "groupId": {
-                  "description": "[Optional] List all \u003ccode\u003eErrorGroupStats\u003c/code\u003e with these IDs.",
-                  "repeated": true,
+                "serviceFilter.resourceType": {
                   "location": "query",
-                  "type": "string"
-                },
-                "serviceFilter.service": {
-                  "description": "[Optional] The exact value to match against\n[`ServiceContext.service`](/error-reporting/reference/rest/v1beta1/ServiceContext#FIELDS.service).",
-                  "location": "query",
+                  "description": "[Optional] The exact value to match against\n[`ServiceContext.resource_type`](/error-reporting/reference/rest/v1beta1/ServiceContext#FIELDS.resource_type).",
                   "type": "string"
                 },
                 "alignmentTime": {
+                  "location": "query",
                   "description": "[Optional] Time where the timed counts shall be aligned if rounded\nalignment is chosen. Default is 00:00 UTC.",
-                  "location": "query",
-                  "type": "string",
-                  "format": "google-datetime"
-                },
-                "serviceFilter.version": {
-                  "description": "[Optional] The exact value to match against\n[`ServiceContext.version`](/error-reporting/reference/rest/v1beta1/ServiceContext#FIELDS.version).",
-                  "location": "query",
+                  "format": "google-datetime",
                   "type": "string"
                 },
-                "pageSize": {
-                  "description": "[Optional] The maximum number of results to return per response.\nDefault is 20.",
-                  "location": "query",
-                  "type": "integer",
-                  "format": "int32"
+                "projectName": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path",
+                  "description": "[Required] The resource name of the Google Cloud Platform project. Written\nas \u003ccode\u003eprojects/\u003c/code\u003e plus the\n\u003ca href=\"https://support.google.com/cloud/answer/6158840\"\u003eGoogle Cloud\nPlatform project ID\u003c/a\u003e.\n\nExample: \u003ccode\u003eprojects/my-project-123\u003c/code\u003e."
                 },
                 "timedCountDuration": {
-                  "description": "[Optional] The preferred duration for a single returned `TimedCount`.\nIf not set, no timed counts are returned.",
                   "location": "query",
-                  "type": "string",
-                  "format": "google-duration"
+                  "description": "[Optional] The preferred duration for a single returned `TimedCount`.\nIf not set, no timed counts are returned.",
+                  "format": "google-duration",
+                  "type": "string"
                 },
                 "pageToken": {
-                  "description": "[Optional] A `next_page_token` provided by a previous response. To view\nadditional results, pass this token along with the identical query\nparameters as the first request.",
                   "location": "query",
+                  "description": "[Optional] A `next_page_token` provided by a previous response. To view\nadditional results, pass this token along with the identical query\nparameters as the first request.",
                   "type": "string"
                 }
               },
+              "flatPath": "v1beta1/projects/{projectsId}/groupStats",
               "path": "v1beta1/{+projectName}/groupStats",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ]
+              "id": "clouderrorreporting.projects.groupStats.list",
+              "description": "Lists the specified groups."
             }
           }
-        }
-      },
-      "methods": {
-        "deleteEvents": {
-          "id": "clouderrorreporting.projects.deleteEvents",
-          "response": {
-            "$ref": "DeleteEventsResponse"
-          },
-          "parameterOrder": [
-            "projectName"
-          ],
-          "description": "Deletes all error events of a given project.",
-          "flatPath": "v1beta1/projects/{projectsId}/events",
-          "httpMethod": "DELETE",
-          "parameters": {
-            "projectName": {
-              "description": "[Required] The resource name of the Google Cloud Platform project. Written\nas `projects/` plus the\n[Google Cloud Platform project\nID](https://support.google.com/cloud/answer/6158840).\nExample: `projects/my-project-123`.",
-              "required": true,
-              "pattern": "^projects/[^/]+$",
-              "location": "path",
-              "type": "string"
+        },
+        "events": {
+          "methods": {
+            "list": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "projectName"
+              ],
+              "response": {
+                "$ref": "ListEventsResponse"
+              },
+              "parameters": {
+                "serviceFilter.resourceType": {
+                  "type": "string",
+                  "location": "query",
+                  "description": "[Optional] The exact value to match against\n[`ServiceContext.resource_type`](/error-reporting/reference/rest/v1beta1/ServiceContext#FIELDS.resource_type)."
+                },
+                "timeRange.period": {
+                  "location": "query",
+                  "enum": [
+                    "PERIOD_UNSPECIFIED",
+                    "PERIOD_1_HOUR",
+                    "PERIOD_6_HOURS",
+                    "PERIOD_1_DAY",
+                    "PERIOD_1_WEEK",
+                    "PERIOD_30_DAYS"
+                  ],
+                  "description": "Restricts the query to the specified time range.",
+                  "type": "string"
+                },
+                "projectName": {
+                  "location": "path",
+                  "description": "[Required] The resource name of the Google Cloud Platform project. Written\nas `projects/` plus the\n[Google Cloud Platform project\nID](https://support.google.com/cloud/answer/6158840).\nExample: `projects/my-project-123`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                },
+                "groupId": {
+                  "type": "string",
+                  "location": "query",
+                  "description": "[Required] The group for which events shall be returned."
+                },
+                "pageToken": {
+                  "type": "string",
+                  "location": "query",
+                  "description": "[Optional] A `next_page_token` provided by a previous response."
+                },
+                "serviceFilter.service": {
+                  "location": "query",
+                  "description": "[Optional] The exact value to match against\n[`ServiceContext.service`](/error-reporting/reference/rest/v1beta1/ServiceContext#FIELDS.service).",
+                  "type": "string"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "[Optional] The maximum number of results to return per response.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "serviceFilter.version": {
+                  "location": "query",
+                  "description": "[Optional] The exact value to match against\n[`ServiceContext.version`](/error-reporting/reference/rest/v1beta1/ServiceContext#FIELDS.version).",
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1beta1/projects/{projectsId}/events",
+              "id": "clouderrorreporting.projects.events.list",
+              "path": "v1beta1/{+projectName}/events",
+              "description": "Lists the specified events."
+            },
+            "report": {
+              "request": {
+                "$ref": "ReportedErrorEvent"
+              },
+              "description": "Report an individual error event.\n\nThis endpoint accepts \u003cstrong\u003eeither\u003c/strong\u003e an OAuth token,\n\u003cstrong\u003eor\u003c/strong\u003e an\n\u003ca href=\"https://support.google.com/cloud/answer/6158862\"\u003eAPI key\u003c/a\u003e\nfor authentication. To use an API key, append it to the URL as the value of\na `key` parameter. For example:\n\u003cpre\u003ePOST https://clouderrorreporting.googleapis.com/v1beta1/projects/example-project/events:report?key=123ABC456\u003c/pre\u003e",
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "projectName"
+              ],
+              "response": {
+                "$ref": "ReportErrorEventResponse"
+              },
+              "parameters": {
+                "projectName": {
+                  "location": "path",
+                  "description": "[Required] The resource name of the Google Cloud Platform project. Written\nas `projects/` plus the\n[Google Cloud Platform project ID](https://support.google.com/cloud/answer/6158840).\nExample: `projects/my-project-123`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1beta1/projects/{projectsId}/events:report",
+              "id": "clouderrorreporting.projects.events.report",
+              "path": "v1beta1/{+projectName}/events:report"
             }
-          },
-          "path": "v1beta1/{+projectName}/events",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
+          }
         }
       }
     }
   },
+  "parameters": {
+    "upload_protocol": {
+      "type": "string",
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\")."
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format."
+    },
+    "alt": {
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ]
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "type": "boolean",
+      "default": "true",
+      "location": "query",
+      "description": "Pretty-print response."
+    },
+    "bearer_token": {
+      "location": "query",
+      "description": "OAuth bearer token.",
+      "type": "string"
+    },
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    }
+  },
+  "version": "v1beta1",
+  "baseUrl": "https://clouderrorreporting.googleapis.com/",
+  "servicePath": "",
+  "description": "Stackdriver Error Reporting groups and counts similar errors from cloud services. The Stackdriver Error Reporting API provides a way to report new errors and read access to error groups and their associated errors.\n",
+  "kind": "discovery#restDescription",
+  "basePath": "",
+  "documentationLink": "https://cloud.google.com/error-reporting/",
+  "revision": "20170113",
+  "id": "clouderrorreporting:v1beta1",
+  "discoveryVersion": "v1",
+  "version_module": "True",
   "schemas": {
-    "ReportedErrorEvent": {
-      "description": "An error event which is reported to the Error Reporting system.",
+    "DeleteEventsResponse": {
+      "type": "object",
+      "properties": {},
+      "id": "DeleteEventsResponse",
+      "description": "Response message for deleting error events."
+    },
+    "ErrorEvent": {
       "type": "object",
       "properties": {
-        "serviceContext": {
-          "description": "[Required] The service context in which this error has occurred.",
-          "$ref": "ServiceContext"
-        },
         "context": {
-          "description": "[Optional] A description of the context in which the error occurred.",
-          "$ref": "ErrorContext"
-        },
-        "eventTime": {
-          "description": "[Optional] Time when the event occurred.\nIf not provided, the time when the event was received by the\nError Reporting system will be used.",
-          "type": "string",
-          "format": "google-datetime"
+          "$ref": "ErrorContext",
+          "description": "Data about the context in which the error occurred."
         },
         "message": {
-          "description": "[Required] A message describing the error. The message can contain an\nexception stack in one of the supported programming languages and formats.\nIn that case, the message is parsed and detailed exception information\nis returned when retrieving the error event again.",
+          "description": "The stack trace that was reported or logged by the service.",
           "type": "string"
+        },
+        "serviceContext": {
+          "$ref": "ServiceContext",
+          "description": "The `ServiceContext` for which this error was reported."
+        },
+        "eventTime": {
+          "type": "string",
+          "description": "Time when the event occurred as provided in the error report.\nIf the report did not contain a timestamp, the time the error was received\nby the Error Reporting system is used.",
+          "format": "google-datetime"
         }
       },
-      "id": "ReportedErrorEvent"
+      "id": "ErrorEvent",
+      "description": "An error event which is returned by the Error Reporting system."
     },
-    "SourceLocation": {
-      "description": "Indicates a location in the source code of the service for which\nerrors are reported.\nThis data should be provided by the application when reporting an error,\nunless the error report has been generated automatically from Google App\nEngine logs. All fields are optional.",
+    "ReportedErrorEvent": {
       "type": "object",
       "properties": {
-        "filePath": {
-          "description": "The source code filename, which can include a truncated relative\npath, or a full path from a production machine.",
-          "type": "string"
+        "context": {
+          "$ref": "ErrorContext",
+          "description": "[Optional] A description of the context in which the error occurred."
         },
-        "functionName": {
-          "description": "Human-readable name of a function or method.\nThe value can include optional context like the class or package name.\nFor example, `my.package.MyClass.method` in case of Java.",
-          "type": "string"
+        "message": {
+          "type": "string",
+          "description": "[Required] The error message.\nIf no `context.reportLocation` is provided, the message must contain a\nheader (typically consisting of the exception type name and an error\nmessage) and an exception stack trace in one of the supported programming\nlanguages and formats.\nSupported languages are Java, Python, JavaScript, Ruby, C#, PHP, and Go.\nSupported stack trace formats are:\n\n* **Java**: Must be the return value of [`Throwable.printStackTrace()`](https://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html#printStackTrace%28%29).\n* **Python**: Must be the return value of [`traceback.format_exc()`](https://docs.python.org/2/library/traceback.html#traceback.format_exc).\n* **JavaScript**: Must be the value of [`error.stack`](https://github.com/v8/v8/wiki/Stack-Trace-API)\nas returned by V8.\n* **Ruby**: Must contain frames returned by [`Exception.backtrace`](https://ruby-doc.org/core-2.2.0/Exception.html#method-i-backtrace).\n* **C#**: Must be the return value of [`Exception.ToString()`](https://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx).\n* **PHP**: Must start with `PHP (Notice|Parse error|Fatal error|Warning)`\nand contain the result of [`(string)$exception`](http://php.net/manual/en/exception.tostring.php).\n* **Go**: Must be the return value of [`runtime.Stack()`](https://golang.org/pkg/runtime/debug/#Stack)."
         },
-        "lineNumber": {
-          "description": "1-based. 0 indicates that the line number is unknown.",
-          "type": "integer",
-          "format": "int32"
+        "serviceContext": {
+          "$ref": "ServiceContext",
+          "description": "[Required] The service context in which this error has occurred."
+        },
+        "eventTime": {
+          "type": "string",
+          "description": "[Optional] Time when the event occurred.\nIf not provided, the time when the event was received by the\nError Reporting system will be used.",
+          "format": "google-datetime"
         }
       },
-      "id": "SourceLocation"
+      "id": "ReportedErrorEvent",
+      "description": "An error event which is reported to the Error Reporting system."
+    },
+    "ErrorContext": {
+      "description": "A description of the context in which an error occurred.\nThis data should be provided by the application when reporting an error,\nunless the\nerror report has been generated automatically from Google App Engine logs.",
+      "type": "object",
+      "properties": {
+        "reportLocation": {
+          "$ref": "SourceLocation",
+          "description": "The location in the source code where the decision was made to\nreport the error, usually the place where it was logged.\nFor a logged exception this would be the source line where the\nexception is logged, usually close to the place where it was\ncaught. This value is in contrast to `Exception.cause_location`,\nwhich describes the source line where the exception was thrown."
+        },
+        "httpRequest": {
+          "$ref": "HttpRequestContext",
+          "description": "The HTTP request which was processed when the error was\ntriggered."
+        },
+        "user": {
+          "description": "The user who caused or was affected by the crash.\nThis can be a user ID, an email address, or an arbitrary token that\nuniquely identifies the user.\nWhen sending an error report, leave this field empty if the user was not\nlogged in. In this case the\nError Reporting system will use other data, such as remote IP address, to\ndistinguish affected users. See `affected_users_count` in\n`ErrorGroupStats`.",
+          "type": "string"
+        }
+      },
+      "id": "ErrorContext"
+    },
+    "TrackingIssue": {
+      "type": "object",
+      "properties": {
+        "url": {
+          "type": "string",
+          "description": "A URL pointing to a related entry in an issue tracking system.\nExample: https://github.com/user/project/issues/4"
+        }
+      },
+      "id": "TrackingIssue",
+      "description": "Information related to tracking the progress on resolving the error."
     },
     "ErrorGroupStats": {
-      "description": "Data extracted for a specific group based on certain filter criteria,\nsuch as a given time period and/or service filter.",
       "type": "object",
       "properties": {
-        "representative": {
-          "description": "An arbitrary event that is chosen as representative for the whole group.\nThe representative event is intended to be used as a quick preview for\nthe whole group. Events in the group are usually sufficiently similar\nto each other such that showing an arbitrary representative provides\ninsight into the characteristics of the group as a whole.",
-          "$ref": "ErrorEvent"
-        },
-        "numAffectedServices": {
-          "description": "The total number of services with a non-zero error count for the given\nfilter criteria.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "affectedUsersCount": {
-          "description": "Approximate number of affected users in the given group that\nmatch the filter criteria.\nUsers are distinguished by data in the `ErrorContext` of the\nindividual error events, such as their login name or their remote\nIP address in case of HTTP requests.\nThe number of affected users can be zero even if the number of\nerrors is non-zero if no data was provided from which the\naffected user could be deduced.\nUsers are counted based on data in the request\ncontext that was provided in the error report. If more users are\nimplicitly affected, such as due to a crash of the whole service,\nthis is not reflected here.",
-          "type": "string",
-          "format": "int64"
-        },
-        "count": {
-          "description": "Approximate total number of events in the given group that match\nthe filter criteria.",
-          "type": "string",
-          "format": "int64"
+        "group": {
+          "$ref": "ErrorGroup",
+          "description": "Group data that is independent of the filter criteria."
         },
         "firstSeenTime": {
-          "description": "Approximate first occurrence that was ever seen for this group\nand which matches the given filter criteria, ignoring the\ntime_range that was specified in the request.",
           "type": "string",
+          "description": "Approximate first occurrence that was ever seen for this group\nand which matches the given filter criteria, ignoring the\ntime_range that was specified in the request.",
           "format": "google-datetime"
         },
+        "count": {
+          "type": "string",
+          "description": "Approximate total number of events in the given group that match\nthe filter criteria.",
+          "format": "int64"
+        },
         "lastSeenTime": {
-          "description": "Approximate last occurrence that was ever seen for this group and\nwhich matches the given filter criteria, ignoring the time_range\nthat was specified in the request.",
           "type": "string",
+          "description": "Approximate last occurrence that was ever seen for this group and\nwhich matches the given filter criteria, ignoring the time_range\nthat was specified in the request.",
           "format": "google-datetime"
         },
-        "group": {
-          "description": "Group data that is independent of the filter criteria.",
-          "$ref": "ErrorGroup"
+        "affectedUsersCount": {
+          "type": "string",
+          "description": "Approximate number of affected users in the given group that\nmatch the filter criteria.\nUsers are distinguished by data in the `ErrorContext` of the\nindividual error events, such as their login name or their remote\nIP address in case of HTTP requests.\nThe number of affected users can be zero even if the number of\nerrors is non-zero if no data was provided from which the\naffected user could be deduced.\nUsers are counted based on data in the request\ncontext that was provided in the error report. If more users are\nimplicitly affected, such as due to a crash of the whole service,\nthis is not reflected here.",
+          "format": "int64"
         },
         "affectedServices": {
           "description": "Service contexts with a non-zero error count for the given filter\ncriteria. This list can be truncated if multiple services are affected.\nRefer to `num_affected_services` for the total count.",
@@ -400,6 +518,15 @@
             "$ref": "ServiceContext"
           }
         },
+        "numAffectedServices": {
+          "description": "The total number of services with a non-zero error count for the given\nfilter criteria.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "representative": {
+          "$ref": "ErrorEvent",
+          "description": "An arbitrary event that is chosen as representative for the whole group.\nThe representative event is intended to be used as a quick preview for\nthe whole group. Events in the group are usually sufficiently similar\nto each other such that showing an arbitrary representative provides\ninsight into the characteristics of the group as a whole."
+        },
         "timedCounts": {
           "description": "Approximate number of occurrences over time.\nTimed counts returned by ListGroups are guaranteed to be:\n\n- Inside the requested time interval\n- Non-overlapping, and\n- Ordered by ascending time.",
           "type": "array",
@@ -408,181 +535,128 @@
           }
         }
       },
-      "id": "ErrorGroupStats"
+      "id": "ErrorGroupStats",
+      "description": "Data extracted for a specific group based on certain filter criteria,\nsuch as a given time period and/or service filter."
     },
-    "ErrorContext": {
-      "description": "A description of the context in which an error occurred.\nThis data should be provided by the application when reporting an error,\nunless the\nerror report has been generated automatically from Google App Engine logs.",
+    "ListEventsResponse": {
       "type": "object",
       "properties": {
-        "httpRequest": {
-          "description": "The HTTP request which was processed when the error was\ntriggered.",
-          "$ref": "HttpRequestContext"
+        "nextPageToken": {
+          "type": "string",
+          "description": "If non-empty, more results are available.\nPass this token, along with the same query parameters as the first\nrequest, to view the next page of results."
         },
-        "reportLocation": {
-          "description": "The location in the source code where the decision was made to\nreport the error, usually the place where it was logged.\nFor a logged exception this would be the source line where the\nexception is logged, usually close to the place where it was\ncaught. This value is in contrast to `Exception.cause_location`,\nwhich describes the source line where the exception was thrown.",
-          "$ref": "SourceLocation"
+        "timeRangeBegin": {
+          "type": "string",
+          "description": "The timestamp specifies the start time to which the request was restricted.",
+          "format": "google-datetime"
         },
-        "user": {
-          "description": "The user who caused or was affected by the crash.\nThis can be a user ID, an email address, or an arbitrary token that\nuniquely identifies the user.\nWhen sending an error report, leave this field empty if the user was not\nlogged in. In this case the\nError Reporting system will use other data, such as remote IP address, to\ndistinguish affected users. See `affected_users_count` in\n`ErrorGroupStats`.",
-          "type": "string"
+        "errorEvents": {
+          "type": "array",
+          "items": {
+            "$ref": "ErrorEvent"
+          },
+          "description": "The error events which match the given request."
         }
       },
-      "id": "ErrorContext"
+      "id": "ListEventsResponse",
+      "description": "Contains a set of requested error events."
+    },
+    "TimedCount": {
+      "type": "object",
+      "properties": {
+        "endTime": {
+          "type": "string",
+          "description": "End of the time period to which `count` refers (excluded).",
+          "format": "google-datetime"
+        },
+        "count": {
+          "description": "Approximate number of occurrences in the given time period.",
+          "format": "int64",
+          "type": "string"
+        },
+        "startTime": {
+          "type": "string",
+          "description": "Start of the time period to which `count` refers (included).",
+          "format": "google-datetime"
+        }
+      },
+      "id": "TimedCount",
+      "description": "The number of errors in a given time period.\nAll numbers are approximate since the error events are sampled\nbefore counting them."
+    },
+    "ErrorGroup": {
+      "description": "Description of a group of similar error events.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The group resource name.\nExample: \u003ccode\u003eprojects/my-project-123/groups/my-groupid\u003c/code\u003e",
+          "type": "string"
+        },
+        "groupId": {
+          "description": "Group IDs are unique for a given project. If the same kind of error\noccurs in different service contexts, it will receive the same group ID.",
+          "type": "string"
+        },
+        "trackingIssues": {
+          "type": "array",
+          "items": {
+            "$ref": "TrackingIssue"
+          },
+          "description": "Associated tracking issues."
+        }
+      },
+      "id": "ErrorGroup"
     },
     "ServiceContext": {
       "description": "Describes a running service that sends errors.\nIts version changes over time and multiple versions can run in parallel.",
       "type": "object",
       "properties": {
         "resourceType": {
-          "description": "Type of the MonitoredResource. List of possible values:\nhttps://cloud.google.com/monitoring/api/resources\n\nValue is set automatically for incoming errors and must not be set when\nreporting errors.",
+          "type": "string",
+          "description": "Type of the MonitoredResource. List of possible values:\nhttps://cloud.google.com/monitoring/api/resources\n\nValue is set automatically for incoming errors and must not be set when\nreporting errors."
+        },
+        "version": {
+          "description": "Represents the source code version that the developer provided,\nwhich could represent a version label or a Git SHA-1 hash, for example.",
           "type": "string"
         },
         "service": {
           "description": "An identifier of the service, such as the name of the\nexecutable, job, or Google App Engine service name. This field is expected\nto have a low number of values that are relatively stable over time, as\nopposed to `version`, which can be changed whenever new code is deployed.\n\nContains the service name for error reports extracted from Google\nApp Engine logs or `default` if the App Engine default service is used.",
           "type": "string"
-        },
-        "version": {
-          "description": "Represents the source code version that the developer provided,\nwhich could represent a version label or a Git SHA-1 hash, for example.",
-          "type": "string"
         }
       },
       "id": "ServiceContext"
     },
-    "ErrorGroup": {
-      "description": "Description of a group of similar error events.",
+    "SourceLocation": {
       "type": "object",
       "properties": {
-        "groupId": {
-          "description": "Group IDs are unique for a given project. If the same kind of error\noccurs in different service contexts, it will receive the same group ID.",
+        "functionName": {
+          "description": "Human-readable name of a function or method.\nThe value can include optional context like the class or package name.\nFor example, `my.package.MyClass.method` in case of Java.",
           "type": "string"
         },
-        "name": {
-          "description": "The group resource name.\nExample: \u003ccode\u003eprojects/my-project-123/groups/my-groupid\u003c/code\u003e",
+        "filePath": {
+          "description": "The source code filename, which can include a truncated relative\npath, or a full path from a production machine.",
           "type": "string"
         },
-        "trackingIssues": {
-          "description": "Associated tracking issues.",
-          "type": "array",
-          "items": {
-            "$ref": "TrackingIssue"
-          }
+        "lineNumber": {
+          "type": "integer",
+          "description": "1-based. 0 indicates that the line number is unknown.",
+          "format": "int32"
         }
       },
-      "id": "ErrorGroup"
+      "id": "SourceLocation",
+      "description": "Indicates a location in the source code of the service for which\nerrors are reported.\nThis data should be provided by the application when reporting an error,\nunless the error report has been generated automatically from Google App\nEngine logs. All fields are optional."
     },
     "ReportErrorEventResponse": {
-      "description": "Response for reporting an individual error event.\nData may be added to this message in the future.",
       "type": "object",
       "properties": {},
-      "id": "ReportErrorEventResponse"
-    },
-    "TrackingIssue": {
-      "description": "Information related to tracking the progress on resolving the error.",
-      "type": "object",
-      "properties": {
-        "url": {
-          "description": "A URL pointing to a related entry in an issue tracking system.\nExample: https://github.com/user/project/issues/4",
-          "type": "string"
-        }
-      },
-      "id": "TrackingIssue"
-    },
-    "DeleteEventsResponse": {
-      "description": "Response message for deleting error events.",
-      "type": "object",
-      "properties": {},
-      "id": "DeleteEventsResponse"
-    },
-    "ErrorEvent": {
-      "description": "An error event which is returned by the Error Reporting system.",
-      "type": "object",
-      "properties": {
-        "serviceContext": {
-          "description": "The `ServiceContext` for which this error was reported.",
-          "$ref": "ServiceContext"
-        },
-        "context": {
-          "description": "Data about the context in which the error occurred.",
-          "$ref": "ErrorContext"
-        },
-        "eventTime": {
-          "description": "Time when the event occurred as provided in the error report.\nIf the report did not contain a timestamp, the time the error was received\nby the Error Reporting system is used.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "message": {
-          "description": "The stack trace that was reported or logged by the service.",
-          "type": "string"
-        }
-      },
-      "id": "ErrorEvent"
-    },
-    "ListEventsResponse": {
-      "description": "Contains a set of requested error events.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "If non-empty, more results are available.\nPass this token, along with the same query parameters as the first\nrequest, to view the next page of results.",
-          "type": "string"
-        },
-        "timeRangeBegin": {
-          "description": "The timestamp specifies the start time to which the request was restricted.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "errorEvents": {
-          "description": "The error events which match the given request.",
-          "type": "array",
-          "items": {
-            "$ref": "ErrorEvent"
-          }
-        }
-      },
-      "id": "ListEventsResponse"
-    },
-    "TimedCount": {
-      "description": "The number of errors in a given time period.\nAll numbers are approximate since the error events are sampled\nbefore counting them.",
-      "type": "object",
-      "properties": {
-        "startTime": {
-          "description": "Start of the time period to which `count` refers (included).",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "endTime": {
-          "description": "End of the time period to which `count` refers (excluded).",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "count": {
-          "description": "Approximate number of occurrences in the given time period.",
-          "type": "string",
-          "format": "int64"
-        }
-      },
-      "id": "TimedCount"
+      "id": "ReportErrorEventResponse",
+      "description": "Response for reporting an individual error event.\nData may be added to this message in the future."
     },
     "HttpRequestContext": {
-      "description": "HTTP request data that is related to a reported error.\nThis data should be provided by the application when reporting an error,\nunless the\nerror report has been generated automatically from Google App Engine logs.",
       "type": "object",
       "properties": {
-        "method": {
-          "description": "The type of HTTP request, such as `GET`, `POST`, etc.",
-          "type": "string"
-        },
-        "responseStatusCode": {
-          "description": "The HTTP response status code for the request.",
-          "type": "integer",
-          "format": "int32"
-        },
         "remoteIp": {
           "description": "The IP address from which the request originated.\nThis can be IPv4, IPv6, or a token which is derived from the\nIP address, depending on the data that has been provided\nin the error report.",
           "type": "string"
         },
-        "url": {
-          "description": "The URL of the request.",
-          "type": "string"
-        },
         "referrer": {
           "description": "The referrer information that is provided with the request.",
           "type": "string"
@@ -590,9 +664,23 @@
         "userAgent": {
           "description": "The user agent information that is provided with the request.",
           "type": "string"
+        },
+        "url": {
+          "type": "string",
+          "description": "The URL of the request."
+        },
+        "responseStatusCode": {
+          "description": "The HTTP response status code for the request.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "method": {
+          "type": "string",
+          "description": "The type of HTTP request, such as `GET`, `POST`, etc."
         }
       },
-      "id": "HttpRequestContext"
+      "id": "HttpRequestContext",
+      "description": "HTTP request data that is related to a reported error.\nThis data should be provided by the application when reporting an error,\nunless the\nerror report has been generated automatically from Google App Engine logs."
     },
     "ListGroupStatsResponse": {
       "description": "Contains a set of requested error group stats.",
@@ -603,126 +691,38 @@
           "type": "string"
         },
         "timeRangeBegin": {
-          "description": "The timestamp specifies the start time to which the request was restricted.\nThe start time is set based on the requested time range. It may be adjusted\nto a later time if a project has exceeded the storage quota and older data\nhas been deleted.",
           "type": "string",
+          "description": "The timestamp specifies the start time to which the request was restricted.\nThe start time is set based on the requested time range. It may be adjusted\nto a later time if a project has exceeded the storage quota and older data\nhas been deleted.",
           "format": "google-datetime"
         },
         "errorGroupStats": {
-          "description": "The error group stats which match the given request.",
           "type": "array",
           "items": {
             "$ref": "ErrorGroupStats"
-          }
+          },
+          "description": "The error group stats which match the given request."
         }
       },
       "id": "ListGroupStatsResponse"
     }
   },
-  "revision": "20161122",
-  "basePath": "",
   "icons": {
     "x32": "http://www.google.com/images/icons/product/search-32.gif",
     "x16": "http://www.google.com/images/icons/product/search-16.gif"
   },
-  "version_module": "True",
+  "protocol": "rest",
   "canonicalName": "Clouderrorreporting",
-  "discoveryVersion": "v1",
-  "baseUrl": "https://clouderrorreporting.googleapis.com/",
-  "name": "clouderrorreporting",
-  "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
     }
   },
-  "documentationLink": "https://cloud.google.com/error-reporting/",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
-  "servicePath": "",
-  "ownerName": "Google",
-  "version": "v1beta1",
   "rootUrl": "https://clouderrorreporting.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "ownerDomain": "google.com",
+  "name": "clouderrorreporting",
+  "batchPath": "batch"
 }
diff --git a/clouderrorreporting/v1beta1/clouderrorreporting-gen.go b/clouderrorreporting/v1beta1/clouderrorreporting-gen.go
index cb09592..0e62c15 100644
--- a/clouderrorreporting/v1beta1/clouderrorreporting-gen.go
+++ b/clouderrorreporting/v1beta1/clouderrorreporting-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Events = NewProjectsEventsService(s)
@@ -535,13 +540,40 @@
 	// Error Reporting system will be used.
 	EventTime string `json:"eventTime,omitempty"`
 
-	// Message: [Required] A message describing the error. The message can
-	// contain an
-	// exception stack in one of the supported programming languages and
-	// formats.
-	// In that case, the message is parsed and detailed exception
-	// information
-	// is returned when retrieving the error event again.
+	// Message: [Required] The error message.
+	// If no `context.reportLocation` is provided, the message must contain
+	// a
+	// header (typically consisting of the exception type name and an
+	// error
+	// message) and an exception stack trace in one of the supported
+	// programming
+	// languages and formats.
+	// Supported languages are Java, Python, JavaScript, Ruby, C#, PHP, and
+	// Go.
+	// Supported stack trace formats are:
+	//
+	// * **Java**: Must be the return value of
+	// [`Throwable.printStackTrace()`](https://docs.oracle.com/javase/7/docs/
+	// api/java/lang/Throwable.html#printStackTrace%28%29).
+	// * **Python**: Must be the return value of
+	// [`traceback.format_exc()`](https://docs.python.org/2/library/traceback
+	// .html#traceback.format_exc).
+	// * **JavaScript**: Must be the value of
+	// [`error.stack`](https://github.com/v8/v8/wiki/Stack-Trace-API)
+	// as returned by V8.
+	// * **Ruby**: Must contain frames returned by
+	// [`Exception.backtrace`](https://ruby-doc.org/core-2.2.0/Exception.html
+	// #method-i-backtrace).
+	// * **C#**: Must be the return value of
+	// [`Exception.ToString()`](https://msdn.microsoft.com/en-us/library/syst
+	// em.exception.tostring.aspx).
+	// * **PHP**: Must start with `PHP (Notice|Parse error|Fatal
+	// error|Warning)`
+	// and contain the result of
+	// [`(string)$exception`](http://php.net/manual/en/exception.tostring.php
+	// ).
+	// * **Go**: Must be the return value of
+	// [`runtime.Stack()`](https://golang.org/pkg/runtime/debug/#Stack).
 	Message string `json:"message,omitempty"`
 
 	// ServiceContext: [Required] The service context in which this error
@@ -789,6 +821,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+projectName}/events")
@@ -991,6 +1024,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1197,6 +1231,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.reportederrorevent)
 	if err != nil {
@@ -1456,6 +1491,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1695,6 +1731,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1826,6 +1863,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.errorgroup)
 	if err != nil {
diff --git a/cloudkms/v1beta1/cloudkms-api.json b/cloudkms/v1beta1/cloudkms-api.json
index a37d827..f6bb014 100644
--- a/cloudkms/v1beta1/cloudkms-api.json
+++ b/cloudkms/v1beta1/cloudkms-api.json
@@ -1,523 +1,865 @@
 {
+  "canonicalName": "Cloud KMS",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
+    }
+  },
+  "rootUrl": "https://cloudkms.googleapis.com/",
+  "ownerDomain": "google.com",
+  "name": "cloudkms",
+  "batchPath": "batch",
+  "title": "Google Cloud Key Management Service (KMS) API",
+  "ownerName": "Google",
+  "resources": {
+    "projects": {
+      "resources": {
+        "locations": {
+          "resources": {
+            "keyRings": {
+              "resources": {
+                "cryptoKeys": {
+                  "methods": {
+                    "testIamPermissions": {
+                      "httpMethod": "POST",
+                      "parameterOrder": [
+                        "resource"
+                      ],
+                      "response": {
+                        "$ref": "TestIamPermissionsResponse"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ],
+                      "parameters": {
+                        "resource": {
+                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
+                          "location": "path",
+                          "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:testIamPermissions",
+                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.testIamPermissions",
+                      "path": "v1beta1/{+resource}:testIamPermissions",
+                      "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
+                      "request": {
+                        "$ref": "TestIamPermissionsRequest"
+                      }
+                    },
+                    "decrypt": {
+                      "httpMethod": "POST",
+                      "parameterOrder": [
+                        "name"
+                      ],
+                      "response": {
+                        "$ref": "DecryptResponse"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ],
+                      "parameters": {
+                        "name": {
+                          "description": "Required. The resource name of the CryptoKey to use for decryption.\nThe server will choose the appropriate version.",
+                          "required": true,
+                          "type": "string",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
+                          "location": "path"
+                        }
+                      },
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:decrypt",
+                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.decrypt",
+                      "path": "v1beta1/{+name}:decrypt",
+                      "description": "Decrypt data that was protected by Encrypt.",
+                      "request": {
+                        "$ref": "DecryptRequest"
+                      }
+                    },
+                    "list": {
+                      "response": {
+                        "$ref": "ListCryptoKeysResponse"
+                      },
+                      "parameterOrder": [
+                        "parent"
+                      ],
+                      "httpMethod": "GET",
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ],
+                      "parameters": {
+                        "parent": {
+                          "description": "Required. The resource name of the KeyRing to list, in the format\n`projects/*/locations/*/keyRings/*`.",
+                          "required": true,
+                          "type": "string",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$",
+                          "location": "path"
+                        },
+                        "pageToken": {
+                          "description": "Optional pagination token, returned earlier via\nListCryptoKeysResponse.next_page_token.",
+                          "type": "string",
+                          "location": "query"
+                        },
+                        "pageSize": {
+                          "location": "query",
+                          "description": "Optional limit on the number of CryptoKeys to include in the\nresponse.  Further CryptoKeys can subsequently be obtained by\nincluding the ListCryptoKeysResponse.next_page_token in a subsequent\nrequest.  If unspecified, the server will pick an appropriate default.",
+                          "format": "int32",
+                          "type": "integer"
+                        }
+                      },
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys",
+                      "path": "v1beta1/{+parent}/cryptoKeys",
+                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.list",
+                      "description": "Lists CryptoKeys."
+                    },
+                    "encrypt": {
+                      "request": {
+                        "$ref": "EncryptRequest"
+                      },
+                      "description": "Encrypt data, so that it can only be recovered by a call to Decrypt.",
+                      "httpMethod": "POST",
+                      "parameterOrder": [
+                        "name"
+                      ],
+                      "response": {
+                        "$ref": "EncryptResponse"
+                      },
+                      "parameters": {
+                        "name": {
+                          "description": "Required. The resource name of the CryptoKey or CryptoKeyVersion\nto use for encryption.\n\nIf a CryptoKey is specified, the server will use its\nprimary version.",
+                          "required": true,
+                          "type": "string",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/.+$",
+                          "location": "path"
+                        }
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ],
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:encrypt",
+                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.encrypt",
+                      "path": "v1beta1/{+name}:encrypt"
+                    },
+                    "create": {
+                      "response": {
+                        "$ref": "CryptoKey"
+                      },
+                      "parameterOrder": [
+                        "parent"
+                      ],
+                      "httpMethod": "POST",
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ],
+                      "parameters": {
+                        "cryptoKeyId": {
+                          "description": "Required. It must be unique within a KeyRing and match the regular\nexpression `[a-zA-Z0-9_-]{1,63}`",
+                          "type": "string",
+                          "location": "query"
+                        },
+                        "parent": {
+                          "description": "Required. The name of the KeyRing associated with the\nCryptoKeys.",
+                          "required": true,
+                          "type": "string",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$",
+                          "location": "path"
+                        }
+                      },
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys",
+                      "path": "v1beta1/{+parent}/cryptoKeys",
+                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.create",
+                      "description": "Create a new CryptoKey within a KeyRing.\n\nCryptoKey.purpose is required.",
+                      "request": {
+                        "$ref": "CryptoKey"
+                      }
+                    },
+                    "setIamPolicy": {
+                      "response": {
+                        "$ref": "Policy"
+                      },
+                      "parameterOrder": [
+                        "resource"
+                      ],
+                      "httpMethod": "POST",
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ],
+                      "parameters": {
+                        "resource": {
+                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
+                          "location": "path",
+                          "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:setIamPolicy",
+                      "path": "v1beta1/{+resource}:setIamPolicy",
+                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.setIamPolicy",
+                      "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
+                      "request": {
+                        "$ref": "SetIamPolicyRequest"
+                      }
+                    },
+                    "updatePrimaryVersion": {
+                      "httpMethod": "POST",
+                      "parameterOrder": [
+                        "name"
+                      ],
+                      "response": {
+                        "$ref": "CryptoKey"
+                      },
+                      "parameters": {
+                        "name": {
+                          "description": "The resource name of the CryptoKey to update.",
+                          "required": true,
+                          "type": "string",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
+                          "location": "path"
+                        }
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ],
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:updatePrimaryVersion",
+                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.updatePrimaryVersion",
+                      "path": "v1beta1/{+name}:updatePrimaryVersion",
+                      "request": {
+                        "$ref": "UpdateCryptoKeyPrimaryVersionRequest"
+                      },
+                      "description": "Update the version of a CryptoKey that will be used in Encrypt"
+                    },
+                    "getIamPolicy": {
+                      "httpMethod": "GET",
+                      "response": {
+                        "$ref": "Policy"
+                      },
+                      "parameterOrder": [
+                        "resource"
+                      ],
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ],
+                      "parameters": {
+                        "resource": {
+                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
+                          "location": "path",
+                          "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:getIamPolicy",
+                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.getIamPolicy",
+                      "path": "v1beta1/{+resource}:getIamPolicy",
+                      "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset."
+                    },
+                    "get": {
+                      "description": "Returns metadata for a given CryptoKey, as well as its\nprimary CryptoKeyVersion.",
+                      "response": {
+                        "$ref": "CryptoKey"
+                      },
+                      "parameterOrder": [
+                        "name"
+                      ],
+                      "httpMethod": "GET",
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ],
+                      "parameters": {
+                        "name": {
+                          "description": "The name of the CryptoKey to get.",
+                          "required": true,
+                          "type": "string",
+                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
+                          "location": "path"
+                        }
+                      },
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}",
+                      "path": "v1beta1/{+name}",
+                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.get"
+                    },
+                    "patch": {
+                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.patch",
+                      "path": "v1beta1/{+name}",
+                      "request": {
+                        "$ref": "CryptoKey"
+                      },
+                      "description": "Update a CryptoKey.",
+                      "httpMethod": "PATCH",
+                      "parameterOrder": [
+                        "name"
+                      ],
+                      "response": {
+                        "$ref": "CryptoKey"
+                      },
+                      "parameters": {
+                        "updateMask": {
+                          "description": "Required list of fields to be updated in this request.",
+                          "format": "google-fieldmask",
+                          "type": "string",
+                          "location": "query"
+                        },
+                        "name": {
+                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
+                          "location": "path",
+                          "description": "Output only. The resource name for this CryptoKey in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*`.",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform"
+                      ],
+                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}"
+                    }
+                  },
+                  "resources": {
+                    "cryptoKeyVersions": {
+                      "methods": {
+                        "list": {
+                          "parameterOrder": [
+                            "parent"
+                          ],
+                          "httpMethod": "GET",
+                          "response": {
+                            "$ref": "ListCryptoKeyVersionsResponse"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ],
+                          "parameters": {
+                            "pageToken": {
+                              "location": "query",
+                              "description": "Optional pagination token, returned earlier via\nListCryptoKeyVersionsResponse.next_page_token.",
+                              "type": "string"
+                            },
+                            "pageSize": {
+                              "location": "query",
+                              "description": "Optional limit on the number of CryptoKeyVersions to\ninclude in the response. Further CryptoKeyVersions can\nsubsequently be obtained by including the\nListCryptoKeyVersionsResponse.next_page_token in a subsequent request.\nIf unspecified, the server will pick an appropriate default.",
+                              "format": "int32",
+                              "type": "integer"
+                            },
+                            "parent": {
+                              "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
+                              "location": "path",
+                              "description": "Required. The resource name of the CryptoKey to list, in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*`.",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions",
+                          "path": "v1beta1/{+parent}/cryptoKeyVersions",
+                          "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.list",
+                          "description": "Lists CryptoKeyVersions."
+                        },
+                        "destroy": {
+                          "request": {
+                            "$ref": "DestroyCryptoKeyVersionRequest"
+                          },
+                          "description": "Schedule a CryptoKeyVersion for destruction.\n\nUpon calling this method, CryptoKeyVersion.state will be set to\nDESTROY_SCHEDULED\nand destroy_time will be set to a time 24\nhours in the future, at which point the state\nwill be changed to\nDESTROYED, and the key\nmaterial will be irrevocably destroyed.\n\nBefore the destroy_time is reached,\nRestoreCryptoKeyVersion may be called to reverse the process.",
+                          "response": {
+                            "$ref": "CryptoKeyVersion"
+                          },
+                          "parameterOrder": [
+                            "name"
+                          ],
+                          "httpMethod": "POST",
+                          "parameters": {
+                            "name": {
+                              "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$",
+                              "location": "path",
+                              "description": "The resource name of the CryptoKeyVersion to destroy.",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ],
+                          "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:destroy",
+                          "path": "v1beta1/{+name}:destroy",
+                          "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.destroy"
+                        },
+                        "create": {
+                          "response": {
+                            "$ref": "CryptoKeyVersion"
+                          },
+                          "parameterOrder": [
+                            "parent"
+                          ],
+                          "httpMethod": "POST",
+                          "parameters": {
+                            "parent": {
+                              "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
+                              "location": "path",
+                              "description": "Required. The name of the CryptoKey associated with\nthe CryptoKeyVersions.",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ],
+                          "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions",
+                          "path": "v1beta1/{+parent}/cryptoKeyVersions",
+                          "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.create",
+                          "request": {
+                            "$ref": "CryptoKeyVersion"
+                          },
+                          "description": "Create a new CryptoKeyVersion in a CryptoKey.\n\nThe server will assign the next sequential id. If unset,\nstate will be set to\nENABLED."
+                        },
+                        "restore": {
+                          "path": "v1beta1/{+name}:restore",
+                          "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.restore",
+                          "description": "Restore a CryptoKeyVersion in the\nDESTROY_SCHEDULED,\nstate.\n\nUpon restoration of the CryptoKeyVersion, state\nwill be set to DISABLED,\nand destroy_time will be cleared.",
+                          "request": {
+                            "$ref": "RestoreCryptoKeyVersionRequest"
+                          },
+                          "response": {
+                            "$ref": "CryptoKeyVersion"
+                          },
+                          "parameterOrder": [
+                            "name"
+                          ],
+                          "httpMethod": "POST",
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ],
+                          "parameters": {
+                            "name": {
+                              "description": "The resource name of the CryptoKeyVersion to restore.",
+                              "required": true,
+                              "type": "string",
+                              "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$",
+                              "location": "path"
+                            }
+                          },
+                          "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:restore"
+                        },
+                        "patch": {
+                          "httpMethod": "PATCH",
+                          "parameterOrder": [
+                            "name"
+                          ],
+                          "response": {
+                            "$ref": "CryptoKeyVersion"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ],
+                          "parameters": {
+                            "name": {
+                              "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$",
+                              "location": "path",
+                              "description": "Output only. The resource name for this CryptoKeyVersion in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*/cryptoKeyVersions/*`.",
+                              "required": true,
+                              "type": "string"
+                            },
+                            "updateMask": {
+                              "location": "query",
+                              "description": "Required list of fields to be updated in this request.",
+                              "format": "google-fieldmask",
+                              "type": "string"
+                            }
+                          },
+                          "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}",
+                          "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.patch",
+                          "path": "v1beta1/{+name}",
+                          "description": "Update a CryptoKeyVersion's metadata.\n\nstate may be changed between\nENABLED and\nDISABLED using this\nmethod. See DestroyCryptoKeyVersion and RestoreCryptoKeyVersion to\nmove between other states.",
+                          "request": {
+                            "$ref": "CryptoKeyVersion"
+                          }
+                        },
+                        "get": {
+                          "parameterOrder": [
+                            "name"
+                          ],
+                          "httpMethod": "GET",
+                          "response": {
+                            "$ref": "CryptoKeyVersion"
+                          },
+                          "scopes": [
+                            "https://www.googleapis.com/auth/cloud-platform"
+                          ],
+                          "parameters": {
+                            "name": {
+                              "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$",
+                              "location": "path",
+                              "description": "The name of the CryptoKeyVersion to get.",
+                              "required": true,
+                              "type": "string"
+                            }
+                          },
+                          "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}",
+                          "path": "v1beta1/{+name}",
+                          "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.get",
+                          "description": "Returns metadata for a given CryptoKeyVersion."
+                        }
+                      }
+                    }
+                  }
+                }
+              },
+              "methods": {
+                "getIamPolicy": {
+                  "response": {
+                    "$ref": "Policy"
+                  },
+                  "parameterOrder": [
+                    "resource"
+                  ],
+                  "httpMethod": "GET",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "resource": {
+                      "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$",
+                      "location": "path"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:getIamPolicy",
+                  "path": "v1beta1/{+resource}:getIamPolicy",
+                  "id": "cloudkms.projects.locations.keyRings.getIamPolicy",
+                  "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset."
+                },
+                "get": {
+                  "description": "Returns metadata for a given KeyRing.",
+                  "response": {
+                    "$ref": "KeyRing"
+                  },
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "httpMethod": "GET",
+                  "parameters": {
+                    "name": {
+                      "description": "The name of the KeyRing to get.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$",
+                      "location": "path"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}",
+                  "path": "v1beta1/{+name}",
+                  "id": "cloudkms.projects.locations.keyRings.get"
+                },
+                "testIamPermissions": {
+                  "response": {
+                    "$ref": "TestIamPermissionsResponse"
+                  },
+                  "parameterOrder": [
+                    "resource"
+                  ],
+                  "httpMethod": "POST",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "resource": {
+                      "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$",
+                      "location": "path",
+                      "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:testIamPermissions",
+                  "path": "v1beta1/{+resource}:testIamPermissions",
+                  "id": "cloudkms.projects.locations.keyRings.testIamPermissions",
+                  "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
+                  "request": {
+                    "$ref": "TestIamPermissionsRequest"
+                  }
+                },
+                "list": {
+                  "id": "cloudkms.projects.locations.keyRings.list",
+                  "path": "v1beta1/{+parent}/keyRings",
+                  "description": "Lists KeyRings.",
+                  "httpMethod": "GET",
+                  "response": {
+                    "$ref": "ListKeyRingsResponse"
+                  },
+                  "parameterOrder": [
+                    "parent"
+                  ],
+                  "parameters": {
+                    "pageToken": {
+                      "description": "Optional pagination token, returned earlier via\nListKeyRingsResponse.next_page_token.",
+                      "type": "string",
+                      "location": "query"
+                    },
+                    "pageSize": {
+                      "description": "Optional limit on the number of KeyRings to include in the\nresponse.  Further KeyRings can subsequently be obtained by\nincluding the ListKeyRingsResponse.next_page_token in a subsequent\nrequest.  If unspecified, the server will pick an appropriate default.",
+                      "format": "int32",
+                      "type": "integer",
+                      "location": "query"
+                    },
+                    "parent": {
+                      "description": "Required. The resource name of the location associated with the\nKeyRings, in the format `projects/*/locations/*`.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/locations/[^/]+$",
+                      "location": "path"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings"
+                },
+                "setIamPolicy": {
+                  "httpMethod": "POST",
+                  "parameterOrder": [
+                    "resource"
+                  ],
+                  "response": {
+                    "$ref": "Policy"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "resource": {
+                      "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$",
+                      "location": "path"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:setIamPolicy",
+                  "id": "cloudkms.projects.locations.keyRings.setIamPolicy",
+                  "path": "v1beta1/{+resource}:setIamPolicy",
+                  "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
+                  "request": {
+                    "$ref": "SetIamPolicyRequest"
+                  }
+                },
+                "create": {
+                  "httpMethod": "POST",
+                  "parameterOrder": [
+                    "parent"
+                  ],
+                  "response": {
+                    "$ref": "KeyRing"
+                  },
+                  "parameters": {
+                    "parent": {
+                      "description": "Required. The resource name of the location associated with the\nKeyRings, in the format `projects/*/locations/*`.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/locations/[^/]+$",
+                      "location": "path"
+                    },
+                    "keyRingId": {
+                      "description": "Required. It must be unique within a location and match the regular\nexpression `[a-zA-Z0-9_-]{1,63}`",
+                      "type": "string",
+                      "location": "query"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings",
+                  "id": "cloudkms.projects.locations.keyRings.create",
+                  "path": "v1beta1/{+parent}/keyRings",
+                  "request": {
+                    "$ref": "KeyRing"
+                  },
+                  "description": "Create a new KeyRing in a given Project and Location."
+                }
+              }
+            }
+          },
+          "methods": {
+            "list": {
+              "description": "Lists information about the supported locations for this service.",
+              "response": {
+                "$ref": "ListLocationsResponse"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "The resource that owns the locations collection, if applicable.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path"
+                },
+                "pageToken": {
+                  "description": "The standard list page token.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "The standard list page size.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "filter": {
+                  "description": "The standard list filter.",
+                  "type": "string",
+                  "location": "query"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectsId}/locations",
+              "path": "v1beta1/{+name}/locations",
+              "id": "cloudkms.projects.locations.list"
+            },
+            "get": {
+              "description": "Get information about a location.",
+              "httpMethod": "GET",
+              "response": {
+                "$ref": "Location"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "parameters": {
+                "name": {
+                  "pattern": "^projects/[^/]+/locations/[^/]+$",
+                  "location": "path",
+                  "description": "Resource name for the location.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}",
+              "id": "cloudkms.projects.locations.get",
+              "path": "v1beta1/{+name}"
+            }
+          }
+        }
+      }
+    }
+  },
+  "parameters": {
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string",
+      "location": "query"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "alt": {
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
+    },
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    }
+  },
+  "version": "v1beta1",
+  "baseUrl": "https://cloudkms.googleapis.com/",
+  "description": "Manages encryption for your cloud services the same way you do on-premise. You can generate, use, rotate, and destroy AES256 encryption keys.",
+  "kind": "discovery#restDescription",
+  "servicePath": "",
+  "basePath": "",
+  "revision": "20170201",
+  "documentationLink": "https://cloud.google.com/kms/",
+  "id": "cloudkms:v1beta1",
   "discoveryVersion": "v1",
   "version_module": "True",
   "schemas": {
-    "DecryptRequest": {
-      "description": "Request message for KeyManagementService.Decrypt.",
-      "type": "object",
-      "properties": {
-        "ciphertext": {
-          "description": "Required. The encrypted data originally returned in\nEncryptResponse.ciphertext.",
-          "format": "byte",
-          "type": "string"
-        },
-        "additionalAuthenticatedData": {
-          "description": "Optional data that must match the data originally supplied in\nEncryptRequest.additional_authenticated_data.",
-          "format": "byte",
-          "type": "string"
-        }
-      },
-      "id": "DecryptRequest"
-    },
-    "Location": {
-      "properties": {
-        "labels": {
-          "additionalProperties": {
-            "type": "string"
-          },
-          "description": "Cross-service attributes for the location. For example\n\n    {\"cloud.googleapis.com/region\": \"us-east1\"}",
-          "type": "object"
-        },
-        "name": {
-          "description": "Resource name for the location, which may vary between implementations.\nFor example: `\"projects/example-project/locations/us-east1\"`",
-          "type": "string"
-        },
-        "locationId": {
-          "description": "The canonical id for this location. For example: `\"us-east1\"`.",
-          "type": "string"
-        },
-        "metadata": {
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "description": "Service-specific metadata. For example the available capacity at the given\nlocation.",
-          "type": "object"
-        }
-      },
-      "id": "Location",
-      "description": "A resource that represents Google Cloud Platform location.",
-      "type": "object"
-    },
-    "ListCryptoKeysResponse": {
-      "properties": {
-        "nextPageToken": {
-          "description": "A token to retrieve next page of results. Pass this value in\nListCryptoKeysRequest.page_token to retrieve the next page of results.",
-          "type": "string"
-        },
-        "cryptoKeys": {
-          "description": "The list of CryptoKeys.",
-          "type": "array",
-          "items": {
-            "$ref": "CryptoKey"
-          }
-        },
-        "totalSize": {
-          "description": "The total number of CryptoKeys that matched the query.",
-          "format": "int32",
-          "type": "integer"
-        }
-      },
-      "id": "ListCryptoKeysResponse",
-      "description": "Response message for KeyManagementService.ListCryptoKeys.",
-      "type": "object"
-    },
-    "Condition": {
-      "properties": {
-        "iam": {
-          "enumDescriptions": [
-            "Default non-attribute.",
-            "Either principal or (if present) authority selector.",
-            "The principal (even if an authority selector is present), which\nmust only be used for attribution, not authorization."
-          ],
-          "enum": [
-            "NO_ATTR",
-            "AUTHORITY",
-            "ATTRIBUTION"
-          ],
-          "description": "Trusted attributes supplied by the IAM system.",
-          "type": "string"
-        },
-        "values": {
-          "description": "The objects of the condition. This is mutually exclusive with 'value'.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "op": {
-          "enum": [
-            "NO_OP",
-            "EQUALS",
-            "NOT_EQUALS",
-            "IN",
-            "NOT_IN",
-            "DISCHARGED"
-          ],
-          "description": "An operator to apply the subject with.",
-          "type": "string",
-          "enumDescriptions": [
-            "Default no-op.",
-            "DEPRECATED. Use IN instead.",
-            "DEPRECATED. Use NOT_IN instead.",
-            "Set-inclusion check.",
-            "Set-exclusion check.",
-            "Subject is discharged"
-          ]
-        },
-        "svc": {
-          "description": "Trusted attributes discharged by the service.",
-          "type": "string"
-        },
-        "value": {
-          "description": "DEPRECATED. Use 'values' instead.",
-          "type": "string"
-        },
-        "sys": {
-          "enum": [
-            "NO_ATTR",
-            "REGION",
-            "SERVICE",
-            "NAME",
-            "IP"
-          ],
-          "description": "Trusted attributes supplied by any service that owns resources and uses\nthe IAM system for access control.",
-          "type": "string",
-          "enumDescriptions": [
-            "Default non-attribute type",
-            "Region of the resource",
-            "Service name",
-            "Resource name",
-            "IP address of the caller"
-          ]
-        }
-      },
-      "id": "Condition",
-      "description": "A condition to be met.",
-      "type": "object"
-    },
-    "CounterOptions": {
-      "properties": {
-        "metric": {
-          "description": "The metric to update.",
-          "type": "string"
-        },
-        "field": {
-          "description": "The field value to attribute.",
-          "type": "string"
-        }
-      },
-      "id": "CounterOptions",
-      "description": "Options for counters",
-      "type": "object"
-    },
-    "AuditLogConfig": {
-      "properties": {
-        "exemptedMembers": {
-          "description": "Specifies the identities that do not cause logging for this type of\npermission.\nFollows the same format of Binding.members.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "logType": {
-          "enum": [
-            "LOG_TYPE_UNSPECIFIED",
-            "ADMIN_READ",
-            "DATA_WRITE",
-            "DATA_READ"
-          ],
-          "description": "The log type that this config enables.",
-          "type": "string",
-          "enumDescriptions": [
-            "Default case. Should never be this.",
-            "Admin reads. Example: CloudIAM getIamPolicy",
-            "Data writes. Example: CloudSQL Users create",
-            "Data reads. Example: CloudSQL Users list"
-          ]
-        }
-      },
-      "id": "AuditLogConfig",
-      "description": "Provides the configuration for logging a type of permissions.\nExample:\n\n    {\n      \"audit_log_configs\": [\n        {\n          \"log_type\": \"DATA_READ\",\n          \"exempted_members\": [\n            \"user:foo@gmail.com\"\n          ]\n        },\n        {\n          \"log_type\": \"DATA_WRITE\",\n        }\n      ]\n    }\n\nThis enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting\nfoo@gmail.com from DATA_READ logging.",
-      "type": "object"
-    },
-    "DecryptResponse": {
-      "properties": {
-        "plaintext": {
-          "description": "The decrypted data originally supplied in EncryptRequest.plaintext.",
-          "format": "byte",
-          "type": "string"
-        }
-      },
-      "id": "DecryptResponse",
-      "description": "Response message for KeyManagementService.Decrypt.",
-      "type": "object"
-    },
-    "TestIamPermissionsRequest": {
-      "properties": {
-        "permissions": {
-          "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "TestIamPermissionsRequest",
-      "description": "Request message for `TestIamPermissions` method.",
-      "type": "object"
-    },
-    "EncryptResponse": {
-      "properties": {
-        "name": {
-          "description": "The resource name of the CryptoKeyVersion used in encryption.",
-          "type": "string"
-        },
-        "ciphertext": {
-          "description": "The encrypted data.",
-          "format": "byte",
-          "type": "string"
-        }
-      },
-      "id": "EncryptResponse",
-      "description": "Response message for KeyManagementService.Encrypt.",
-      "type": "object"
-    },
-    "ListLocationsResponse": {
-      "description": "The response message for Locations.ListLocations.",
-      "type": "object",
-      "properties": {
-        "locations": {
-          "description": "A list of locations that matches the specified filter in the request.",
-          "type": "array",
-          "items": {
-            "$ref": "Location"
-          }
-        },
-        "nextPageToken": {
-          "description": "The standard List next-page token.",
-          "type": "string"
-        }
-      },
-      "id": "ListLocationsResponse"
-    },
-    "KeyRing": {
-      "description": "A KeyRing is a toplevel logical grouping of CryptoKeys.",
-      "type": "object",
-      "properties": {
-        "createTime": {
-          "description": "Output only. The time at which this KeyRing was created.",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "name": {
-          "description": "Output only. The resource name for the KeyRing in the format\n`projects/*/locations/*/keyRings/*`.",
-          "type": "string"
-        }
-      },
-      "id": "KeyRing"
-    },
-    "Policy": {
-      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
-      "type": "object",
-      "properties": {
-        "version": {
-          "description": "Version of the `Policy`. The default version is 0.",
-          "format": "int32",
-          "type": "integer"
-        },
-        "auditConfigs": {
-          "description": "Specifies cloud audit logging configuration for this policy.",
-          "type": "array",
-          "items": {
-            "$ref": "AuditConfig"
-          }
-        },
-        "bindings": {
-          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
-          "type": "array",
-          "items": {
-            "$ref": "Binding"
-          }
-        },
-        "etag": {
-          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
-          "format": "byte",
-          "type": "string"
-        },
-        "iamOwned": {
-          "type": "boolean"
-        },
-        "rules": {
-          "description": "If more than one rule is specified, the rules are applied in the following\nmanner:\n- All matching LOG rules are always applied.\n- If any DENY/DENY_WITH_LOG rule matches, permission is denied.\n  Logging will be applied if one or more matching rule requires logging.\n- Otherwise, if any ALLOW/ALLOW_WITH_LOG rule matches, permission is\n  granted.\n  Logging will be applied if one or more matching rule requires logging.\n- Otherwise, if no rule applies, permission is denied.",
-          "type": "array",
-          "items": {
-            "$ref": "Rule"
-          }
-        }
-      },
-      "id": "Policy"
-    },
-    "UpdateCryptoKeyPrimaryVersionRequest": {
-      "description": "Request message for KeyManagementService.UpdateCryptoKeyPrimaryVersion.",
-      "type": "object",
-      "properties": {
-        "cryptoKeyVersionId": {
-          "description": "The id of the child CryptoKeyVersion to use as primary.",
-          "type": "string"
-        }
-      },
-      "id": "UpdateCryptoKeyPrimaryVersionRequest"
-    },
-    "RestoreCryptoKeyVersionRequest": {
-      "description": "Request message for KeyManagementService.RestoreCryptoKeyVersion.",
-      "type": "object",
-      "properties": {},
-      "id": "RestoreCryptoKeyVersionRequest"
-    },
-    "DataAccessOptions": {
-      "properties": {},
-      "id": "DataAccessOptions",
-      "description": "Write a Data Access (Gin) log",
-      "type": "object"
-    },
-    "ListKeyRingsResponse": {
-      "description": "Response message for KeyManagementService.ListKeyRings.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "A token to retrieve next page of results. Pass this value in\nListKeyRingsRequest.page_token to retrieve the next page of results.",
-          "type": "string"
-        },
-        "totalSize": {
-          "description": "The total number of KeyRings that matched the query.",
-          "format": "int32",
-          "type": "integer"
-        },
-        "keyRings": {
-          "description": "The list of KeyRings.",
-          "type": "array",
-          "items": {
-            "$ref": "KeyRing"
-          }
-        }
-      },
-      "id": "ListKeyRingsResponse"
-    },
-    "AuditConfig": {
-      "description": "Specifies the audit configuration for a service.\nIt consists of which permission types are logged, and what identities, if\nany, are exempted from logging.\nAn AuditConifg must have one or more AuditLogConfigs.",
-      "type": "object",
-      "properties": {
-        "service": {
-          "description": "Specifies a service that will be enabled for audit logging.\nFor example, `resourcemanager`, `storage`, `compute`.\n`allServices` is a special value that covers all services.",
-          "type": "string"
-        },
-        "auditLogConfigs": {
-          "description": "The configuration for logging of each type of permission.\nNext ID: 4",
-          "type": "array",
-          "items": {
-            "$ref": "AuditLogConfig"
-          }
-        },
-        "exemptedMembers": {
-          "description": "Specifies the identities that are exempted from \"data access\" audit\nlogging for the `service` specified above.\nFollows the same format of Binding.members.\nThis field is deprecated in favor of per-permission-type exemptions.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "AuditConfig"
-    },
-    "CryptoKeyVersion": {
-      "properties": {
-        "destroyTime": {
-          "description": "Output only. The time this CryptoKeyVersion's key material is scheduled\nfor destruction. Only present if state is\nDESTROY_SCHEDULED.",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "createTime": {
-          "description": "Output only. The time at which this CryptoKeyVersion was created.",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "state": {
-          "enumDescriptions": [
-            "Not specified.",
-            "This version may be used in Encrypt and\nDecrypt requests.",
-            "This version may not be used, but the key material is still available,\nand the version can be placed back into the ENABLED state.",
-            "This version is destroyed, and the key material is no longer stored.\nA version may not leave this state once entered.",
-            "This version is scheduled for destruction, and will be destroyed soon.\nCall\nRestoreCryptoKeyVersion\nto put it back into the DISABLED state."
-          ],
-          "enum": [
-            "CRYPTO_KEY_VERSION_STATE_UNSPECIFIED",
-            "ENABLED",
-            "DISABLED",
-            "DESTROYED",
-            "DESTROY_SCHEDULED"
-          ],
-          "description": "The current state of the CryptoKeyVersion.",
-          "type": "string"
-        },
-        "name": {
-          "description": "Output only. The resource name for this CryptoKeyVersion in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*/cryptoKeyVersions/*`.",
-          "type": "string"
-        },
-        "destroyEventTime": {
-          "description": "Output only. The time this CryptoKeyVersion's key material was\ndestroyed. Only present if state is\nDESTROYED.",
-          "format": "google-datetime",
-          "type": "string"
-        }
-      },
-      "id": "CryptoKeyVersion",
-      "description": "A CryptoKeyVersion represents an individual cryptographic key, and the\nassociated key material.\n\nIt can be used for cryptographic operations either directly, or via its\nparent CryptoKey, in which case the server will choose the appropriate\nversion for the operation.",
-      "type": "object"
-    },
-    "CloudAuditOptions": {
-      "description": "Write a Cloud Audit log",
-      "type": "object",
-      "properties": {},
-      "id": "CloudAuditOptions"
-    },
-    "Binding": {
-      "description": "Associates `members` with a `role`.",
-      "type": "object",
-      "properties": {
-        "members": {
-          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "role": {
-          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
-          "type": "string"
-        }
-      },
-      "id": "Binding"
-    },
-    "EncryptRequest": {
-      "description": "Request message for KeyManagementService.Encrypt.",
-      "type": "object",
-      "properties": {
-        "additionalAuthenticatedData": {
-          "description": "Optional data that, if specified, must also be provided during decryption\nthrough DecryptRequest.additional_authenticated_data.  Must be no\nlarger than 64KiB.",
-          "format": "byte",
-          "type": "string"
-        },
-        "plaintext": {
-          "description": "Required. The data to encrypt. Must be no larger than 64KiB.",
-          "format": "byte",
-          "type": "string"
-        }
-      },
-      "id": "EncryptRequest"
-    },
-    "ListCryptoKeyVersionsResponse": {
-      "properties": {
-        "nextPageToken": {
-          "description": "A token to retrieve next page of results. Pass this value in\nListCryptoKeyVersionsRequest.page_token to retrieve the next page of\nresults.",
-          "type": "string"
-        },
-        "totalSize": {
-          "description": "The total number of CryptoKeyVersions that matched the\nquery.",
-          "format": "int32",
-          "type": "integer"
-        },
-        "cryptoKeyVersions": {
-          "description": "The list of CryptoKeyVersions.",
-          "type": "array",
-          "items": {
-            "$ref": "CryptoKeyVersion"
-          }
-        }
-      },
-      "id": "ListCryptoKeyVersionsResponse",
-      "description": "Response message for KeyManagementService.ListCryptoKeyVersions.",
-      "type": "object"
-    },
-    "TestIamPermissionsResponse": {
-      "description": "Response message for `TestIamPermissions` method.",
-      "type": "object",
-      "properties": {
-        "permissions": {
-          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "TestIamPermissionsResponse"
-    },
-    "DestroyCryptoKeyVersionRequest": {
-      "description": "Request message for KeyManagementService.DestroyCryptoKeyVersion.",
-      "type": "object",
-      "properties": {},
-      "id": "DestroyCryptoKeyVersionRequest"
-    },
     "Rule": {
       "description": "A rule to be applied in a Policy.",
       "type": "object",
       "properties": {
-        "notIn": {
-          "description": "If one or more 'not_in' clauses are specified, the rule matches\nif the PRINCIPAL/AUTHORITY_SELECTOR is in none of the entries.\nThe format for in and not_in entries is the same as for members in a\nBinding (see google/iam/v1/policy.proto).",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
         "description": {
           "description": "Human-readable description of the rule.",
           "type": "string"
@@ -569,6 +911,13 @@
           ],
           "description": "Required",
           "type": "string"
+        },
+        "notIn": {
+          "description": "If one or more 'not_in' clauses are specified, the rule matches\nif the PRINCIPAL/AUTHORITY_SELECTOR is in none of the entries.\nThe format for in and not_in entries is the same as for members in a\nBinding (see google/iam/v1/policy.proto).",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
         }
       },
       "id": "Rule"
@@ -577,6 +926,23 @@
       "description": "A CryptoKey represents a logical key that can be used for cryptographic\noperations.\n\nA CryptoKey is made up of one or more versions, which\nrepresent the actual key material used in cryptographic operations.",
       "type": "object",
       "properties": {
+        "purpose": {
+          "enum": [
+            "CRYPTO_KEY_PURPOSE_UNSPECIFIED",
+            "ENCRYPT_DECRYPT"
+          ],
+          "description": "The immutable purpose of this CryptoKey. Currently, the only acceptable\npurpose is ENCRYPT_DECRYPT.",
+          "type": "string",
+          "enumDescriptions": [
+            "Not specified.",
+            "CryptoKeys with this purpose may be used with\nEncrypt and\nDecrypt."
+          ]
+        },
+        "nextRotationTime": {
+          "description": "At next_rotation_time, the Key Management Service will automatically:\n\n1. Create a new version of this CryptoKey.\n2. Mark the new version as primary.\n\nKey rotations performed manually via\nCreateCryptoKeyVersion and\nUpdateCryptoKeyPrimaryVersion\ndo not affect next_rotation_time.",
+          "format": "google-datetime",
+          "type": "string"
+        },
         "createTime": {
           "description": "Output only. The time at which this CryptoKey was created.",
           "format": "google-datetime",
@@ -588,59 +954,42 @@
           "type": "string"
         },
         "primary": {
-          "$ref": "CryptoKeyVersion",
-          "description": "Output only. A copy of the \"primary\" CryptoKeyVersion that will be used\nby Encrypt when this CryptoKey is given\nin EncryptRequest.name.\n\nThe CryptoKey's primary version can be updated via\nUpdateCryptoKeyPrimaryVersion."
+          "description": "Output only. A copy of the \"primary\" CryptoKeyVersion that will be used\nby Encrypt when this CryptoKey is given\nin EncryptRequest.name.\n\nThe CryptoKey's primary version can be updated via\nUpdateCryptoKeyPrimaryVersion.",
+          "$ref": "CryptoKeyVersion"
         },
         "name": {
           "description": "Output only. The resource name for this CryptoKey in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*`.",
           "type": "string"
-        },
-        "purpose": {
-          "enumDescriptions": [
-            "Not specified.",
-            "CryptoKeys with this purpose may be used with\nEncrypt and\nDecrypt."
-          ],
-          "enum": [
-            "CRYPTO_KEY_PURPOSE_UNSPECIFIED",
-            "ENCRYPT_DECRYPT"
-          ],
-          "description": "The immutable purpose of this CryptoKey. Currently, the only acceptable\npurpose is ENCRYPT_DECRYPT.",
-          "type": "string"
-        },
-        "nextRotationTime": {
-          "description": "At next_rotation_time, the Key Management Service will automatically:\n\n1. Create a new version of this CryptoKey.\n2. Mark the new version as primary.\n\nKey rotations performed manually via\nCreateCryptoKeyVersion and\nUpdateCryptoKeyPrimaryVersion\ndo not affect next_rotation_time.",
-          "format": "google-datetime",
-          "type": "string"
         }
       },
       "id": "CryptoKey"
     },
     "LogConfig": {
+      "description": "Specifies what kind of log the caller must write\nIncrement a streamz counter with the specified metric and field names.\n\nMetric names should start with a '/', generally be lowercase-only,\nand end in \"_count\". Field names should not contain an initial slash.\nThe actual exported metric names will have \"/iam/policy\" prepended.\n\nField names correspond to IAM request parameters and field values are\ntheir respective values.\n\nAt present the only supported field names are\n   - \"iam_principal\", corresponding to IAMContext.principal;\n   - \"\" (empty string), resulting in one aggretated counter with no field.\n\nExamples:\n  counter { metric: \"/debug_access_count\"  field: \"iam_principal\" }\n  ==\u003e increment counter /iam/policy/backend_debug_access_count\n                        {iam_principal=[value of IAMContext.principal]}\n\nAt this time we do not support:\n* multiple field names (though this may be supported in the future)\n* decrementing the counter\n* incrementing it by anything other than 1",
+      "type": "object",
       "properties": {
+        "cloudAudit": {
+          "$ref": "CloudAuditOptions",
+          "description": "Cloud audit options."
+        },
         "counter": {
-          "description": "Counter options.",
-          "$ref": "CounterOptions"
+          "$ref": "CounterOptions",
+          "description": "Counter options."
         },
         "dataAccess": {
-          "$ref": "DataAccessOptions",
-          "description": "Data access options."
-        },
-        "cloudAudit": {
-          "description": "Cloud audit options.",
-          "$ref": "CloudAuditOptions"
+          "description": "Data access options.",
+          "$ref": "DataAccessOptions"
         }
       },
-      "id": "LogConfig",
-      "description": "Specifies what kind of log the caller must write\nIncrement a streamz counter with the specified metric and field names.\n\nMetric names should start with a '/', generally be lowercase-only,\nand end in \"_count\". Field names should not contain an initial slash.\nThe actual exported metric names will have \"/iam/policy\" prepended.\n\nField names correspond to IAM request parameters and field values are\ntheir respective values.\n\nAt present the only supported field names are\n   - \"iam_principal\", corresponding to IAMContext.principal;\n   - \"\" (empty string), resulting in one aggretated counter with no field.\n\nExamples:\n  counter { metric: \"/debug_access_count\"  field: \"iam_principal\" }\n  ==\u003e increment counter /iam/policy/backend_debug_access_count\n                        {iam_principal=[value of IAMContext.principal]}\n\nAt this time we do not support:\n* multiple field names (though this may be supported in the future)\n* decrementing the counter\n* incrementing it by anything other than 1",
-      "type": "object"
+      "id": "LogConfig"
     },
     "SetIamPolicyRequest": {
       "description": "Request message for `SetIamPolicy` method.",
       "type": "object",
       "properties": {
         "policy": {
-          "$ref": "Policy",
-          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them."
+          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them.",
+          "$ref": "Policy"
         },
         "updateMask": {
           "description": "OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only\nthe fields in the mask will be modified. If no mask is provided, a default\nmask is used:\npaths: \"bindings, etag\"\nThis field is only used by Cloud IAM.",
@@ -649,865 +998,516 @@
         }
       },
       "id": "SetIamPolicyRequest"
+    },
+    "DecryptRequest": {
+      "properties": {
+        "ciphertext": {
+          "description": "Required. The encrypted data originally returned in\nEncryptResponse.ciphertext.",
+          "format": "byte",
+          "type": "string"
+        },
+        "additionalAuthenticatedData": {
+          "description": "Optional data that must match the data originally supplied in\nEncryptRequest.additional_authenticated_data.",
+          "format": "byte",
+          "type": "string"
+        }
+      },
+      "id": "DecryptRequest",
+      "description": "Request message for KeyManagementService.Decrypt.",
+      "type": "object"
+    },
+    "Location": {
+      "description": "A resource that represents Google Cloud Platform location.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "Resource name for the location, which may vary between implementations.\nFor example: `\"projects/example-project/locations/us-east1\"`",
+          "type": "string"
+        },
+        "locationId": {
+          "description": "The canonical id for this location. For example: `\"us-east1\"`.",
+          "type": "string"
+        },
+        "metadata": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "Service-specific metadata. For example the available capacity at the given\nlocation.",
+          "type": "object"
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Cross-service attributes for the location. For example\n\n    {\"cloud.googleapis.com/region\": \"us-east1\"}",
+          "type": "object"
+        }
+      },
+      "id": "Location"
+    },
+    "ListCryptoKeysResponse": {
+      "description": "Response message for KeyManagementService.ListCryptoKeys.",
+      "type": "object",
+      "properties": {
+        "nextPageToken": {
+          "description": "A token to retrieve next page of results. Pass this value in\nListCryptoKeysRequest.page_token to retrieve the next page of results.",
+          "type": "string"
+        },
+        "cryptoKeys": {
+          "description": "The list of CryptoKeys.",
+          "type": "array",
+          "items": {
+            "$ref": "CryptoKey"
+          }
+        },
+        "totalSize": {
+          "description": "The total number of CryptoKeys that matched the query.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "ListCryptoKeysResponse"
+    },
+    "Condition": {
+      "description": "A condition to be met.",
+      "type": "object",
+      "properties": {
+        "values": {
+          "description": "The objects of the condition. This is mutually exclusive with 'value'.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "iam": {
+          "enum": [
+            "NO_ATTR",
+            "AUTHORITY",
+            "ATTRIBUTION"
+          ],
+          "description": "Trusted attributes supplied by the IAM system.",
+          "type": "string",
+          "enumDescriptions": [
+            "Default non-attribute.",
+            "Either principal or (if present) authority selector.",
+            "The principal (even if an authority selector is present), which\nmust only be used for attribution, not authorization."
+          ]
+        },
+        "op": {
+          "enum": [
+            "NO_OP",
+            "EQUALS",
+            "NOT_EQUALS",
+            "IN",
+            "NOT_IN",
+            "DISCHARGED"
+          ],
+          "description": "An operator to apply the subject with.",
+          "type": "string",
+          "enumDescriptions": [
+            "Default no-op.",
+            "DEPRECATED. Use IN instead.",
+            "DEPRECATED. Use NOT_IN instead.",
+            "Set-inclusion check.",
+            "Set-exclusion check.",
+            "Subject is discharged"
+          ]
+        },
+        "svc": {
+          "description": "Trusted attributes discharged by the service.",
+          "type": "string"
+        },
+        "value": {
+          "description": "DEPRECATED. Use 'values' instead.",
+          "type": "string"
+        },
+        "sys": {
+          "enumDescriptions": [
+            "Default non-attribute type",
+            "Region of the resource",
+            "Service name",
+            "Resource name",
+            "IP address of the caller"
+          ],
+          "enum": [
+            "NO_ATTR",
+            "REGION",
+            "SERVICE",
+            "NAME",
+            "IP"
+          ],
+          "description": "Trusted attributes supplied by any service that owns resources and uses\nthe IAM system for access control.",
+          "type": "string"
+        }
+      },
+      "id": "Condition"
+    },
+    "CounterOptions": {
+      "properties": {
+        "metric": {
+          "description": "The metric to update.",
+          "type": "string"
+        },
+        "field": {
+          "description": "The field value to attribute.",
+          "type": "string"
+        }
+      },
+      "id": "CounterOptions",
+      "description": "Options for counters",
+      "type": "object"
+    },
+    "AuditLogConfig": {
+      "description": "Provides the configuration for logging a type of permissions.\nExample:\n\n    {\n      \"audit_log_configs\": [\n        {\n          \"log_type\": \"DATA_READ\",\n          \"exempted_members\": [\n            \"user:foo@gmail.com\"\n          ]\n        },\n        {\n          \"log_type\": \"DATA_WRITE\",\n        }\n      ]\n    }\n\nThis enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting\nfoo@gmail.com from DATA_READ logging.",
+      "type": "object",
+      "properties": {
+        "exemptedMembers": {
+          "description": "Specifies the identities that do not cause logging for this type of\npermission.\nFollows the same format of Binding.members.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "logType": {
+          "enum": [
+            "LOG_TYPE_UNSPECIFIED",
+            "ADMIN_READ",
+            "DATA_WRITE",
+            "DATA_READ"
+          ],
+          "description": "The log type that this config enables.",
+          "type": "string",
+          "enumDescriptions": [
+            "Default case. Should never be this.",
+            "Admin reads. Example: CloudIAM getIamPolicy",
+            "Data writes. Example: CloudSQL Users create",
+            "Data reads. Example: CloudSQL Users list"
+          ]
+        }
+      },
+      "id": "AuditLogConfig"
+    },
+    "DecryptResponse": {
+      "properties": {
+        "plaintext": {
+          "description": "The decrypted data originally supplied in EncryptRequest.plaintext.",
+          "format": "byte",
+          "type": "string"
+        }
+      },
+      "id": "DecryptResponse",
+      "description": "Response message for KeyManagementService.Decrypt.",
+      "type": "object"
+    },
+    "TestIamPermissionsRequest": {
+      "properties": {
+        "permissions": {
+          "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "TestIamPermissionsRequest",
+      "description": "Request message for `TestIamPermissions` method.",
+      "type": "object"
+    },
+    "Policy": {
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
+      "type": "object",
+      "properties": {
+        "iamOwned": {
+          "type": "boolean"
+        },
+        "rules": {
+          "description": "If more than one rule is specified, the rules are applied in the following\nmanner:\n- All matching LOG rules are always applied.\n- If any DENY/DENY_WITH_LOG rule matches, permission is denied.\n  Logging will be applied if one or more matching rule requires logging.\n- Otherwise, if any ALLOW/ALLOW_WITH_LOG rule matches, permission is\n  granted.\n  Logging will be applied if one or more matching rule requires logging.\n- Otherwise, if no rule applies, permission is denied.",
+          "type": "array",
+          "items": {
+            "$ref": "Rule"
+          }
+        },
+        "version": {
+          "description": "Version of the `Policy`. The default version is 0.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "auditConfigs": {
+          "description": "Specifies cloud audit logging configuration for this policy.",
+          "type": "array",
+          "items": {
+            "$ref": "AuditConfig"
+          }
+        },
+        "bindings": {
+          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
+          "type": "array",
+          "items": {
+            "$ref": "Binding"
+          }
+        },
+        "etag": {
+          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
+          "format": "byte",
+          "type": "string"
+        }
+      },
+      "id": "Policy"
+    },
+    "ListLocationsResponse": {
+      "description": "The response message for Locations.ListLocations.",
+      "type": "object",
+      "properties": {
+        "locations": {
+          "description": "A list of locations that matches the specified filter in the request.",
+          "type": "array",
+          "items": {
+            "$ref": "Location"
+          }
+        },
+        "nextPageToken": {
+          "description": "The standard List next-page token.",
+          "type": "string"
+        }
+      },
+      "id": "ListLocationsResponse"
+    },
+    "KeyRing": {
+      "description": "A KeyRing is a toplevel logical grouping of CryptoKeys.",
+      "type": "object",
+      "properties": {
+        "createTime": {
+          "description": "Output only. The time at which this KeyRing was created.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "name": {
+          "description": "Output only. The resource name for the KeyRing in the format\n`projects/*/locations/*/keyRings/*`.",
+          "type": "string"
+        }
+      },
+      "id": "KeyRing"
+    },
+    "EncryptResponse": {
+      "description": "Response message for KeyManagementService.Encrypt.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The resource name of the CryptoKeyVersion used in encryption.",
+          "type": "string"
+        },
+        "ciphertext": {
+          "description": "The encrypted data.",
+          "format": "byte",
+          "type": "string"
+        }
+      },
+      "id": "EncryptResponse"
+    },
+    "RestoreCryptoKeyVersionRequest": {
+      "description": "Request message for KeyManagementService.RestoreCryptoKeyVersion.",
+      "type": "object",
+      "properties": {},
+      "id": "RestoreCryptoKeyVersionRequest"
+    },
+    "UpdateCryptoKeyPrimaryVersionRequest": {
+      "description": "Request message for KeyManagementService.UpdateCryptoKeyPrimaryVersion.",
+      "type": "object",
+      "properties": {
+        "cryptoKeyVersionId": {
+          "description": "The id of the child CryptoKeyVersion to use as primary.",
+          "type": "string"
+        }
+      },
+      "id": "UpdateCryptoKeyPrimaryVersionRequest"
+    },
+    "ListKeyRingsResponse": {
+      "properties": {
+        "nextPageToken": {
+          "description": "A token to retrieve next page of results. Pass this value in\nListKeyRingsRequest.page_token to retrieve the next page of results.",
+          "type": "string"
+        },
+        "totalSize": {
+          "description": "The total number of KeyRings that matched the query.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "keyRings": {
+          "description": "The list of KeyRings.",
+          "type": "array",
+          "items": {
+            "$ref": "KeyRing"
+          }
+        }
+      },
+      "id": "ListKeyRingsResponse",
+      "description": "Response message for KeyManagementService.ListKeyRings.",
+      "type": "object"
+    },
+    "DataAccessOptions": {
+      "properties": {},
+      "id": "DataAccessOptions",
+      "description": "Write a Data Access (Gin) log",
+      "type": "object"
+    },
+    "AuditConfig": {
+      "description": "Specifies the audit configuration for a service.\nIt consists of which permission types are logged, and what identities, if\nany, are exempted from logging.\nAn AuditConifg must have one or more AuditLogConfigs.",
+      "type": "object",
+      "properties": {
+        "exemptedMembers": {
+          "description": "Specifies the identities that are exempted from \"data access\" audit\nlogging for the `service` specified above.\nFollows the same format of Binding.members.\nThis field is deprecated in favor of per-permission-type exemptions.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "service": {
+          "description": "Specifies a service that will be enabled for audit logging.\nFor example, `resourcemanager`, `storage`, `compute`.\n`allServices` is a special value that covers all services.",
+          "type": "string"
+        },
+        "auditLogConfigs": {
+          "description": "The configuration for logging of each type of permission.\nNext ID: 4",
+          "type": "array",
+          "items": {
+            "$ref": "AuditLogConfig"
+          }
+        }
+      },
+      "id": "AuditConfig"
+    },
+    "CryptoKeyVersion": {
+      "description": "A CryptoKeyVersion represents an individual cryptographic key, and the\nassociated key material.\n\nIt can be used for cryptographic operations either directly, or via its\nparent CryptoKey, in which case the server will choose the appropriate\nversion for the operation.",
+      "type": "object",
+      "properties": {
+        "destroyTime": {
+          "description": "Output only. The time this CryptoKeyVersion's key material is scheduled\nfor destruction. Only present if state is\nDESTROY_SCHEDULED.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "createTime": {
+          "description": "Output only. The time at which this CryptoKeyVersion was created.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "state": {
+          "enumDescriptions": [
+            "Not specified.",
+            "This version may be used in Encrypt and\nDecrypt requests.",
+            "This version may not be used, but the key material is still available,\nand the version can be placed back into the ENABLED state.",
+            "This version is destroyed, and the key material is no longer stored.\nA version may not leave this state once entered.",
+            "This version is scheduled for destruction, and will be destroyed soon.\nCall\nRestoreCryptoKeyVersion\nto put it back into the DISABLED state."
+          ],
+          "enum": [
+            "CRYPTO_KEY_VERSION_STATE_UNSPECIFIED",
+            "ENABLED",
+            "DISABLED",
+            "DESTROYED",
+            "DESTROY_SCHEDULED"
+          ],
+          "description": "The current state of the CryptoKeyVersion.",
+          "type": "string"
+        },
+        "name": {
+          "description": "Output only. The resource name for this CryptoKeyVersion in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*/cryptoKeyVersions/*`.",
+          "type": "string"
+        },
+        "destroyEventTime": {
+          "description": "Output only. The time this CryptoKeyVersion's key material was\ndestroyed. Only present if state is\nDESTROYED.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "CryptoKeyVersion"
+    },
+    "CloudAuditOptions": {
+      "properties": {},
+      "id": "CloudAuditOptions",
+      "description": "Write a Cloud Audit log",
+      "type": "object"
+    },
+    "Binding": {
+      "description": "Associates `members` with a `role`.",
+      "type": "object",
+      "properties": {
+        "members": {
+          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "role": {
+          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
+          "type": "string"
+        }
+      },
+      "id": "Binding"
+    },
+    "EncryptRequest": {
+      "properties": {
+        "additionalAuthenticatedData": {
+          "description": "Optional data that, if specified, must also be provided during decryption\nthrough DecryptRequest.additional_authenticated_data.  Must be no\nlarger than 64KiB.",
+          "format": "byte",
+          "type": "string"
+        },
+        "plaintext": {
+          "description": "Required. The data to encrypt. Must be no larger than 64KiB.",
+          "format": "byte",
+          "type": "string"
+        }
+      },
+      "id": "EncryptRequest",
+      "description": "Request message for KeyManagementService.Encrypt.",
+      "type": "object"
+    },
+    "ListCryptoKeyVersionsResponse": {
+      "description": "Response message for KeyManagementService.ListCryptoKeyVersions.",
+      "type": "object",
+      "properties": {
+        "nextPageToken": {
+          "description": "A token to retrieve next page of results. Pass this value in\nListCryptoKeyVersionsRequest.page_token to retrieve the next page of\nresults.",
+          "type": "string"
+        },
+        "totalSize": {
+          "description": "The total number of CryptoKeyVersions that matched the\nquery.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "cryptoKeyVersions": {
+          "description": "The list of CryptoKeyVersions.",
+          "type": "array",
+          "items": {
+            "$ref": "CryptoKeyVersion"
+          }
+        }
+      },
+      "id": "ListCryptoKeyVersionsResponse"
+    },
+    "TestIamPermissionsResponse": {
+      "description": "Response message for `TestIamPermissions` method.",
+      "type": "object",
+      "properties": {
+        "permissions": {
+          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "TestIamPermissionsResponse"
+    },
+    "DestroyCryptoKeyVersionRequest": {
+      "description": "Request message for KeyManagementService.DestroyCryptoKeyVersion.",
+      "type": "object",
+      "properties": {},
+      "id": "DestroyCryptoKeyVersionRequest"
     }
   },
   "icons": {
     "x16": "http://www.google.com/images/icons/product/search-16.gif",
     "x32": "http://www.google.com/images/icons/product/search-32.gif"
   },
-  "protocol": "rest",
-  "canonicalName": "Cloud KMS",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        }
-      }
-    }
-  },
-  "rootUrl": "https://cloudkms.googleapis.com/",
-  "ownerDomain": "google.com",
-  "name": "cloudkms",
-  "batchPath": "batch",
-  "title": "Google Cloud KMS API",
-  "ownerName": "Google",
-  "resources": {
-    "projects": {
-      "resources": {
-        "locations": {
-          "resources": {
-            "keyRings": {
-              "resources": {
-                "cryptoKeys": {
-                  "resources": {
-                    "cryptoKeyVersions": {
-                      "methods": {
-                        "create": {
-                          "httpMethod": "POST",
-                          "parameterOrder": [
-                            "parent"
-                          ],
-                          "response": {
-                            "$ref": "CryptoKeyVersion"
-                          },
-                          "scopes": [
-                            "https://www.googleapis.com/auth/cloud-platform"
-                          ],
-                          "parameters": {
-                            "parent": {
-                              "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
-                              "location": "path",
-                              "description": "Required. The name of the CryptoKey associated with\nthe CryptoKeyVersions.",
-                              "required": true,
-                              "type": "string"
-                            }
-                          },
-                          "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions",
-                          "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.create",
-                          "path": "v1beta1/{+parent}/cryptoKeyVersions",
-                          "description": "Create a new CryptoKeyVersion in a CryptoKey.\n\nThe server will assign the next sequential id. If unset,\nstate will be set to\nENABLED.",
-                          "request": {
-                            "$ref": "CryptoKeyVersion"
-                          }
-                        },
-                        "destroy": {
-                          "path": "v1beta1/{+name}:destroy",
-                          "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.destroy",
-                          "description": "Schedule a CryptoKeyVersion for destruction.\n\nUpon calling this method, CryptoKeyVersion.state will be set to\nDESTROY_SCHEDULED\nand destroy_time will be set to a time 24\nhours in the future, at which point the state\nwill be changed to\nDESTROYED, and the key\nmaterial will be irrevocably destroyed.\n\nBefore the destroy_time is reached,\nRestoreCryptoKeyVersion may be called to reverse the process.",
-                          "request": {
-                            "$ref": "DestroyCryptoKeyVersionRequest"
-                          },
-                          "response": {
-                            "$ref": "CryptoKeyVersion"
-                          },
-                          "parameterOrder": [
-                            "name"
-                          ],
-                          "httpMethod": "POST",
-                          "scopes": [
-                            "https://www.googleapis.com/auth/cloud-platform"
-                          ],
-                          "parameters": {
-                            "name": {
-                              "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$",
-                              "location": "path",
-                              "description": "The resource name of the CryptoKeyVersion to destroy.",
-                              "required": true,
-                              "type": "string"
-                            }
-                          },
-                          "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:destroy"
-                        },
-                        "restore": {
-                          "path": "v1beta1/{+name}:restore",
-                          "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.restore",
-                          "description": "Restore a CryptoKeyVersion in the\nDESTROY_SCHEDULED,\nstate.\n\nUpon restoration of the CryptoKeyVersion, state\nwill be set to DISABLED,\nand destroy_time will be cleared.",
-                          "request": {
-                            "$ref": "RestoreCryptoKeyVersionRequest"
-                          },
-                          "response": {
-                            "$ref": "CryptoKeyVersion"
-                          },
-                          "parameterOrder": [
-                            "name"
-                          ],
-                          "httpMethod": "POST",
-                          "scopes": [
-                            "https://www.googleapis.com/auth/cloud-platform"
-                          ],
-                          "parameters": {
-                            "name": {
-                              "description": "The resource name of the CryptoKeyVersion to restore.",
-                              "required": true,
-                              "type": "string",
-                              "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$",
-                              "location": "path"
-                            }
-                          },
-                          "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:restore"
-                        },
-                        "get": {
-                          "description": "Returns metadata for a given CryptoKeyVersion.",
-                          "parameterOrder": [
-                            "name"
-                          ],
-                          "httpMethod": "GET",
-                          "response": {
-                            "$ref": "CryptoKeyVersion"
-                          },
-                          "scopes": [
-                            "https://www.googleapis.com/auth/cloud-platform"
-                          ],
-                          "parameters": {
-                            "name": {
-                              "description": "The name of the CryptoKeyVersion to get.",
-                              "required": true,
-                              "type": "string",
-                              "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$",
-                              "location": "path"
-                            }
-                          },
-                          "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}",
-                          "path": "v1beta1/{+name}",
-                          "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.get"
-                        },
-                        "patch": {
-                          "path": "v1beta1/{+name}",
-                          "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.patch",
-                          "description": "Update a CryptoKeyVersion's metadata.\n\nstate may be changed between\nENABLED and\nDISABLED using this\nmethod. See DestroyCryptoKeyVersion and RestoreCryptoKeyVersion to\nmove between other states.",
-                          "request": {
-                            "$ref": "CryptoKeyVersion"
-                          },
-                          "response": {
-                            "$ref": "CryptoKeyVersion"
-                          },
-                          "parameterOrder": [
-                            "name"
-                          ],
-                          "httpMethod": "PATCH",
-                          "scopes": [
-                            "https://www.googleapis.com/auth/cloud-platform"
-                          ],
-                          "parameters": {
-                            "name": {
-                              "description": "Output only. The resource name for this CryptoKeyVersion in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*/cryptoKeyVersions/*`.",
-                              "required": true,
-                              "type": "string",
-                              "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+/cryptoKeyVersions/[^/]+$",
-                              "location": "path"
-                            },
-                            "updateMask": {
-                              "description": "Required list of fields to be updated in this request.",
-                              "format": "google-fieldmask",
-                              "type": "string",
-                              "location": "query"
-                            }
-                          },
-                          "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}"
-                        },
-                        "list": {
-                          "path": "v1beta1/{+parent}/cryptoKeyVersions",
-                          "id": "cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.list",
-                          "description": "Lists CryptoKeyVersions.",
-                          "parameterOrder": [
-                            "parent"
-                          ],
-                          "httpMethod": "GET",
-                          "response": {
-                            "$ref": "ListCryptoKeyVersionsResponse"
-                          },
-                          "parameters": {
-                            "pageToken": {
-                              "location": "query",
-                              "description": "Optional pagination token, returned earlier via\nListCryptoKeyVersionsResponse.next_page_token.",
-                              "type": "string"
-                            },
-                            "pageSize": {
-                              "description": "Optional limit on the number of CryptoKeyVersions to\ninclude in the response. Further CryptoKeyVersions can\nsubsequently be obtained by including the\nListCryptoKeyVersionsResponse.next_page_token in a subsequent request.\nIf unspecified, the server will pick an appropriate default.",
-                              "format": "int32",
-                              "type": "integer",
-                              "location": "query"
-                            },
-                            "parent": {
-                              "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
-                              "location": "path",
-                              "description": "Required. The resource name of the CryptoKey to list, in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*`.",
-                              "required": true,
-                              "type": "string"
-                            }
-                          },
-                          "scopes": [
-                            "https://www.googleapis.com/auth/cloud-platform"
-                          ],
-                          "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions"
-                        }
-                      }
-                    }
-                  },
-                  "methods": {
-                    "encrypt": {
-                      "path": "v1beta1/{+name}:encrypt",
-                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.encrypt",
-                      "description": "Encrypt data, so that it can only be recovered by a call to Decrypt.",
-                      "request": {
-                        "$ref": "EncryptRequest"
-                      },
-                      "response": {
-                        "$ref": "EncryptResponse"
-                      },
-                      "parameterOrder": [
-                        "name"
-                      ],
-                      "httpMethod": "POST",
-                      "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform"
-                      ],
-                      "parameters": {
-                        "name": {
-                          "description": "Required. The resource name of the CryptoKey or CryptoKeyVersion\nto use for encryption.\n\nIf a CryptoKey is specified, the server will use its\nprimary version.",
-                          "required": true,
-                          "type": "string",
-                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/.+$",
-                          "location": "path"
-                        }
-                      },
-                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:encrypt"
-                    },
-                    "setIamPolicy": {
-                      "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
-                      "request": {
-                        "$ref": "SetIamPolicyRequest"
-                      },
-                      "httpMethod": "POST",
-                      "parameterOrder": [
-                        "resource"
-                      ],
-                      "response": {
-                        "$ref": "Policy"
-                      },
-                      "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform"
-                      ],
-                      "parameters": {
-                        "resource": {
-                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
-                          "location": "path",
-                          "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                          "required": true,
-                          "type": "string"
-                        }
-                      },
-                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:setIamPolicy",
-                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.setIamPolicy",
-                      "path": "v1beta1/{+resource}:setIamPolicy"
-                    },
-                    "create": {
-                      "response": {
-                        "$ref": "CryptoKey"
-                      },
-                      "parameterOrder": [
-                        "parent"
-                      ],
-                      "httpMethod": "POST",
-                      "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform"
-                      ],
-                      "parameters": {
-                        "cryptoKeyId": {
-                          "description": "Required. It must be unique within a KeyRing and match the regular\nexpression `[a-zA-Z0-9_-]{1,63}`",
-                          "type": "string",
-                          "location": "query"
-                        },
-                        "parent": {
-                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$",
-                          "location": "path",
-                          "description": "Required. The name of the KeyRing associated with the\nCryptoKeys.",
-                          "required": true,
-                          "type": "string"
-                        }
-                      },
-                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys",
-                      "path": "v1beta1/{+parent}/cryptoKeys",
-                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.create",
-                      "description": "Create a new CryptoKey within a KeyRing.\n\nCryptoKey.purpose is required.",
-                      "request": {
-                        "$ref": "CryptoKey"
-                      }
-                    },
-                    "updatePrimaryVersion": {
-                      "response": {
-                        "$ref": "CryptoKey"
-                      },
-                      "parameterOrder": [
-                        "name"
-                      ],
-                      "httpMethod": "POST",
-                      "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform"
-                      ],
-                      "parameters": {
-                        "name": {
-                          "description": "The resource name of the CryptoKey to update.",
-                          "required": true,
-                          "type": "string",
-                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
-                          "location": "path"
-                        }
-                      },
-                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:updatePrimaryVersion",
-                      "path": "v1beta1/{+name}:updatePrimaryVersion",
-                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.updatePrimaryVersion",
-                      "description": "Update the version of a CryptoKey that will be used in Encrypt",
-                      "request": {
-                        "$ref": "UpdateCryptoKeyPrimaryVersionRequest"
-                      }
-                    },
-                    "getIamPolicy": {
-                      "path": "v1beta1/{+resource}:getIamPolicy",
-                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.getIamPolicy",
-                      "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.",
-                      "response": {
-                        "$ref": "Policy"
-                      },
-                      "parameterOrder": [
-                        "resource"
-                      ],
-                      "httpMethod": "GET",
-                      "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform"
-                      ],
-                      "parameters": {
-                        "resource": {
-                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
-                          "location": "path",
-                          "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                          "required": true,
-                          "type": "string"
-                        }
-                      },
-                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:getIamPolicy"
-                    },
-                    "patch": {
-                      "response": {
-                        "$ref": "CryptoKey"
-                      },
-                      "parameterOrder": [
-                        "name"
-                      ],
-                      "httpMethod": "PATCH",
-                      "parameters": {
-                        "name": {
-                          "description": "Output only. The resource name for this CryptoKey in the format\n`projects/*/locations/*/keyRings/*/cryptoKeys/*`.",
-                          "required": true,
-                          "type": "string",
-                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
-                          "location": "path"
-                        },
-                        "updateMask": {
-                          "location": "query",
-                          "description": "Required list of fields to be updated in this request.",
-                          "format": "google-fieldmask",
-                          "type": "string"
-                        }
-                      },
-                      "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform"
-                      ],
-                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}",
-                      "path": "v1beta1/{+name}",
-                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.patch",
-                      "request": {
-                        "$ref": "CryptoKey"
-                      },
-                      "description": "Update a CryptoKey."
-                    },
-                    "get": {
-                      "httpMethod": "GET",
-                      "response": {
-                        "$ref": "CryptoKey"
-                      },
-                      "parameterOrder": [
-                        "name"
-                      ],
-                      "parameters": {
-                        "name": {
-                          "description": "The name of the CryptoKey to get.",
-                          "required": true,
-                          "type": "string",
-                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
-                          "location": "path"
-                        }
-                      },
-                      "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform"
-                      ],
-                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}",
-                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.get",
-                      "path": "v1beta1/{+name}",
-                      "description": "Returns metadata for a given CryptoKey, as well as its\nprimary CryptoKeyVersion."
-                    },
-                    "testIamPermissions": {
-                      "request": {
-                        "$ref": "TestIamPermissionsRequest"
-                      },
-                      "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
-                      "httpMethod": "POST",
-                      "parameterOrder": [
-                        "resource"
-                      ],
-                      "response": {
-                        "$ref": "TestIamPermissionsResponse"
-                      },
-                      "parameters": {
-                        "resource": {
-                          "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                          "required": true,
-                          "type": "string",
-                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
-                          "location": "path"
-                        }
-                      },
-                      "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform"
-                      ],
-                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:testIamPermissions",
-                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.testIamPermissions",
-                      "path": "v1beta1/{+resource}:testIamPermissions"
-                    },
-                    "decrypt": {
-                      "httpMethod": "POST",
-                      "parameterOrder": [
-                        "name"
-                      ],
-                      "response": {
-                        "$ref": "DecryptResponse"
-                      },
-                      "parameters": {
-                        "name": {
-                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+/cryptoKeys/[^/]+$",
-                          "location": "path",
-                          "description": "Required. The resource name of the CryptoKey to use for decryption.\nThe server will choose the appropriate version.",
-                          "required": true,
-                          "type": "string"
-                        }
-                      },
-                      "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform"
-                      ],
-                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:decrypt",
-                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.decrypt",
-                      "path": "v1beta1/{+name}:decrypt",
-                      "request": {
-                        "$ref": "DecryptRequest"
-                      },
-                      "description": "Decrypt data that was protected by Encrypt."
-                    },
-                    "list": {
-                      "response": {
-                        "$ref": "ListCryptoKeysResponse"
-                      },
-                      "parameterOrder": [
-                        "parent"
-                      ],
-                      "httpMethod": "GET",
-                      "parameters": {
-                        "parent": {
-                          "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$",
-                          "location": "path",
-                          "description": "Required. The resource name of the KeyRing to list, in the format\n`projects/*/locations/*/keyRings/*`.",
-                          "required": true,
-                          "type": "string"
-                        },
-                        "pageToken": {
-                          "location": "query",
-                          "description": "Optional pagination token, returned earlier via\nListCryptoKeysResponse.next_page_token.",
-                          "type": "string"
-                        },
-                        "pageSize": {
-                          "description": "Optional limit on the number of CryptoKeys to include in the\nresponse.  Further CryptoKeys can subsequently be obtained by\nincluding the ListCryptoKeysResponse.next_page_token in a subsequent\nrequest.  If unspecified, the server will pick an appropriate default.",
-                          "format": "int32",
-                          "type": "integer",
-                          "location": "query"
-                        }
-                      },
-                      "scopes": [
-                        "https://www.googleapis.com/auth/cloud-platform"
-                      ],
-                      "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys",
-                      "path": "v1beta1/{+parent}/cryptoKeys",
-                      "id": "cloudkms.projects.locations.keyRings.cryptoKeys.list",
-                      "description": "Lists CryptoKeys."
-                    }
-                  }
-                }
-              },
-              "methods": {
-                "list": {
-                  "response": {
-                    "$ref": "ListKeyRingsResponse"
-                  },
-                  "parameterOrder": [
-                    "parent"
-                  ],
-                  "httpMethod": "GET",
-                  "parameters": {
-                    "pageToken": {
-                      "description": "Optional pagination token, returned earlier via\nListKeyRingsResponse.next_page_token.",
-                      "type": "string",
-                      "location": "query"
-                    },
-                    "pageSize": {
-                      "description": "Optional limit on the number of KeyRings to include in the\nresponse.  Further KeyRings can subsequently be obtained by\nincluding the ListKeyRingsResponse.next_page_token in a subsequent\nrequest.  If unspecified, the server will pick an appropriate default.",
-                      "format": "int32",
-                      "type": "integer",
-                      "location": "query"
-                    },
-                    "parent": {
-                      "description": "Required. The resource name of the location associated with the\nKeyRings, in the format `projects/*/locations/*`.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/locations/[^/]+$",
-                      "location": "path"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings",
-                  "path": "v1beta1/{+parent}/keyRings",
-                  "id": "cloudkms.projects.locations.keyRings.list",
-                  "description": "Lists KeyRings."
-                },
-                "setIamPolicy": {
-                  "httpMethod": "POST",
-                  "parameterOrder": [
-                    "resource"
-                  ],
-                  "response": {
-                    "$ref": "Policy"
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform"
-                  ],
-                  "parameters": {
-                    "resource": {
-                      "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$",
-                      "location": "path"
-                    }
-                  },
-                  "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:setIamPolicy",
-                  "id": "cloudkms.projects.locations.keyRings.setIamPolicy",
-                  "path": "v1beta1/{+resource}:setIamPolicy",
-                  "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
-                  "request": {
-                    "$ref": "SetIamPolicyRequest"
-                  }
-                },
-                "create": {
-                  "httpMethod": "POST",
-                  "parameterOrder": [
-                    "parent"
-                  ],
-                  "response": {
-                    "$ref": "KeyRing"
-                  },
-                  "parameters": {
-                    "parent": {
-                      "pattern": "^projects/[^/]+/locations/[^/]+$",
-                      "location": "path",
-                      "description": "Required. The resource name of the location associated with the\nKeyRings, in the format `projects/*/locations/*`.",
-                      "required": true,
-                      "type": "string"
-                    },
-                    "keyRingId": {
-                      "location": "query",
-                      "description": "Required. It must be unique within a location and match the regular\nexpression `[a-zA-Z0-9_-]{1,63}`",
-                      "type": "string"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings",
-                  "id": "cloudkms.projects.locations.keyRings.create",
-                  "path": "v1beta1/{+parent}/keyRings",
-                  "request": {
-                    "$ref": "KeyRing"
-                  },
-                  "description": "Create a new KeyRing in a given Project and Location."
-                },
-                "getIamPolicy": {
-                  "httpMethod": "GET",
-                  "response": {
-                    "$ref": "Policy"
-                  },
-                  "parameterOrder": [
-                    "resource"
-                  ],
-                  "parameters": {
-                    "resource": {
-                      "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$",
-                      "location": "path"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:getIamPolicy",
-                  "id": "cloudkms.projects.locations.keyRings.getIamPolicy",
-                  "path": "v1beta1/{+resource}:getIamPolicy",
-                  "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset."
-                },
-                "get": {
-                  "description": "Returns metadata for a given KeyRing.",
-                  "httpMethod": "GET",
-                  "response": {
-                    "$ref": "KeyRing"
-                  },
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "parameters": {
-                    "name": {
-                      "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$",
-                      "location": "path",
-                      "description": "The name of the KeyRing to get.",
-                      "required": true,
-                      "type": "string"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}",
-                  "id": "cloudkms.projects.locations.keyRings.get",
-                  "path": "v1beta1/{+name}"
-                },
-                "testIamPermissions": {
-                  "httpMethod": "POST",
-                  "parameterOrder": [
-                    "resource"
-                  ],
-                  "response": {
-                    "$ref": "TestIamPermissionsResponse"
-                  },
-                  "parameters": {
-                    "resource": {
-                      "pattern": "^projects/[^/]+/locations/[^/]+/keyRings/[^/]+$",
-                      "location": "path",
-                      "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                      "required": true,
-                      "type": "string"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:testIamPermissions",
-                  "id": "cloudkms.projects.locations.keyRings.testIamPermissions",
-                  "path": "v1beta1/{+resource}:testIamPermissions",
-                  "request": {
-                    "$ref": "TestIamPermissionsRequest"
-                  },
-                  "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error."
-                }
-              }
-            }
-          },
-          "methods": {
-            "list": {
-              "path": "v1beta1/{+name}/locations",
-              "id": "cloudkms.projects.locations.list",
-              "description": "Lists information about the supported locations for this service.",
-              "parameterOrder": [
-                "name"
-              ],
-              "httpMethod": "GET",
-              "response": {
-                "$ref": "ListLocationsResponse"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "parameters": {
-                "name": {
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "description": "The resource that owns the locations collection, if applicable.",
-                  "required": true,
-                  "type": "string"
-                },
-                "pageToken": {
-                  "description": "The standard list page token.",
-                  "type": "string",
-                  "location": "query"
-                },
-                "pageSize": {
-                  "description": "The standard list page size.",
-                  "format": "int32",
-                  "type": "integer",
-                  "location": "query"
-                },
-                "filter": {
-                  "location": "query",
-                  "description": "The standard list filter.",
-                  "type": "string"
-                }
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/locations"
-            },
-            "get": {
-              "description": "Get information about a location.",
-              "response": {
-                "$ref": "Location"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "httpMethod": "GET",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "parameters": {
-                "name": {
-                  "pattern": "^projects/[^/]+/locations/[^/]+$",
-                  "location": "path",
-                  "description": "Resource name for the location.",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/locations/{locationsId}",
-              "path": "v1beta1/{+name}",
-              "id": "cloudkms.projects.locations.get"
-            }
-          }
-        }
-      }
-    }
-  },
-  "parameters": {
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "location": "query",
-      "description": "Returns response with indentations and line breaks.",
-      "type": "boolean",
-      "default": "true"
-    },
-    "fields": {
-      "location": "query",
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "location": "query",
-      "description": "JSONP",
-      "type": "string"
-    },
-    "$.xgafv": {
-      "enum": [
-        "1",
-        "2"
-      ],
-      "description": "V1 error format.",
-      "type": "string",
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "location": "query"
-    },
-    "alt": {
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "type": "string",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "location": "query",
-      "description": "Data format for response.",
-      "default": "json"
-    },
-    "access_token": {
-      "location": "query",
-      "description": "OAuth access token.",
-      "type": "string"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "location": "query",
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string"
-    },
-    "pp": {
-      "location": "query",
-      "description": "Pretty-print response.",
-      "type": "boolean",
-      "default": "true"
-    },
-    "bearer_token": {
-      "location": "query",
-      "description": "OAuth bearer token.",
-      "type": "string"
-    },
-    "oauth_token": {
-      "location": "query",
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string"
-    }
-  },
-  "version": "v1beta1",
-  "baseUrl": "https://cloudkms.googleapis.com/",
-  "servicePath": "",
-  "description": "",
-  "kind": "discovery#restDescription",
-  "basePath": "",
-  "id": "cloudkms:v1beta1",
-  "documentationLink": "https://cloud.google.com/kms/",
-  "revision": "20170117"
+  "protocol": "rest"
 }
diff --git a/cloudkms/v1beta1/cloudkms-gen.go b/cloudkms/v1beta1/cloudkms-gen.go
index a1374fb..58b1726 100644
--- a/cloudkms/v1beta1/cloudkms-gen.go
+++ b/cloudkms/v1beta1/cloudkms-gen.go
@@ -1,4 +1,4 @@
-// Package cloudkms provides access to the Google Cloud KMS API.
+// Package cloudkms provides access to the Google Cloud Key Management Service (KMS) API.
 //
 // See https://cloud.google.com/kms/
 //
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Locations = NewProjectsLocationsService(s)
@@ -1428,6 +1433,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1589,6 +1595,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1764,6 +1771,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.keyring)
 	if err != nil {
@@ -1913,6 +1921,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2055,6 +2064,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2215,6 +2225,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2379,6 +2390,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -2518,6 +2530,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -2663,6 +2676,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cryptokey)
 	if err != nil {
@@ -2803,6 +2817,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.decryptrequest)
 	if err != nil {
@@ -2939,6 +2954,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.encryptrequest)
 	if err != nil {
@@ -3084,6 +3100,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3226,6 +3243,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3387,6 +3405,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3556,6 +3575,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cryptokey)
 	if err != nil {
@@ -3699,6 +3719,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -3838,6 +3859,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -3974,6 +3996,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.updatecryptokeyprimaryversionrequest)
 	if err != nil {
@@ -4113,6 +4136,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cryptokeyversion)
 	if err != nil {
@@ -4260,6 +4284,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.destroycryptokeyversionrequest)
 	if err != nil {
@@ -4404,6 +4429,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4565,6 +4591,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4741,6 +4768,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cryptokeyversion)
 	if err != nil {
@@ -4889,6 +4917,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.restorecryptokeyversionrequest)
 	if err != nil {
diff --git a/cloudmonitoring/v2beta2/cloudmonitoring-gen.go b/cloudmonitoring/v2beta2/cloudmonitoring-gen.go
index 57208fc..0298195 100644
--- a/cloudmonitoring/v2beta2/cloudmonitoring-gen.go
+++ b/cloudmonitoring/v2beta2/cloudmonitoring-gen.go
@@ -67,9 +67,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	MetricDescriptors *MetricDescriptorsService
 
@@ -85,6 +86,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewMetricDescriptorsService(s *Service) *MetricDescriptorsService {
 	rs := &MetricDescriptorsService{s: s}
 	return rs
@@ -1014,6 +1019,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.metricdescriptor)
 	if err != nil {
@@ -1148,6 +1154,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/metricDescriptors/{metric}")
@@ -1325,6 +1332,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1602,6 +1610,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1832,6 +1841,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.writetimeseriesrequest)
 	if err != nil {
@@ -2072,6 +2082,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/cloudresourcemanager/v1/cloudresourcemanager-api.json b/cloudresourcemanager/v1/cloudresourcemanager-api.json
index ea95815..217cc52 100644
--- a/cloudresourcemanager/v1/cloudresourcemanager-api.json
+++ b/cloudresourcemanager/v1/cloudresourcemanager-api.json
@@ -1,721 +1,627 @@
 {
-  "id": "cloudresourcemanager:v1",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        },
-        "https://www.googleapis.com/auth/cloud-platform.read-only": {
-          "description": "View your data across Google Cloud Platform services"
-        }
-      }
-    }
-  },
-  "description": "The Google Cloud Resource Manager API provides methods for creating, reading, and updating project metadata.",
-  "protocol": "rest",
   "title": "Google Cloud Resource Manager API",
+  "discoveryVersion": "v1",
+  "ownerName": "Google",
   "resources": {
     "organizations": {
       "methods": {
+        "setIamPolicy": {
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "resource"
+          ],
+          "response": {
+            "$ref": "Policy"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "resource": {
+              "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+              "required": true,
+              "type": "string",
+              "pattern": "^organizations/[^/]+$",
+              "location": "path"
+            }
+          },
+          "flatPath": "v1/organizations/{organizationsId}:setIamPolicy",
+          "id": "cloudresourcemanager.organizations.setIamPolicy",
+          "path": "v1/{+resource}:setIamPolicy",
+          "description": "Sets the access control policy on an Organization resource. Replaces any\nexisting policy. The `resource` field should be the organization's resource\nname, e.g. \"organizations/123\".",
+          "request": {
+            "$ref": "SetIamPolicyRequest"
+          }
+        },
+        "testIamPermissions": {
+          "response": {
+            "$ref": "TestIamPermissionsResponse"
+          },
+          "parameterOrder": [
+            "resource"
+          ],
+          "httpMethod": "POST",
+          "parameters": {
+            "resource": {
+              "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+              "required": true,
+              "type": "string",
+              "pattern": "^organizations/[^/]+$",
+              "location": "path"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "flatPath": "v1/organizations/{organizationsId}:testIamPermissions",
+          "path": "v1/{+resource}:testIamPermissions",
+          "id": "cloudresourcemanager.organizations.testIamPermissions",
+          "request": {
+            "$ref": "TestIamPermissionsRequest"
+          },
+          "description": "Returns permissions that a caller has on the specified Organization.\nThe `resource` field should be the organization's resource name,\ne.g. \"organizations/123\"."
+        },
+        "getIamPolicy": {
+          "parameters": {
+            "resource": {
+              "required": true,
+              "type": "string",
+              "pattern": "^organizations/[^/]+$",
+              "location": "path",
+              "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`."
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "flatPath": "v1/organizations/{organizationsId}:getIamPolicy",
+          "path": "v1/{+resource}:getIamPolicy",
+          "id": "cloudresourcemanager.organizations.getIamPolicy",
+          "request": {
+            "$ref": "GetIamPolicyRequest"
+          },
+          "description": "Gets the access control policy for an Organization resource. May be empty\nif no such policy or resource exists. The `resource` field should be the\norganization's resource name, e.g. \"organizations/123\".",
+          "response": {
+            "$ref": "Policy"
+          },
+          "parameterOrder": [
+            "resource"
+          ],
+          "httpMethod": "POST"
+        },
+        "search": {
+          "flatPath": "v1/organizations:search",
+          "id": "cloudresourcemanager.organizations.search",
+          "path": "v1/organizations:search",
+          "request": {
+            "$ref": "SearchOrganizationsRequest"
+          },
+          "description": "Searches Organization resources that are visible to the user and satisfy\nthe specified filter. This method returns Organizations in an unspecified\norder. New Organizations do not necessarily appear at the end of the\nresults.",
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "SearchOrganizationsResponse"
+          },
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ]
+        },
         "get": {
-          "id": "cloudresourcemanager.organizations.get",
           "response": {
             "$ref": "Organization"
           },
           "parameterOrder": [
             "name"
           ],
-          "description": "Fetches an Organization resource identified by the specified resource name.",
-          "flatPath": "v1/organizations/{organizationsId}",
           "httpMethod": "GET",
           "parameters": {
             "name": {
-              "description": "The resource name of the Organization to fetch, e.g. \"organizations/1234\".",
               "required": true,
+              "type": "string",
               "pattern": "^organizations/[^/]+$",
               "location": "path",
-              "type": "string"
+              "description": "The resource name of the Organization to fetch, e.g. \"organizations/1234\"."
             }
           },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "flatPath": "v1/organizations/{organizationsId}",
           "path": "v1/{+name}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
-        "testIamPermissions": {
-          "id": "cloudresourcemanager.organizations.testIamPermissions",
-          "response": {
-            "$ref": "TestIamPermissionsResponse"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
-          "description": "Returns permissions that a caller has on the specified Organization.\nThe `resource` field should be the organization's resource name,\ne.g. \"organizations/123\".",
-          "request": {
-            "$ref": "TestIamPermissionsRequest"
-          },
-          "flatPath": "v1/organizations/{organizationsId}:testIamPermissions",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "pattern": "^organizations/[^/]+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/{+resource}:testIamPermissions",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
-        "search": {
-          "id": "cloudresourcemanager.organizations.search",
-          "response": {
-            "$ref": "SearchOrganizationsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Searches Organization resources that are visible to the user and satisfy\nthe specified filter. This method returns Organizations in an unspecified\norder. New Organizations do not necessarily appear at the end of the\nresults.",
-          "request": {
-            "$ref": "SearchOrganizationsRequest"
-          },
-          "flatPath": "v1/organizations:search",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/organizations:search",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
-        "setIamPolicy": {
-          "id": "cloudresourcemanager.organizations.setIamPolicy",
-          "response": {
-            "$ref": "Policy"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
-          "description": "Sets the access control policy on an Organization resource. Replaces any\nexisting policy. The `resource` field should be the organization's resource\nname, e.g. \"organizations/123\".",
-          "request": {
-            "$ref": "SetIamPolicyRequest"
-          },
-          "flatPath": "v1/organizations/{organizationsId}:setIamPolicy",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "pattern": "^organizations/[^/]+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/{+resource}:setIamPolicy",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "getIamPolicy": {
-          "id": "cloudresourcemanager.organizations.getIamPolicy",
-          "response": {
-            "$ref": "Policy"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
-          "description": "Gets the access control policy for an Organization resource. May be empty\nif no such policy or resource exists. The `resource` field should be the\norganization's resource name, e.g. \"organizations/123\".",
-          "request": {
-            "$ref": "GetIamPolicyRequest"
-          },
-          "flatPath": "v1/organizations/{organizationsId}:getIamPolicy",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "pattern": "^organizations/[^/]+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/{+resource}:getIamPolicy",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        }
-      }
-    },
-    "projects": {
-      "methods": {
-        "getAncestry": {
-          "id": "cloudresourcemanager.projects.getAncestry",
-          "response": {
-            "$ref": "GetAncestryResponse"
-          },
-          "parameterOrder": [
-            "projectId"
-          ],
-          "description": "Gets a list of ancestors in the resource hierarchy for the Project\nidentified by the specified `project_id` (for example, `my-project-123`).\n\nThe caller must have read permissions for this Project.",
-          "request": {
-            "$ref": "GetAncestryRequest"
-          },
-          "flatPath": "v1/projects/{projectId}:getAncestry",
-          "httpMethod": "POST",
-          "parameters": {
-            "projectId": {
-              "description": "The Project ID (for example, `my-project-123`).\n\nRequired.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/projects/{projectId}:getAncestry",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
-        "getIamPolicy": {
-          "id": "cloudresourcemanager.projects.getIamPolicy",
-          "response": {
-            "$ref": "Policy"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
-          "description": "Returns the IAM access control policy for the specified Project.\nPermission is denied if the policy or the resource does not exist.",
-          "request": {
-            "$ref": "GetIamPolicyRequest"
-          },
-          "flatPath": "v1/projects/{resource}:getIamPolicy",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/projects/{resource}:getIamPolicy",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
-        "undelete": {
-          "id": "cloudresourcemanager.projects.undelete",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [
-            "projectId"
-          ],
-          "description": "Restores the Project identified by the specified\n`project_id` (for example, `my-project-123`).\nYou can only use this method for a Project that has a lifecycle state of\nDELETE_REQUESTED.\nAfter deletion starts, the Project cannot be restored.\n\nThe caller must have modify permissions for this Project.",
-          "request": {
-            "$ref": "UndeleteProjectRequest"
-          },
-          "flatPath": "v1/projects/{projectId}:undelete",
-          "httpMethod": "POST",
-          "parameters": {
-            "projectId": {
-              "description": "The project ID (for example, `foo-bar-123`).\n\nRequired.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/projects/{projectId}:undelete",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "list": {
-          "id": "cloudresourcemanager.projects.list",
-          "response": {
-            "$ref": "ListProjectsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Lists Projects that are visible to the user and satisfy the\nspecified filter. This method returns Projects in an unspecified order.\nNew Projects do not necessarily appear at the end of the list.",
-          "flatPath": "v1/projects",
-          "httpMethod": "GET",
-          "parameters": {
-            "pageSize": {
-              "description": "The maximum number of Projects to return in the response.\nThe server can return fewer Projects than requested.\nIf unspecified, server picks an appropriate default.\n\nOptional.",
-              "location": "query",
-              "type": "integer",
-              "format": "int32"
-            },
-            "filter": {
-              "description": "An expression for filtering the results of the request.  Filter rules are\ncase insensitive. The fields eligible for filtering are:\n\n+ `name`\n+ `id`\n+ \u003ccode\u003elabels.\u003cem\u003ekey\u003c/em\u003e\u003c/code\u003e where *key* is the name of a label\n\nSome examples of using labels as filters:\n\n|Filter|Description|\n|------|-----------|\n|name:*|The project has a name.|\n|name:Howl|The project's name is `Howl` or `howl`.|\n|name:HOWL|Equivalent to above.|\n|NAME:howl|Equivalent to above.|\n|labels.color:*|The project has the label `color`.|\n|labels.color:red|The project's label `color` has the value `red`.|\n|labels.color:red&nbsp;label.size:big|The project's label `color` has the\nvalue `red` and its label `size` has the value `big`.\n\nOptional.",
-              "location": "query",
-              "type": "string"
-            },
-            "pageToken": {
-              "description": "A pagination token returned from a previous call to ListProjects\nthat indicates from where listing should continue.\n\nOptional.",
-              "location": "query",
-              "type": "string"
-            }
-          },
-          "path": "v1/projects",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
-        "get": {
-          "id": "cloudresourcemanager.projects.get",
-          "response": {
-            "$ref": "Project"
-          },
-          "parameterOrder": [
-            "projectId"
-          ],
-          "description": "Retrieves the Project identified by the specified\n`project_id` (for example, `my-project-123`).\n\nThe caller must have read permissions for this Project.",
-          "flatPath": "v1/projects/{projectId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "projectId": {
-              "description": "The Project ID (for example, `my-project-123`).\n\nRequired.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/projects/{projectId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
-        "update": {
-          "id": "cloudresourcemanager.projects.update",
-          "response": {
-            "$ref": "Project"
-          },
-          "parameterOrder": [
-            "projectId"
-          ],
-          "description": "Updates the attributes of the Project identified by the specified\n`project_id` (for example, `my-project-123`).\n\nThe caller must have modify permissions for this Project.",
-          "request": {
-            "$ref": "Project"
-          },
-          "flatPath": "v1/projects/{projectId}",
-          "httpMethod": "PUT",
-          "parameters": {
-            "projectId": {
-              "description": "The project ID (for example, `my-project-123`).\n\nRequired.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/projects/{projectId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "create": {
-          "id": "cloudresourcemanager.projects.create",
-          "response": {
-            "$ref": "Operation"
-          },
-          "parameterOrder": [],
-          "description": "Request that a new Project be created. The result is an Operation which\ncan be used to track the creation process. It is automatically deleted\nafter a few hours, so there is no need to call DeleteOperation.\n\nOur SLO permits Project creation to take up to 30 seconds at the 90th\npercentile. As of 2016-08-29, we are observing 6 seconds 50th percentile\nlatency. 95th percentile latency is around 11 seconds. We recommend\npolling at the 5th second with an exponential backoff.",
-          "request": {
-            "$ref": "Project"
-          },
-          "flatPath": "v1/projects",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/projects",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "setIamPolicy": {
-          "id": "cloudresourcemanager.projects.setIamPolicy",
-          "response": {
-            "$ref": "Policy"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
-          "description": "Sets the IAM access control policy for the specified Project. Replaces\nany existing policy.\n\nThe following constraints apply when using `setIamPolicy()`:\n\n+ Project does not support `allUsers` and `allAuthenticatedUsers` as\n`members` in a `Binding` of a `Policy`.\n\n+ The owner role can be granted only to `user` and `serviceAccount`.\n\n+ Service accounts can be made owners of a project directly\nwithout any restrictions. However, to be added as an owner, a user must be\ninvited via Cloud Platform console and must accept the invitation.\n\n+ A user cannot be granted the owner role using `setIamPolicy()`. The user\nmust be granted the owner role using the Cloud Platform Console and must\nexplicitly accept the invitation.\n\n+ Invitations to grant the owner role cannot be sent using\n`setIamPolicy()`;\nthey must be sent only using the Cloud Platform Console.\n\n+ Membership changes that leave the project without any owners that have\naccepted the Terms of Service (ToS) will be rejected.\n\n+ There must be at least one owner who has accepted the Terms of\nService (ToS) agreement in the policy. Calling `setIamPolicy()` to\nto remove the last ToS-accepted owner from the policy will fail. This\nrestriction also applies to legacy projects that no longer have owners\nwho have accepted the ToS. Edits to IAM policies will be rejected until\nthe lack of a ToS-accepting owner is rectified.\n\n+ Calling this method requires enabling the App Engine Admin API.\n\nNote: Removing service accounts from policies or changing their roles\ncan render services completely inoperable. It is important to understand\nhow the service account is being used before removing or updating its\nroles.",
-          "request": {
-            "$ref": "SetIamPolicyRequest"
-          },
-          "flatPath": "v1/projects/{resource}:setIamPolicy",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/projects/{resource}:setIamPolicy",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "delete": {
-          "id": "cloudresourcemanager.projects.delete",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [
-            "projectId"
-          ],
-          "description": "Marks the Project identified by the specified\n`project_id` (for example, `my-project-123`) for deletion.\nThis method will only affect the Project if the following criteria are met:\n\n+ The Project does not have a billing account associated with it.\n+ The Project has a lifecycle state of\nACTIVE.\n\nThis method changes the Project's lifecycle state from\nACTIVE\nto DELETE_REQUESTED.\nThe deletion starts at an unspecified time,\nat which point the Project is no longer accessible.\n\nUntil the deletion completes, you can check the lifecycle state\nchecked by retrieving the Project with GetProject,\nand the Project remains visible to ListProjects.\nHowever, you cannot update the project.\n\nAfter the deletion completes, the Project is not retrievable by\nthe  GetProject and\nListProjects methods.\n\nThe caller must have modify permissions for this Project.",
-          "flatPath": "v1/projects/{projectId}",
-          "httpMethod": "DELETE",
-          "parameters": {
-            "projectId": {
-              "description": "The Project ID (for example, `foo-bar-123`).\n\nRequired.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/projects/{projectId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "testIamPermissions": {
-          "id": "cloudresourcemanager.projects.testIamPermissions",
-          "response": {
-            "$ref": "TestIamPermissionsResponse"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
-          "description": "Returns permissions that a caller has on the specified Project.",
-          "request": {
-            "$ref": "TestIamPermissionsRequest"
-          },
-          "flatPath": "v1/projects/{resource}:testIamPermissions",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/projects/{resource}:testIamPermissions",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
+          "id": "cloudresourcemanager.organizations.get",
+          "description": "Fetches an Organization resource identified by the specified resource name."
         }
       }
     },
     "operations": {
       "methods": {
         "get": {
+          "parameters": {
+            "name": {
+              "pattern": "^operations/.+$",
+              "location": "path",
+              "description": "The name of the operation resource.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "flatPath": "v1/operations/{operationsId}",
           "id": "cloudresourcemanager.operations.get",
+          "path": "v1/{+name}",
+          "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice.",
+          "httpMethod": "GET",
           "response": {
             "$ref": "Operation"
           },
           "parameterOrder": [
             "name"
+          ]
+        }
+      }
+    },
+    "projects": {
+      "methods": {
+        "update": {
+          "httpMethod": "PUT",
+          "parameterOrder": [
+            "projectId"
           ],
-          "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice.",
-          "flatPath": "v1/operations/{operationsId}",
-          "httpMethod": "GET",
+          "response": {
+            "$ref": "Project"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
           "parameters": {
-            "name": {
-              "description": "The name of the operation resource.",
+            "projectId": {
               "required": true,
-              "pattern": "^operations/.+$",
+              "type": "string",
               "location": "path",
-              "type": "string"
+              "description": "The project ID (for example, `my-project-123`).\n\nRequired."
             }
           },
-          "path": "v1/{+name}",
+          "flatPath": "v1/projects/{projectId}",
+          "id": "cloudresourcemanager.projects.update",
+          "path": "v1/projects/{projectId}",
+          "description": "Updates the attributes of the Project identified by the specified\n`project_id` (for example, `my-project-123`).\n\nThe caller must have modify permissions for this Project.",
+          "request": {
+            "$ref": "Project"
+          }
+        },
+        "getAncestry": {
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "projectId"
+          ],
+          "response": {
+            "$ref": "GetAncestryResponse"
+          },
+          "parameters": {
+            "projectId": {
+              "description": "The Project ID (for example, `my-project-123`).\n\nRequired.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
+          ],
+          "flatPath": "v1/projects/{projectId}:getAncestry",
+          "id": "cloudresourcemanager.projects.getAncestry",
+          "path": "v1/projects/{projectId}:getAncestry",
+          "request": {
+            "$ref": "GetAncestryRequest"
+          },
+          "description": "Gets a list of ancestors in the resource hierarchy for the Project\nidentified by the specified `project_id` (for example, `my-project-123`).\n\nThe caller must have read permissions for this Project."
+        },
+        "testIamPermissions": {
+          "description": "Returns permissions that a caller has on the specified Project.",
+          "request": {
+            "$ref": "TestIamPermissionsRequest"
+          },
+          "response": {
+            "$ref": "TestIamPermissionsResponse"
+          },
+          "parameterOrder": [
+            "resource"
+          ],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "parameters": {
+            "resource": {
+              "location": "path",
+              "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1/projects/{resource}:testIamPermissions",
+          "path": "v1/projects/{resource}:testIamPermissions",
+          "id": "cloudresourcemanager.projects.testIamPermissions"
+        },
+        "delete": {
+          "httpMethod": "DELETE",
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameterOrder": [
+            "projectId"
+          ],
+          "parameters": {
+            "projectId": {
+              "location": "path",
+              "description": "The Project ID (for example, `foo-bar-123`).\n\nRequired.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "flatPath": "v1/projects/{projectId}",
+          "id": "cloudresourcemanager.projects.delete",
+          "path": "v1/projects/{projectId}",
+          "description": "Marks the Project identified by the specified\n`project_id` (for example, `my-project-123`) for deletion.\nThis method will only affect the Project if the following criteria are met:\n\n+ The Project does not have a billing account associated with it.\n+ The Project has a lifecycle state of\nACTIVE.\n\nThis method changes the Project's lifecycle state from\nACTIVE\nto DELETE_REQUESTED.\nThe deletion starts at an unspecified time,\nat which point the Project is no longer accessible.\n\nUntil the deletion completes, you can check the lifecycle state\nchecked by retrieving the Project with GetProject,\nand the Project remains visible to ListProjects.\nHowever, you cannot update the project.\n\nAfter the deletion completes, the Project is not retrievable by\nthe  GetProject and\nListProjects methods.\n\nThe caller must have modify permissions for this Project."
+        },
+        "list": {
+          "description": "Lists Projects that are visible to the user and satisfy the\nspecified filter. This method returns Projects in an unspecified order.\nNew Projects do not necessarily appear at the end of the list.",
+          "httpMethod": "GET",
+          "response": {
+            "$ref": "ListProjectsResponse"
+          },
+          "parameterOrder": [],
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "parameters": {
+            "filter": {
+              "description": "An expression for filtering the results of the request.  Filter rules are\ncase insensitive. The fields eligible for filtering are:\n\n+ `name`\n+ `id`\n+ \u003ccode\u003elabels.\u003cem\u003ekey\u003c/em\u003e\u003c/code\u003e where *key* is the name of a label\n\nSome examples of using labels as filters:\n\n|Filter|Description|\n|------|-----------|\n|name:*|The project has a name.|\n|name:Howl|The project's name is `Howl` or `howl`.|\n|name:HOWL|Equivalent to above.|\n|NAME:howl|Equivalent to above.|\n|labels.color:*|The project has the label `color`.|\n|labels.color:red|The project's label `color` has the value `red`.|\n|labels.color:red&nbsp;label.size:big|The project's label `color` has the\nvalue `red` and its label `size` has the value `big`.\n\nOptional.",
+              "type": "string",
+              "location": "query"
+            },
+            "pageToken": {
+              "location": "query",
+              "description": "A pagination token returned from a previous call to ListProjects\nthat indicates from where listing should continue.\n\nOptional.",
+              "type": "string"
+            },
+            "pageSize": {
+              "description": "The maximum number of Projects to return in the response.\nThe server can return fewer Projects than requested.\nIf unspecified, server picks an appropriate default.\n\nOptional.",
+              "format": "int32",
+              "type": "integer",
+              "location": "query"
+            }
+          },
+          "flatPath": "v1/projects",
+          "id": "cloudresourcemanager.projects.list",
+          "path": "v1/projects"
+        },
+        "setIamPolicy": {
+          "description": "Sets the IAM access control policy for the specified Project. Replaces\nany existing policy.\n\nThe following constraints apply when using `setIamPolicy()`:\n\n+ Project does not support `allUsers` and `allAuthenticatedUsers` as\n`members` in a `Binding` of a `Policy`.\n\n+ The owner role can be granted only to `user` and `serviceAccount`.\n\n+ Service accounts can be made owners of a project directly\nwithout any restrictions. However, to be added as an owner, a user must be\ninvited via Cloud Platform console and must accept the invitation.\n\n+ A user cannot be granted the owner role using `setIamPolicy()`. The user\nmust be granted the owner role using the Cloud Platform Console and must\nexplicitly accept the invitation.\n\n+ Invitations to grant the owner role cannot be sent using\n`setIamPolicy()`;\nthey must be sent only using the Cloud Platform Console.\n\n+ Membership changes that leave the project without any owners that have\naccepted the Terms of Service (ToS) will be rejected.\n\n+ There must be at least one owner who has accepted the Terms of\nService (ToS) agreement in the policy. Calling `setIamPolicy()` to\nto remove the last ToS-accepted owner from the policy will fail. This\nrestriction also applies to legacy projects that no longer have owners\nwho have accepted the ToS. Edits to IAM policies will be rejected until\nthe lack of a ToS-accepting owner is rectified.\n\n+ Calling this method requires enabling the App Engine Admin API.\n\nNote: Removing service accounts from policies or changing their roles\ncan render services completely inoperable. It is important to understand\nhow the service account is being used before removing or updating its\nroles.",
+          "request": {
+            "$ref": "SetIamPolicyRequest"
+          },
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "resource"
+          ],
+          "response": {
+            "$ref": "Policy"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "resource": {
+              "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "flatPath": "v1/projects/{resource}:setIamPolicy",
+          "id": "cloudresourcemanager.projects.setIamPolicy",
+          "path": "v1/projects/{resource}:setIamPolicy"
+        },
+        "create": {
+          "description": "Request that a new Project be created. The result is an Operation which\ncan be used to track the creation process. It is automatically deleted\nafter a few hours, so there is no need to call DeleteOperation.\n\nOur SLO permits Project creation to take up to 30 seconds at the 90th\npercentile. As of 2016-08-29, we are observing 6 seconds 50th percentile\nlatency. 95th percentile latency is around 11 seconds. We recommend\npolling at the 5th second with an exponential backoff.",
+          "request": {
+            "$ref": "Project"
+          },
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {},
+          "flatPath": "v1/projects",
+          "id": "cloudresourcemanager.projects.create",
+          "path": "v1/projects"
+        },
+        "getIamPolicy": {
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "resource"
+          ],
+          "response": {
+            "$ref": "Policy"
+          },
+          "parameters": {
+            "resource": {
+              "location": "path",
+              "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "flatPath": "v1/projects/{resource}:getIamPolicy",
+          "id": "cloudresourcemanager.projects.getIamPolicy",
+          "path": "v1/projects/{resource}:getIamPolicy",
+          "request": {
+            "$ref": "GetIamPolicyRequest"
+          },
+          "description": "Returns the IAM access control policy for the specified Project.\nPermission is denied if the policy or the resource does not exist."
+        },
+        "get": {
+          "flatPath": "v1/projects/{projectId}",
+          "path": "v1/projects/{projectId}",
+          "id": "cloudresourcemanager.projects.get",
+          "description": "Retrieves the Project identified by the specified\n`project_id` (for example, `my-project-123`).\n\nThe caller must have read permissions for this Project.",
+          "response": {
+            "$ref": "Project"
+          },
+          "parameterOrder": [
+            "projectId"
+          ],
+          "httpMethod": "GET",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "parameters": {
+            "projectId": {
+              "location": "path",
+              "description": "The Project ID (for example, `my-project-123`).\n\nRequired.",
+              "required": true,
+              "type": "string"
+            }
+          }
+        },
+        "undelete": {
+          "description": "Restores the Project identified by the specified\n`project_id` (for example, `my-project-123`).\nYou can only use this method for a Project that has a lifecycle state of\nDELETE_REQUESTED.\nAfter deletion starts, the Project cannot be restored.\n\nThe caller must have modify permissions for this Project.",
+          "request": {
+            "$ref": "UndeleteProjectRequest"
+          },
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameterOrder": [
+            "projectId"
+          ],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "projectId": {
+              "location": "path",
+              "description": "The project ID (for example, `foo-bar-123`).\n\nRequired.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1/projects/{projectId}:undelete",
+          "path": "v1/projects/{projectId}:undelete",
+          "id": "cloudresourcemanager.projects.undelete"
         }
       }
     }
   },
+  "parameters": {
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "fields": {
+      "type": "string",
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response."
+    },
+    "uploadType": {
+      "type": "string",
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\")."
+    },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "alt": {
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json"
+    },
+    "key": {
+      "type": "string",
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token."
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string",
+      "location": "query"
+    },
+    "pp": {
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    },
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
+    }
+  },
   "schemas": {
-    "FolderOperationError": {
-      "description": "A classification of the Folder Operation error.",
+    "SearchOrganizationsRequest": {
+      "description": "The request sent to the `SearchOrganizations` method.",
       "type": "object",
       "properties": {
-        "errorMessageId": {
-          "description": "The type of operation error experienced.",
-          "enum": [
-            "ERROR_TYPE_UNSPECIFIED",
-            "FOLDER_HEIGHT_VIOLATION",
-            "MAX_CHILD_FOLDERS_VIOLATION",
-            "FOLDER_NAME_UNIQUENESS_VIOLATION",
-            "RESOURCE_DELETED",
-            "PARENT_DELETED",
-            "CYCLE_INTRODUCED_ERROR",
-            "FOLDER_ALREADY_BEING_MOVED",
-            "FOLDER_TO_DELETE_NON_EMPTY"
-          ],
-          "enumDescriptions": [
-            "The error type was unrecognized or unspecified.",
-            "The attempted action would violate the max folder depth constraint.",
-            "The attempted action would violate the max child folders constraint.",
-            "The attempted action would violate the locally-unique folder\ndisplay_name constraint.",
-            "The resource being moved has been deleted.",
-            "The resource a folder was being added to has been deleted.",
-            "The attempted action would introduce cycle in resource path.",
-            "The attempted action would move a folder that is already being moved.",
-            "The folder the caller is trying to delete contains active resources."
-          ],
-          "type": "string"
-        }
-      },
-      "id": "FolderOperationError"
-    },
-    "Status": {
-      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
-      "type": "object",
-      "properties": {
-        "code": {
-          "description": "The status code, which should be an enum value of google.rpc.Code.",
-          "type": "integer",
-          "format": "int32"
+        "pageSize": {
+          "description": "The maximum number of Organizations to return in the response.\nThis field is optional.",
+          "format": "int32",
+          "type": "integer"
         },
-        "details": {
-          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
-          "type": "array",
-          "items": {
-            "additionalProperties": {
-              "description": "Properties of the object. Contains field @type with type URL.",
-              "type": "any"
-            },
-            "type": "object"
-          }
-        },
-        "message": {
-          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
-          "type": "string"
-        }
-      },
-      "id": "Status"
-    },
-    "ListProjectsResponse": {
-      "description": "A page of the response received from the\nListProjects\nmethod.\n\nA paginated response where more pages are available has\n`next_page_token` set. This token can be used in a subsequent request to\nretrieve the next request page.",
-      "type": "object",
-      "properties": {
-        "projects": {
-          "description": "The list of Projects that matched the list filter. This list can\nbe paginated.",
-          "type": "array",
-          "items": {
-            "$ref": "Project"
-          }
-        },
-        "nextPageToken": {
-          "description": "Pagination token.\n\nIf the result set is too large to fit in a single response, this token\nis returned. It encodes the position of the current result cursor.\nFeeding this value into a new list request with the `page_token` parameter\ngives the next page of the results.\n\nWhen `next_page_token` is not filled in, there is no next page and\nthe list returned is the last page in the result set.\n\nPagination tokens have a limited lifetime.",
-          "type": "string"
-        }
-      },
-      "id": "ListProjectsResponse"
-    },
-    "UndeleteProjectRequest": {
-      "description": "The request sent to the UndeleteProject\nmethod.",
-      "type": "object",
-      "properties": {},
-      "id": "UndeleteProjectRequest"
-    },
-    "FolderOperation": {
-      "description": "Metadata describing a long running folder operation",
-      "type": "object",
-      "properties": {
-        "displayName": {
-          "description": "The display name of the folder.",
-          "type": "string"
-        },
-        "sourceParent": {
-          "description": "The resource name of the folder's parent.\nOnly applicable when the operation_type is MOVE.",
-          "type": "string"
-        },
-        "destinationParent": {
-          "description": "The resource name of the folder or organization we are either creating\nthe folder under or moving the folder to.",
-          "type": "string"
-        },
-        "operationType": {
-          "description": "The type of this operation.",
-          "enum": [
-            "OPERATION_TYPE_UNSPECIFIED",
-            "CREATE",
-            "MOVE"
-          ],
-          "enumDescriptions": [
-            "Operation type not specified.",
-            "A create folder operation.",
-            "A move folder operation."
-          ],
-          "type": "string"
-        }
-      },
-      "id": "FolderOperation"
-    },
-    "Operation": {
-      "description": "This resource represents a long-running operation that is the result of a\nnetwork API call.",
-      "type": "object",
-      "properties": {
-        "error": {
-          "description": "The error result of the operation in case of failure or cancellation.",
-          "$ref": "Status"
-        },
-        "done": {
-          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
-          "type": "boolean"
-        },
-        "metadata": {
-          "description": "Service-specific metadata associated with the operation.  It typically\ncontains progress information and common metadata such as create time.\nSome services might not provide such metadata.  Any method that returns a\nlong-running operation should document the metadata type, if any.",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        },
-        "response": {
-          "description": "The normal response of the operation in case of success.  If the original\nmethod returns no data on success, such as `Delete`, the response is\n`google.protobuf.Empty`.  If the original method is standard\n`Get`/`Create`/`Update`, the response should be the resource.  For other\nmethods, the response should have the type `XxxResponse`, where `Xxx`\nis the original method name.  For example, if the original method name\nis `TakeSnapshot()`, the inferred response type is\n`TakeSnapshotResponse`.",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        },
-        "name": {
-          "description": "The server-assigned name, which is only unique within the same service that\noriginally returns it. If you use the default HTTP mapping, the\n`name` should have the format of `operations/some/unique/name`.",
-          "type": "string"
-        }
-      },
-      "id": "Operation"
-    },
-    "GetIamPolicyRequest": {
-      "description": "Request message for `GetIamPolicy` method.",
-      "type": "object",
-      "properties": {},
-      "id": "GetIamPolicyRequest"
-    },
-    "SetIamPolicyRequest": {
-      "description": "Request message for `SetIamPolicy` method.",
-      "type": "object",
-      "properties": {
-        "policy": {
-          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them.",
-          "$ref": "Policy"
-        }
-      },
-      "id": "SetIamPolicyRequest"
-    },
-    "TestIamPermissionsResponse": {
-      "description": "Response message for `TestIamPermissions` method.",
-      "type": "object",
-      "properties": {
-        "permissions": {
-          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "TestIamPermissionsResponse"
-    },
-    "Organization": {
-      "description": "The root node in the resource hierarchy to which a particular entity's\n(e.g., company) resources belong.",
-      "type": "object",
-      "properties": {
-        "displayName": {
-          "description": "A friendly string to be used to refer to the Organization in the UI.\nAssigned by the server, set to the firm name of the Google For Work\ncustomer that owns this organization.\n@OutputOnly",
-          "type": "string"
-        },
-        "creationTime": {
-          "description": "Timestamp when the Organization was created. Assigned by the server.\n@OutputOnly",
+        "filter": {
           "type": "string",
+          "description": "An optional query string used to filter the Organizations to return in\nthe response. Filter rules are case-insensitive.\n\n\nOrganizations may be filtered by `owner.directoryCustomerId` or by\n`domain`, where the domain is a Google for Work domain, for example:\n\n|Filter|Description|\n|------|-----------|\n|owner.directorycustomerid:123456789|Organizations with\n`owner.directory_customer_id` equal to `123456789`.|\n|domain:google.com|Organizations corresponding to the domain `google.com`.|\n\nThis field is optional."
+        },
+        "pageToken": {
+          "description": "A pagination token returned from a previous call to `SearchOrganizations`\nthat indicates from where listing should continue.\nThis field is optional.",
+          "type": "string"
+        }
+      },
+      "id": "SearchOrganizationsRequest"
+    },
+    "GetAncestryRequest": {
+      "description": "The request sent to the\nGetAncestry\nmethod.",
+      "type": "object",
+      "properties": {},
+      "id": "GetAncestryRequest"
+    },
+    "Project": {
+      "type": "object",
+      "properties": {
+        "parent": {
+          "$ref": "ResourceId",
+          "description": "An optional reference to a parent Resource.\n\nThe only supported parent type is \"organization\". Once set, the parent\ncannot be modified. The `parent` can be set on creation or using the\n`UpdateProject` method; the end user must have the\n`resourcemanager.projects.create` permission on the parent.\n\nRead-write."
+        },
+        "createTime": {
+          "type": "string",
+          "description": "Creation time.\n\nRead-only.",
           "format": "google-datetime"
         },
-        "owner": {
-          "description": "The owner of this Organization. The owner should be specified on\ncreation. Once set, it cannot be changed.\nThis field is required.",
-          "$ref": "OrganizationOwner"
+        "labels": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "The labels associated with this Project.\n\nLabel keys must be between 1 and 63 characters long and must conform\nto the following regular expression: \\[a-z\\](\\[-a-z0-9\\]*\\[a-z0-9\\])?.\n\nLabel values must be between 0 and 63 characters long and must conform\nto the regular expression (\\[a-z\\](\\[-a-z0-9\\]*\\[a-z0-9\\])?)?.\n\nNo more than 256 labels can be associated with a given resource.\n\nClients should store labels in a representation such as JSON that does not\ndepend on specific characters being disallowed.\n\nExample: \u003ccode\u003e\"environment\" : \"dev\"\u003c/code\u003e\nRead-write."
+        },
+        "name": {
+          "description": "The user-assigned display name of the Project.\nIt must be 4 to 30 characters.\nAllowed characters are: lowercase and uppercase letters, numbers,\nhyphen, single-quote, double-quote, space, and exclamation point.\n\nExample: \u003ccode\u003eMy Project\u003c/code\u003e\nRead-write.",
+          "type": "string"
+        },
+        "projectId": {
+          "type": "string",
+          "description": "The unique, user-assigned ID of the Project.\nIt must be 6 to 30 lowercase letters, digits, or hyphens.\nIt must start with a letter.\nTrailing hyphens are prohibited.\n\nExample: \u003ccode\u003etokyo-rain-123\u003c/code\u003e\nRead-only after creation."
         },
         "lifecycleState": {
-          "description": "The organization's current lifecycle state. Assigned by the server.\n@OutputOnly",
+          "description": "The Project lifecycle state.\n\nRead-only.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified state.  This is only used/useful for distinguishing\nunset values.",
+            "The normal and active state.",
+            "The project has been marked for deletion by the user\n(by invoking\nDeleteProject)\nor by the system (Google Cloud Platform).\nThis can generally be reversed by invoking UndeleteProject.",
+            "This lifecycle state is no longer used and not returned by the API."
+          ],
           "enum": [
             "LIFECYCLE_STATE_UNSPECIFIED",
             "ACTIVE",
-            "DELETE_REQUESTED"
-          ],
-          "enumDescriptions": [
-            "Unspecified state.  This is only useful for distinguishing unset values.",
-            "The normal and active state.",
-            "The organization has been marked for deletion by the user."
-          ],
-          "type": "string"
+            "DELETE_REQUESTED",
+            "DELETE_IN_PROGRESS"
+          ]
         },
-        "name": {
-          "description": "Output Only. The resource name of the organization. This is the\norganization's relative path in the API. Its format is\n\"organizations/[organization_id]\". For example, \"organizations/1234\".",
+        "projectNumber": {
+          "description": "The number uniquely identifying the project.\n\nExample: \u003ccode\u003e415104041262\u003c/code\u003e\nRead-only.",
+          "format": "int64",
           "type": "string"
         }
       },
-      "id": "Organization"
+      "id": "Project",
+      "description": "A Project is a high-level Google Cloud Platform entity.  It is a\ncontainer for ACLs, APIs, AppEngine Apps, VMs, and other\nGoogle Cloud Platform resources."
     },
-    "Policy": {
-      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
+    "SearchOrganizationsResponse": {
+      "description": "The response returned from the `SearchOrganizations` method.",
       "type": "object",
       "properties": {
-        "bindings": {
-          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
+        "nextPageToken": {
+          "description": "A pagination token to be used to retrieve the next page of results. If the\nresult is too large to fit within the page size specified in the request,\nthis field will be set with a token that can be used to fetch the next page\nof results. If this field is empty, it indicates that this response\ncontains the last page of results.",
+          "type": "string"
+        },
+        "organizations": {
+          "description": "The list of Organizations that matched the search query, possibly\npaginated.",
           "type": "array",
           "items": {
-            "$ref": "Binding"
+            "$ref": "Organization"
           }
-        },
-        "etag": {
-          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
-          "type": "string",
-          "format": "byte"
-        },
-        "version": {
-          "description": "Version of the `Policy`. The default version is 0.",
-          "type": "integer",
-          "format": "int32"
         }
       },
-      "id": "Policy"
-    },
-    "ProjectCreationStatus": {
-      "description": "A status object which is used as the `metadata` field for the Operation\nreturned by CreateProject. It provides insight for when significant phases of\nProject creation have completed.",
-      "type": "object",
-      "properties": {
-        "ready": {
-          "description": "True if the project creation process is complete.",
-          "type": "boolean"
-        },
-        "gettable": {
-          "description": "True if the project can be retrieved using GetProject. No other operations\non the project are guaranteed to work until the project creation is\ncomplete.",
-          "type": "boolean"
-        },
-        "createTime": {
-          "description": "Creation time of the project creation workflow.",
-          "type": "string",
-          "format": "google-datetime"
-        }
-      },
-      "id": "ProjectCreationStatus"
+      "id": "SearchOrganizationsResponse"
     },
     "TestIamPermissionsRequest": {
       "description": "Request message for `TestIamPermissions` method.",
@@ -731,80 +637,95 @@
       },
       "id": "TestIamPermissionsRequest"
     },
-    "GetAncestryRequest": {
-      "description": "The request sent to the\nGetAncestry\nmethod.",
-      "type": "object",
-      "properties": {},
-      "id": "GetAncestryRequest"
-    },
-    "GetAncestryResponse": {
-      "description": "Response from the GetAncestry method.",
+    "Policy": {
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
       "type": "object",
       "properties": {
-        "ancestor": {
-          "description": "Ancestors are ordered from bottom to top of the resource hierarchy. The\nfirst ancestor is the project itself, followed by the project's parent,\netc.",
+        "etag": {
+          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
+          "format": "byte",
+          "type": "string"
+        },
+        "version": {
+          "description": "Version of the `Policy`. The default version is 0.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "bindings": {
+          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
           "type": "array",
           "items": {
-            "$ref": "Ancestor"
+            "$ref": "Binding"
           }
         }
       },
-      "id": "GetAncestryResponse"
+      "id": "Policy"
     },
-    "SearchOrganizationsResponse": {
-      "description": "The response returned from the `SearchOrganizations` method.",
+    "FolderOperation": {
       "type": "object",
       "properties": {
-        "organizations": {
-          "description": "The list of Organizations that matched the search query, possibly\npaginated.",
-          "type": "array",
-          "items": {
-            "$ref": "Organization"
-          }
+        "displayName": {
+          "description": "The display name of the folder.",
+          "type": "string"
         },
-        "nextPageToken": {
-          "description": "A pagination token to be used to retrieve the next page of results. If the\nresult is too large to fit within the page size specified in the request,\nthis field will be set with a token that can be used to fetch the next page\nof results. If this field is empty, it indicates that this response\ncontains the last page of results.",
+        "sourceParent": {
+          "description": "The resource name of the folder's parent.\nOnly applicable when the operation_type is MOVE.",
+          "type": "string"
+        },
+        "destinationParent": {
+          "description": "The resource name of the folder or organization we are either creating\nthe folder under or moving the folder to.",
+          "type": "string"
+        },
+        "operationType": {
+          "enum": [
+            "OPERATION_TYPE_UNSPECIFIED",
+            "CREATE",
+            "MOVE"
+          ],
+          "description": "The type of this operation.",
+          "type": "string",
+          "enumDescriptions": [
+            "Operation type not specified.",
+            "A create folder operation.",
+            "A move folder operation."
+          ]
+        }
+      },
+      "id": "FolderOperation",
+      "description": "Metadata describing a long running folder operation"
+    },
+    "FolderOperationError": {
+      "description": "A classification of the Folder Operation error.",
+      "type": "object",
+      "properties": {
+        "errorMessageId": {
+          "enumDescriptions": [
+            "The error type was unrecognized or unspecified.",
+            "The attempted action would violate the max folder depth constraint.",
+            "The attempted action would violate the max child folders constraint.",
+            "The attempted action would violate the locally-unique folder\ndisplay_name constraint.",
+            "The resource being moved has been deleted.",
+            "The resource a folder was being added to has been deleted.",
+            "The attempted action would introduce cycle in resource path.",
+            "The attempted action would move a folder that is already being moved.",
+            "The folder the caller is trying to delete contains active resources."
+          ],
+          "enum": [
+            "ERROR_TYPE_UNSPECIFIED",
+            "FOLDER_HEIGHT_VIOLATION",
+            "MAX_CHILD_FOLDERS_VIOLATION",
+            "FOLDER_NAME_UNIQUENESS_VIOLATION",
+            "RESOURCE_DELETED",
+            "PARENT_DELETED",
+            "CYCLE_INTRODUCED_ERROR",
+            "FOLDER_ALREADY_BEING_MOVED",
+            "FOLDER_TO_DELETE_NON_EMPTY"
+          ],
+          "description": "The type of operation error experienced.",
           "type": "string"
         }
       },
-      "id": "SearchOrganizationsResponse"
-    },
-    "SearchOrganizationsRequest": {
-      "description": "The request sent to the `SearchOrganizations` method.",
-      "type": "object",
-      "properties": {
-        "pageSize": {
-          "description": "The maximum number of Organizations to return in the response.\nThis field is optional.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "filter": {
-          "description": "An optional query string used to filter the Organizations to return in\nthe response. Filter rules are case-insensitive.\n\n\nOrganizations may be filtered by `owner.directoryCustomerId` or by\n`domain`, where the domain is a Google for Work domain, for example:\n\n|Filter|Description|\n|------|-----------|\n|owner.directorycustomerid:123456789|Organizations with\n`owner.directory_customer_id` equal to `123456789`.|\n|domain:google.com|Organizations corresponding to the domain `google.com`.|\n\nThis field is optional.",
-          "type": "string"
-        },
-        "pageToken": {
-          "description": "A pagination token returned from a previous call to `SearchOrganizations`\nthat indicates from where listing should continue.\nThis field is optional.",
-          "type": "string"
-        }
-      },
-      "id": "SearchOrganizationsRequest"
-    },
-    "Empty": {
-      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
-      "type": "object",
-      "properties": {},
-      "id": "Empty"
-    },
-    "Ancestor": {
-      "description": "Identifying information for a single ancestor of a project.",
-      "type": "object",
-      "properties": {
-        "resourceId": {
-          "description": "Resource id of the ancestor.",
-          "$ref": "ResourceId"
-        }
-      },
-      "id": "Ancestor"
+      "id": "FolderOperationError"
     },
     "ResourceId": {
       "description": "A container to reference an id for any resource type. A `resource` in Google\nCloud Platform is a generic term for something you (a developer) may want to\ninteract with through one of our API's. Some examples are an AppEngine app,\na Compute Engine instance, a Cloud SQL database, and so on.",
@@ -815,14 +736,97 @@
           "type": "string"
         },
         "id": {
-          "description": "Required field for the type-specific id. This should correspond to the id\nused in the type-specific API's.",
-          "type": "string"
+          "type": "string",
+          "description": "Required field for the type-specific id. This should correspond to the id\nused in the type-specific API's."
         }
       },
       "id": "ResourceId"
     },
+    "Operation": {
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "Service-specific metadata associated with the operation.  It typically\ncontains progress information and common metadata such as create time.\nSome services might not provide such metadata.  Any method that returns a\nlong-running operation should document the metadata type, if any.",
+          "type": "object"
+        },
+        "done": {
+          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
+          "type": "boolean"
+        },
+        "response": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "The normal response of the operation in case of success.  If the original\nmethod returns no data on success, such as `Delete`, the response is\n`google.protobuf.Empty`.  If the original method is standard\n`Get`/`Create`/`Update`, the response should be the resource.  For other\nmethods, the response should have the type `XxxResponse`, where `Xxx`\nis the original method name.  For example, if the original method name\nis `TakeSnapshot()`, the inferred response type is\n`TakeSnapshotResponse`.",
+          "type": "object"
+        },
+        "name": {
+          "description": "The server-assigned name, which is only unique within the same service that\noriginally returns it. If you use the default HTTP mapping, the\n`name` should have the format of `operations/some/unique/name`.",
+          "type": "string"
+        },
+        "error": {
+          "$ref": "Status",
+          "description": "The error result of the operation in case of failure or cancellation."
+        }
+      },
+      "id": "Operation",
+      "description": "This resource represents a long-running operation that is the result of a\nnetwork API call."
+    },
+    "Ancestor": {
+      "description": "Identifying information for a single ancestor of a project.",
+      "type": "object",
+      "properties": {
+        "resourceId": {
+          "$ref": "ResourceId",
+          "description": "Resource id of the ancestor."
+        }
+      },
+      "id": "Ancestor"
+    },
+    "SetIamPolicyRequest": {
+      "description": "Request message for `SetIamPolicy` method.",
+      "type": "object",
+      "properties": {
+        "policy": {
+          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them.",
+          "$ref": "Policy"
+        }
+      },
+      "id": "SetIamPolicyRequest"
+    },
+    "Status": {
+      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
+      "type": "object",
+      "properties": {
+        "code": {
+          "description": "The status code, which should be an enum value of google.rpc.Code.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "message": {
+          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
+          "type": "string"
+        },
+        "details": {
+          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
+          "type": "array",
+          "items": {
+            "additionalProperties": {
+              "description": "Properties of the object. Contains field @type with type URL.",
+              "type": "any"
+            },
+            "type": "object"
+          }
+        }
+      },
+      "id": "Status"
+    },
     "Binding": {
-      "description": "Associates `members` with a `role`.",
       "type": "object",
       "properties": {
         "members": {
@@ -837,62 +841,100 @@
           "type": "string"
         }
       },
-      "id": "Binding"
+      "id": "Binding",
+      "description": "Associates `members` with a `role`."
     },
-    "Project": {
-      "description": "A Project is a high-level Google Cloud Platform entity.  It is a\ncontainer for ACLs, APIs, AppEngine Apps, VMs, and other\nGoogle Cloud Platform resources.",
+    "Empty": {
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
+      "type": "object",
+      "properties": {},
+      "id": "Empty"
+    },
+    "Organization": {
+      "description": "The root node in the resource hierarchy to which a particular entity's\n(e.g., company) resources belong.",
       "type": "object",
       "properties": {
-        "parent": {
-          "description": "An optional reference to a parent Resource.\n\nThe only supported parent type is \"organization\". Once set, the parent\ncannot be modified. The `parent` can be set on creation or using the\n`UpdateProject` method; the end user must have the\n`resourcemanager.projects.create` permission on the parent.\n\nRead-write.",
-          "$ref": "ResourceId"
+        "creationTime": {
+          "description": "Timestamp when the Organization was created. Assigned by the server.\n@OutputOnly",
+          "format": "google-datetime",
+          "type": "string"
         },
-        "labels": {
-          "description": "The labels associated with this Project.\n\nLabel keys must be between 1 and 63 characters long and must conform\nto the following regular expression: \\[a-z\\](\\[-a-z0-9\\]*\\[a-z0-9\\])?.\n\nLabel values must be between 0 and 63 characters long and must conform\nto the regular expression (\\[a-z\\](\\[-a-z0-9\\]*\\[a-z0-9\\])?)?.\n\nNo more than 256 labels can be associated with a given resource.\n\nClients should store labels in a representation such as JSON that does not\ndepend on specific characters being disallowed.\n\nExample: \u003ccode\u003e\"environment\" : \"dev\"\u003c/code\u003e\nRead-write.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
+        "owner": {
+          "$ref": "OrganizationOwner",
+          "description": "The owner of this Organization. The owner should be specified on\ncreation. Once set, it cannot be changed.\nThis field is required."
         },
         "lifecycleState": {
-          "description": "The Project lifecycle state.\n\nRead-only.",
+          "description": "The organization's current lifecycle state. Assigned by the server.\n@OutputOnly",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified state.  This is only useful for distinguishing unset values.",
+            "The normal and active state.",
+            "The organization has been marked for deletion by the user."
+          ],
           "enum": [
             "LIFECYCLE_STATE_UNSPECIFIED",
             "ACTIVE",
-            "DELETE_REQUESTED",
-            "DELETE_IN_PROGRESS"
-          ],
-          "enumDescriptions": [
-            "Unspecified state.  This is only used/useful for distinguishing\nunset values.",
-            "The normal and active state.",
-            "The project has been marked for deletion by the user\n(by invoking\nDeleteProject)\nor by the system (Google Cloud Platform).\nThis can generally be reversed by invoking UndeleteProject.",
-            "This lifecycle state is no longer used and not returned by the API."
-          ],
-          "type": "string"
-        },
-        "createTime": {
-          "description": "Creation time.\n\nRead-only.",
-          "type": "string",
-          "format": "google-datetime"
+            "DELETE_REQUESTED"
+          ]
         },
         "name": {
-          "description": "The user-assigned display name of the Project.\nIt must be 4 to 30 characters.\nAllowed characters are: lowercase and uppercase letters, numbers,\nhyphen, single-quote, double-quote, space, and exclamation point.\n\nExample: \u003ccode\u003eMy Project\u003c/code\u003e\nRead-write.",
+          "description": "Output Only. The resource name of the organization. This is the\norganization's relative path in the API. Its format is\n\"organizations/[organization_id]\". For example, \"organizations/1234\".",
           "type": "string"
         },
-        "projectNumber": {
-          "description": "The number uniquely identifying the project.\n\nExample: \u003ccode\u003e415104041262\u003c/code\u003e\nRead-only.",
+        "displayName": {
           "type": "string",
-          "format": "int64"
-        },
-        "projectId": {
-          "description": "The unique, user-assigned ID of the Project.\nIt must be 6 to 30 lowercase letters, digits, or hyphens.\nIt must start with a letter.\nTrailing hyphens are prohibited.\n\nExample: \u003ccode\u003etokyo-rain-123\u003c/code\u003e\nRead-only after creation.",
-          "type": "string"
+          "description": "A friendly string to be used to refer to the Organization in the UI.\nAssigned by the server, set to the firm name of the Google For Work\ncustomer that owns this organization.\n@OutputOnly"
         }
       },
-      "id": "Project"
+      "id": "Organization"
+    },
+    "UndeleteProjectRequest": {
+      "type": "object",
+      "properties": {},
+      "id": "UndeleteProjectRequest",
+      "description": "The request sent to the UndeleteProject\nmethod."
+    },
+    "ProjectCreationStatus": {
+      "description": "A status object which is used as the `metadata` field for the Operation\nreturned by CreateProject. It provides insight for when significant phases of\nProject creation have completed.",
+      "type": "object",
+      "properties": {
+        "ready": {
+          "description": "True if the project creation process is complete.",
+          "type": "boolean"
+        },
+        "createTime": {
+          "description": "Creation time of the project creation workflow.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "gettable": {
+          "description": "True if the project can be retrieved using GetProject. No other operations\non the project are guaranteed to work until the project creation is\ncomplete.",
+          "type": "boolean"
+        }
+      },
+      "id": "ProjectCreationStatus"
+    },
+    "GetIamPolicyRequest": {
+      "id": "GetIamPolicyRequest",
+      "description": "Request message for `GetIamPolicy` method.",
+      "type": "object",
+      "properties": {}
+    },
+    "TestIamPermissionsResponse": {
+      "description": "Response message for `TestIamPermissions` method.",
+      "type": "object",
+      "properties": {
+        "permissions": {
+          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "TestIamPermissionsResponse"
     },
     "OrganizationOwner": {
-      "description": "The entity that owns an Organization. The lifetime of the Organization and\nall of its descendants are bound to the `OrganizationOwner`. If the\n`OrganizationOwner` is deleted, the Organization and all its descendants will\nbe deleted.",
       "type": "object",
       "properties": {
         "directoryCustomerId": {
@@ -900,113 +942,71 @@
           "type": "string"
         }
       },
-      "id": "OrganizationOwner"
+      "id": "OrganizationOwner",
+      "description": "The entity that owns an Organization. The lifetime of the Organization and\nall of its descendants are bound to the `OrganizationOwner`. If the\n`OrganizationOwner` is deleted, the Organization and all its descendants will\nbe deleted."
+    },
+    "GetAncestryResponse": {
+      "id": "GetAncestryResponse",
+      "description": "Response from the GetAncestry method.",
+      "type": "object",
+      "properties": {
+        "ancestor": {
+          "description": "Ancestors are ordered from bottom to top of the resource hierarchy. The\nfirst ancestor is the project itself, followed by the project's parent,\netc.",
+          "type": "array",
+          "items": {
+            "$ref": "Ancestor"
+          }
+        }
+      }
+    },
+    "ListProjectsResponse": {
+      "description": "A page of the response received from the\nListProjects\nmethod.\n\nA paginated response where more pages are available has\n`next_page_token` set. This token can be used in a subsequent request to\nretrieve the next request page.",
+      "type": "object",
+      "properties": {
+        "projects": {
+          "type": "array",
+          "items": {
+            "$ref": "Project"
+          },
+          "description": "The list of Projects that matched the list filter. This list can\nbe paginated."
+        },
+        "nextPageToken": {
+          "description": "Pagination token.\n\nIf the result set is too large to fit in a single response, this token\nis returned. It encodes the position of the current result cursor.\nFeeding this value into a new list request with the `page_token` parameter\ngives the next page of the results.\n\nWhen `next_page_token` is not filled in, there is no next page and\nthe list returned is the last page in the result set.\n\nPagination tokens have a limited lifetime.",
+          "type": "string"
+        }
+      },
+      "id": "ListProjectsResponse"
     }
   },
-  "revision": "20170122",
-  "basePath": "",
+  "protocol": "rest",
   "icons": {
-    "x32": "http://www.google.com/images/icons/product/search-32.gif",
-    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
   },
-  "canonicalName": "Cloud Resource Manager",
-  "discoveryVersion": "v1",
+  "version": "v1",
   "baseUrl": "https://cloudresourcemanager.googleapis.com/",
-  "name": "cloudresourcemanager",
-  "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
+  "canonicalName": "Cloud Resource Manager",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform.read-only": {
+          "description": "View your data across Google Cloud Platform services"
+        },
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
     }
   },
-  "documentationLink": "https://cloud.google.com/resource-manager",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
+  "kind": "discovery#restDescription",
+  "description": "The Google Cloud Resource Manager API provides methods for creating, reading, and updating project metadata.",
   "servicePath": "",
-  "ownerName": "Google",
-  "version": "v1",
   "rootUrl": "https://cloudresourcemanager.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "cloudresourcemanager",
+  "batchPath": "batch",
+  "revision": "20170206",
+  "id": "cloudresourcemanager:v1",
+  "documentationLink": "https://cloud.google.com/resource-manager"
 }
diff --git a/cloudresourcemanager/v1beta1/cloudresourcemanager-api.json b/cloudresourcemanager/v1beta1/cloudresourcemanager-api.json
index 7f1cd88..11ba454 100644
--- a/cloudresourcemanager/v1beta1/cloudresourcemanager-api.json
+++ b/cloudresourcemanager/v1beta1/cloudresourcemanager-api.json
@@ -1,514 +1,669 @@
 {
-  "id": "cloudresourcemanager:v1beta1",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        },
-        "https://www.googleapis.com/auth/cloud-platform.read-only": {
-          "description": "View your data across Google Cloud Platform services"
-        }
-      }
-    }
-  },
-  "description": "The Google Cloud Resource Manager API provides methods for creating, reading, and updating project metadata.",
-  "protocol": "rest",
-  "title": "Google Cloud Resource Manager API",
+  "ownerName": "Google",
+  "discoveryVersion": "v1",
   "resources": {
-    "projects": {
-      "methods": {
-        "getAncestry": {
-          "id": "cloudresourcemanager.projects.getAncestry",
-          "response": {
-            "$ref": "GetAncestryResponse"
-          },
-          "parameterOrder": [
-            "projectId"
-          ],
-          "description": "Gets a list of ancestors in the resource hierarchy for the Project\nidentified by the specified `project_id` (for example, `my-project-123`).\n\nThe caller must have read permissions for this Project.",
-          "request": {
-            "$ref": "GetAncestryRequest"
-          },
-          "flatPath": "v1beta1/projects/{projectId}:getAncestry",
-          "httpMethod": "POST",
-          "parameters": {
-            "projectId": {
-              "description": "The Project ID (for example, `my-project-123`).\n\nRequired.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/projects/{projectId}:getAncestry",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
-        "getIamPolicy": {
-          "id": "cloudresourcemanager.projects.getIamPolicy",
-          "response": {
-            "$ref": "Policy"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
-          "description": "Returns the IAM access control policy for the specified Project.\nPermission is denied if the policy or the resource does not exist.",
-          "request": {
-            "$ref": "GetIamPolicyRequest"
-          },
-          "flatPath": "v1beta1/projects/{resource}:getIamPolicy",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/projects/{resource}:getIamPolicy",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
-        "undelete": {
-          "id": "cloudresourcemanager.projects.undelete",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [
-            "projectId"
-          ],
-          "description": "Restores the Project identified by the specified\n`project_id` (for example, `my-project-123`).\nYou can only use this method for a Project that has a lifecycle state of\nDELETE_REQUESTED.\nAfter deletion starts, the Project cannot be restored.\n\nThe caller must have modify permissions for this Project.",
-          "request": {
-            "$ref": "UndeleteProjectRequest"
-          },
-          "flatPath": "v1beta1/projects/{projectId}:undelete",
-          "httpMethod": "POST",
-          "parameters": {
-            "projectId": {
-              "description": "The project ID (for example, `foo-bar-123`).\n\nRequired.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/projects/{projectId}:undelete",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "list": {
-          "id": "cloudresourcemanager.projects.list",
-          "response": {
-            "$ref": "ListProjectsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Lists Projects that are visible to the user and satisfy the\nspecified filter. This method returns Projects in an unspecified order.\nNew Projects do not necessarily appear at the end of the list.",
-          "flatPath": "v1beta1/projects",
-          "httpMethod": "GET",
-          "parameters": {
-            "pageSize": {
-              "description": "The maximum number of Projects to return in the response.\nThe server can return fewer Projects than requested.\nIf unspecified, server picks an appropriate default.\n\nOptional.",
-              "location": "query",
-              "type": "integer",
-              "format": "int32"
-            },
-            "filter": {
-              "description": "An expression for filtering the results of the request.  Filter rules are\ncase insensitive. The fields eligible for filtering are:\n\n+ `name`\n+ `id`\n+ \u003ccode\u003elabels.\u003cem\u003ekey\u003c/em\u003e\u003c/code\u003e where *key* is the name of a label\n\nSome examples of using labels as filters:\n\n|Filter|Description|\n|------|-----------|\n|name:*|The project has a name.|\n|name:Howl|The project's name is `Howl` or `howl`.|\n|name:HOWL|Equivalent to above.|\n|NAME:howl|Equivalent to above.|\n|labels.color:*|The project has the label `color`.|\n|labels.color:red|The project's label `color` has the value `red`.|\n|labels.color:red&nbsp;label.size:big|The project's label `color` has the value `red` and its label `size` has the value `big`.\n\nOptional.",
-              "location": "query",
-              "type": "string"
-            },
-            "pageToken": {
-              "description": "A pagination token returned from a previous call to ListProjects\nthat indicates from where listing should continue.\n\nOptional.",
-              "location": "query",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/projects",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
-        "get": {
-          "id": "cloudresourcemanager.projects.get",
-          "response": {
-            "$ref": "Project"
-          },
-          "parameterOrder": [
-            "projectId"
-          ],
-          "description": "Retrieves the Project identified by the specified\n`project_id` (for example, `my-project-123`).\n\nThe caller must have read permissions for this Project.",
-          "flatPath": "v1beta1/projects/{projectId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "projectId": {
-              "description": "The Project ID (for example, `my-project-123`).\n\nRequired.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/projects/{projectId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
-        "update": {
-          "id": "cloudresourcemanager.projects.update",
-          "response": {
-            "$ref": "Project"
-          },
-          "parameterOrder": [
-            "projectId"
-          ],
-          "description": "Updates the attributes of the Project identified by the specified\n`project_id` (for example, `my-project-123`).\n\nThe caller must have modify permissions for this Project.",
-          "request": {
-            "$ref": "Project"
-          },
-          "flatPath": "v1beta1/projects/{projectId}",
-          "httpMethod": "PUT",
-          "parameters": {
-            "projectId": {
-              "description": "The project ID (for example, `my-project-123`).\n\nRequired.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/projects/{projectId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "create": {
-          "id": "cloudresourcemanager.projects.create",
-          "response": {
-            "$ref": "Project"
-          },
-          "parameterOrder": [],
-          "description": "Creates a Project resource.\n\nInitially, the Project resource is owned by its creator exclusively.\nThe creator can later grant permission to others to read or update the\nProject.\n\nSeveral APIs are activated automatically for the Project, including\nGoogle Cloud Storage.",
-          "request": {
-            "$ref": "Project"
-          },
-          "flatPath": "v1beta1/projects",
-          "httpMethod": "POST",
-          "parameters": {
-            "useLegacyStack": {
-              "description": "A safety hatch to opt out of the new reliable project creation process.",
-              "location": "query",
-              "type": "boolean"
-            }
-          },
-          "path": "v1beta1/projects",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "setIamPolicy": {
-          "id": "cloudresourcemanager.projects.setIamPolicy",
-          "response": {
-            "$ref": "Policy"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
-          "description": "Sets the IAM access control policy for the specified Project. Replaces\nany existing policy.\n\nThe following constraints apply when using `setIamPolicy()`:\n\n+ Project does not support `allUsers` and `allAuthenticatedUsers` as\n`members` in a `Binding` of a `Policy`.\n\n+ The owner role can be granted only to `user` and `serviceAccount`.\n\n+ Service accounts can be made owners of a project directly\nwithout any restrictions. However, to be added as an owner, a user must be\ninvited via Cloud Platform console and must accept the invitation.\n\n+ A user cannot be granted the owner role using `setIamPolicy()`. The user\nmust be granted the owner role using the Cloud Platform Console and must\nexplicitly accept the invitation.\n\n+ Invitations to grant the owner role cannot be sent using `setIamPolicy()`;\nthey must be sent only using the Cloud Platform Console.\n\n+ Membership changes that leave the project without any owners that have\naccepted the Terms of Service (ToS) will be rejected.\n\n+ There must be at least one owner who has accepted the Terms of\nService (ToS) agreement in the policy. Calling `setIamPolicy()` to\nto remove the last ToS-accepted owner from the policy will fail. This\nrestriction also applies to legacy projects that no longer have owners\nwho have accepted the ToS. Edits to IAM policies will be rejected until\nthe lack of a ToS-accepting owner is rectified.\n\n+ Calling this method requires enabling the App Engine Admin API.\n\nNote: Removing service accounts from policies or changing their roles\ncan render services completely inoperable. It is important to understand\nhow the service account is being used before removing or updating its roles.",
-          "request": {
-            "$ref": "SetIamPolicyRequest"
-          },
-          "flatPath": "v1beta1/projects/{resource}:setIamPolicy",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/projects/{resource}:setIamPolicy",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "delete": {
-          "id": "cloudresourcemanager.projects.delete",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [
-            "projectId"
-          ],
-          "description": "Marks the Project identified by the specified\n`project_id` (for example, `my-project-123`) for deletion.\nThis method will only affect the Project if the following criteria are met:\n\n+ The Project does not have a billing account associated with it.\n+ The Project has a lifecycle state of\nACTIVE.\n\nThis method changes the Project's lifecycle state from\nACTIVE\nto DELETE_REQUESTED.\nThe deletion starts at an unspecified time, at which point the project is\nno longer accessible.\n\nUntil the deletion completes, you can check the lifecycle state\nchecked by retrieving the Project with GetProject,\nand the Project remains visible to ListProjects.\nHowever, you cannot update the project.\n\nAfter the deletion completes, the Project is not retrievable by\nthe  GetProject and\nListProjects methods.\n\nThe caller must have modify permissions for this Project.",
-          "flatPath": "v1beta1/projects/{projectId}",
-          "httpMethod": "DELETE",
-          "parameters": {
-            "projectId": {
-              "description": "The Project ID (for example, `foo-bar-123`).\n\nRequired.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/projects/{projectId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "testIamPermissions": {
-          "id": "cloudresourcemanager.projects.testIamPermissions",
-          "response": {
-            "$ref": "TestIamPermissionsResponse"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
-          "description": "Returns permissions that a caller has on the specified Project.",
-          "request": {
-            "$ref": "TestIamPermissionsRequest"
-          },
-          "flatPath": "v1beta1/projects/{resource}:testIamPermissions",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/projects/{resource}:testIamPermissions",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        }
-      }
-    },
     "organizations": {
       "methods": {
-        "getIamPolicy": {
-          "id": "cloudresourcemanager.organizations.getIamPolicy",
-          "response": {
-            "$ref": "Policy"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
-          "description": "Gets the access control policy for an Organization resource. May be empty\nif no such policy or resource exists. The `resource` field should be the\norganization's resource name, e.g. \"organizations/123\".",
-          "request": {
-            "$ref": "GetIamPolicyRequest"
-          },
-          "flatPath": "v1beta1/organizations/{organizationsId}:getIamPolicy",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "pattern": "^organizations/[^/]+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/{+resource}:getIamPolicy",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
-        "list": {
-          "id": "cloudresourcemanager.organizations.list",
-          "response": {
-            "$ref": "ListOrganizationsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Lists Organization resources that are visible to the user and satisfy\nthe specified filter. This method returns Organizations in an unspecified\norder. New Organizations do not necessarily appear at the end of the list.",
-          "flatPath": "v1beta1/organizations",
-          "httpMethod": "GET",
-          "parameters": {
-            "pageSize": {
-              "description": "The maximum number of Organizations to return in the response.\nThis field is optional.",
-              "location": "query",
-              "type": "integer",
-              "format": "int32"
-            },
-            "filter": {
-              "description": "An optional query string used to filter the Organizations to return in\nthe response. Filter rules are case-insensitive.\n\n\nOrganizations may be filtered by `owner.directoryCustomerId` or by\n`domain`, where the domain is a Google for Work domain, for example:\n\n|Filter|Description|\n|------|-----------|\n|owner.directorycustomerid:123456789|Organizations with `owner.directory_customer_id` equal to `123456789`.|\n|domain:google.com|Organizations corresponding to the domain `google.com`.|\n\nThis field is optional.",
-              "location": "query",
-              "type": "string"
-            },
-            "pageToken": {
-              "description": "A pagination token returned from a previous call to `ListOrganizations`\nthat indicates from where listing should continue.\nThis field is optional.",
-              "location": "query",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/organizations",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
-        },
         "get": {
+          "path": "v1beta1/{+name}",
           "id": "cloudresourcemanager.organizations.get",
-          "response": {
-            "$ref": "Organization"
-          },
+          "description": "Fetches an Organization resource identified by the specified resource name.",
           "parameterOrder": [
             "name"
           ],
-          "description": "Fetches an Organization resource identified by the specified resource name.",
-          "flatPath": "v1beta1/organizations/{organizationsId}",
+          "response": {
+            "$ref": "Organization"
+          },
           "httpMethod": "GET",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
           "parameters": {
+            "organizationId": {
+              "location": "query",
+              "description": "The id of the Organization resource to fetch.\nThis field is deprecated and will be removed in v1. Use name instead.",
+              "type": "string"
+            },
             "name": {
+              "location": "path",
               "description": "The resource name of the Organization to fetch, e.g. \"organizations/1234\".",
               "required": true,
-              "pattern": "^organizations/[^/]+$",
-              "location": "path",
-              "type": "string"
-            },
-            "organizationId": {
-              "description": "The id of the Organization resource to fetch.\nThis field is deprecated and will be removed in v1. Use name instead.",
-              "location": "query",
-              "type": "string"
+              "type": "string",
+              "pattern": "^organizations/[^/]+$"
             }
           },
-          "path": "v1beta1/{+name}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
+          "flatPath": "v1beta1/organizations/{organizationsId}"
         },
         "update": {
-          "id": "cloudresourcemanager.organizations.update",
-          "response": {
-            "$ref": "Organization"
-          },
-          "parameterOrder": [
-            "name"
-          ],
           "description": "Updates an Organization resource identified by the specified resource name.",
           "request": {
             "$ref": "Organization"
           },
-          "flatPath": "v1beta1/organizations/{organizationsId}",
-          "httpMethod": "PUT",
-          "parameters": {
-            "name": {
-              "description": "Output Only. The resource name of the organization. This is the\norganization's relative path in the API. Its format is\n\"organizations/[organization_id]\". For example, \"organizations/1234\".",
-              "required": true,
-              "pattern": "^organizations/[^/]+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/{+name}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "setIamPolicy": {
-          "id": "cloudresourcemanager.organizations.setIamPolicy",
           "response": {
-            "$ref": "Policy"
+            "$ref": "Organization"
           },
           "parameterOrder": [
-            "resource"
+            "name"
           ],
-          "description": "Sets the access control policy on an Organization resource. Replaces any\nexisting policy. The `resource` field should be the organization's resource\nname, e.g. \"organizations/123\".",
-          "request": {
-            "$ref": "SetIamPolicyRequest"
-          },
-          "flatPath": "v1beta1/organizations/{organizationsId}:setIamPolicy",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "pattern": "^organizations/[^/]+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1/{+resource}:setIamPolicy",
+          "httpMethod": "PUT",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform"
-          ]
+          ],
+          "parameters": {
+            "name": {
+              "location": "path",
+              "description": "Output Only. The resource name of the organization. This is the\norganization's relative path in the API. Its format is\n\"organizations/[organization_id]\". For example, \"organizations/1234\".",
+              "required": true,
+              "type": "string",
+              "pattern": "^organizations/[^/]+$"
+            }
+          },
+          "flatPath": "v1beta1/organizations/{organizationsId}",
+          "path": "v1beta1/{+name}",
+          "id": "cloudresourcemanager.organizations.update"
         },
         "testIamPermissions": {
+          "parameters": {
+            "resource": {
+              "location": "path",
+              "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+              "required": true,
+              "type": "string",
+              "pattern": "^organizations/[^/]+$"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "flatPath": "v1beta1/organizations/{organizationsId}:testIamPermissions",
+          "path": "v1beta1/{+resource}:testIamPermissions",
           "id": "cloudresourcemanager.organizations.testIamPermissions",
+          "request": {
+            "$ref": "TestIamPermissionsRequest"
+          },
+          "description": "Returns permissions that a caller has on the specified Organization.\nThe `resource` field should be the organization's resource name,\ne.g. \"organizations/123\".",
           "response": {
             "$ref": "TestIamPermissionsResponse"
           },
           "parameterOrder": [
             "resource"
           ],
-          "description": "Returns permissions that a caller has on the specified Organization.\nThe `resource` field should be the organization's resource name,\ne.g. \"organizations/123\".",
-          "request": {
-            "$ref": "TestIamPermissionsRequest"
+          "httpMethod": "POST"
+        },
+        "list": {
+          "response": {
+            "$ref": "ListOrganizationsResponse"
           },
-          "flatPath": "v1beta1/organizations/{organizationsId}:testIamPermissions",
+          "parameterOrder": [],
+          "httpMethod": "GET",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "parameters": {
+            "pageToken": {
+              "location": "query",
+              "description": "A pagination token returned from a previous call to `ListOrganizations`\nthat indicates from where listing should continue.\nThis field is optional.",
+              "type": "string"
+            },
+            "pageSize": {
+              "location": "query",
+              "description": "The maximum number of Organizations to return in the response.\nThis field is optional.",
+              "format": "int32",
+              "type": "integer"
+            },
+            "filter": {
+              "type": "string",
+              "location": "query",
+              "description": "An optional query string used to filter the Organizations to return in\nthe response. Filter rules are case-insensitive.\n\n\nOrganizations may be filtered by `owner.directoryCustomerId` or by\n`domain`, where the domain is a Google for Work domain, for example:\n\n|Filter|Description|\n|------|-----------|\n|owner.directorycustomerid:123456789|Organizations with `owner.directory_customer_id` equal to `123456789`.|\n|domain:google.com|Organizations corresponding to the domain `google.com`.|\n\nThis field is optional."
+            }
+          },
+          "flatPath": "v1beta1/organizations",
+          "path": "v1beta1/organizations",
+          "id": "cloudresourcemanager.organizations.list",
+          "description": "Lists Organization resources that are visible to the user and satisfy\nthe specified filter. This method returns Organizations in an unspecified\norder. New Organizations do not necessarily appear at the end of the list."
+        },
+        "setIamPolicy": {
+          "request": {
+            "$ref": "SetIamPolicyRequest"
+          },
+          "description": "Sets the access control policy on an Organization resource. Replaces any\nexisting policy. The `resource` field should be the organization's resource\nname, e.g. \"organizations/123\".",
+          "response": {
+            "$ref": "Policy"
+          },
+          "parameterOrder": [
+            "resource"
+          ],
           "httpMethod": "POST",
           "parameters": {
             "resource": {
+              "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+              "required": true,
+              "type": "string",
+              "pattern": "^organizations/[^/]+$",
+              "location": "path"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "flatPath": "v1beta1/organizations/{organizationsId}:setIamPolicy",
+          "path": "v1beta1/{+resource}:setIamPolicy",
+          "id": "cloudresourcemanager.organizations.setIamPolicy"
+        },
+        "getIamPolicy": {
+          "response": {
+            "$ref": "Policy"
+          },
+          "parameterOrder": [
+            "resource"
+          ],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "parameters": {
+            "resource": {
+              "pattern": "^organizations/[^/]+$",
+              "location": "path",
+              "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1beta1/organizations/{organizationsId}:getIamPolicy",
+          "path": "v1beta1/{+resource}:getIamPolicy",
+          "id": "cloudresourcemanager.organizations.getIamPolicy",
+          "description": "Gets the access control policy for an Organization resource. May be empty\nif no such policy or resource exists. The `resource` field should be the\norganization's resource name, e.g. \"organizations/123\".",
+          "request": {
+            "$ref": "GetIamPolicyRequest"
+          }
+        }
+      }
+    },
+    "projects": {
+      "methods": {
+        "testIamPermissions": {
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "resource"
+          ],
+          "response": {
+            "$ref": "TestIamPermissionsResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "parameters": {
+            "resource": {
               "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
               "required": true,
-              "pattern": "^organizations/[^/]+$",
-              "location": "path",
-              "type": "string"
+              "type": "string",
+              "location": "path"
             }
           },
-          "path": "v1beta1/{+resource}:testIamPermissions",
+          "flatPath": "v1beta1/projects/{resource}:testIamPermissions",
+          "id": "cloudresourcemanager.projects.testIamPermissions",
+          "path": "v1beta1/projects/{resource}:testIamPermissions",
+          "description": "Returns permissions that a caller has on the specified Project.",
+          "request": {
+            "$ref": "TestIamPermissionsRequest"
+          }
+        },
+        "delete": {
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameterOrder": [
+            "projectId"
+          ],
+          "httpMethod": "DELETE",
+          "parameters": {
+            "projectId": {
+              "required": true,
+              "type": "string",
+              "location": "path",
+              "description": "The Project ID (for example, `foo-bar-123`).\n\nRequired."
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "flatPath": "v1beta1/projects/{projectId}",
+          "path": "v1beta1/projects/{projectId}",
+          "id": "cloudresourcemanager.projects.delete",
+          "description": "Marks the Project identified by the specified\n`project_id` (for example, `my-project-123`) for deletion.\nThis method will only affect the Project if the following criteria are met:\n\n+ The Project does not have a billing account associated with it.\n+ The Project has a lifecycle state of\nACTIVE.\n\nThis method changes the Project's lifecycle state from\nACTIVE\nto DELETE_REQUESTED.\nThe deletion starts at an unspecified time, at which point the project is\nno longer accessible.\n\nUntil the deletion completes, you can check the lifecycle state\nchecked by retrieving the Project with GetProject,\nand the Project remains visible to ListProjects.\nHowever, you cannot update the project.\n\nAfter the deletion completes, the Project is not retrievable by\nthe  GetProject and\nListProjects methods.\n\nThe caller must have modify permissions for this Project."
+        },
+        "list": {
+          "flatPath": "v1beta1/projects",
+          "path": "v1beta1/projects",
+          "id": "cloudresourcemanager.projects.list",
+          "description": "Lists Projects that are visible to the user and satisfy the\nspecified filter. This method returns Projects in an unspecified order.\nNew Projects do not necessarily appear at the end of the list.",
+          "response": {
+            "$ref": "ListProjectsResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "GET",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/cloud-platform.read-only"
-          ]
+          ],
+          "parameters": {
+            "filter": {
+              "location": "query",
+              "description": "An expression for filtering the results of the request.  Filter rules are\ncase insensitive. The fields eligible for filtering are:\n\n+ `name`\n+ `id`\n+ \u003ccode\u003elabels.\u003cem\u003ekey\u003c/em\u003e\u003c/code\u003e where *key* is the name of a label\n\nSome examples of using labels as filters:\n\n|Filter|Description|\n|------|-----------|\n|name:*|The project has a name.|\n|name:Howl|The project's name is `Howl` or `howl`.|\n|name:HOWL|Equivalent to above.|\n|NAME:howl|Equivalent to above.|\n|labels.color:*|The project has the label `color`.|\n|labels.color:red|The project's label `color` has the value `red`.|\n|labels.color:red&nbsp;label.size:big|The project's label `color` has the value `red` and its label `size` has the value `big`.\n\nOptional.",
+              "type": "string"
+            },
+            "pageToken": {
+              "type": "string",
+              "location": "query",
+              "description": "A pagination token returned from a previous call to ListProjects\nthat indicates from where listing should continue.\n\nOptional."
+            },
+            "pageSize": {
+              "description": "The maximum number of Projects to return in the response.\nThe server can return fewer Projects than requested.\nIf unspecified, server picks an appropriate default.\n\nOptional.",
+              "format": "int32",
+              "type": "integer",
+              "location": "query"
+            }
+          }
+        },
+        "setIamPolicy": {
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "resource"
+          ],
+          "response": {
+            "$ref": "Policy"
+          },
+          "parameters": {
+            "resource": {
+              "location": "path",
+              "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "flatPath": "v1beta1/projects/{resource}:setIamPolicy",
+          "id": "cloudresourcemanager.projects.setIamPolicy",
+          "path": "v1beta1/projects/{resource}:setIamPolicy",
+          "request": {
+            "$ref": "SetIamPolicyRequest"
+          },
+          "description": "Sets the IAM access control policy for the specified Project. Replaces\nany existing policy.\n\nThe following constraints apply when using `setIamPolicy()`:\n\n+ Project does not support `allUsers` and `allAuthenticatedUsers` as\n`members` in a `Binding` of a `Policy`.\n\n+ The owner role can be granted only to `user` and `serviceAccount`.\n\n+ Service accounts can be made owners of a project directly\nwithout any restrictions. However, to be added as an owner, a user must be\ninvited via Cloud Platform console and must accept the invitation.\n\n+ A user cannot be granted the owner role using `setIamPolicy()`. The user\nmust be granted the owner role using the Cloud Platform Console and must\nexplicitly accept the invitation.\n\n+ Invitations to grant the owner role cannot be sent using `setIamPolicy()`;\nthey must be sent only using the Cloud Platform Console.\n\n+ Membership changes that leave the project without any owners that have\naccepted the Terms of Service (ToS) will be rejected.\n\n+ There must be at least one owner who has accepted the Terms of\nService (ToS) agreement in the policy. Calling `setIamPolicy()` to\nto remove the last ToS-accepted owner from the policy will fail. This\nrestriction also applies to legacy projects that no longer have owners\nwho have accepted the ToS. Edits to IAM policies will be rejected until\nthe lack of a ToS-accepting owner is rectified.\n\n+ Calling this method requires enabling the App Engine Admin API.\n\nNote: Removing service accounts from policies or changing their roles\ncan render services completely inoperable. It is important to understand\nhow the service account is being used before removing or updating its roles."
+        },
+        "create": {
+          "description": "Creates a Project resource.\n\nInitially, the Project resource is owned by its creator exclusively.\nThe creator can later grant permission to others to read or update the\nProject.\n\nSeveral APIs are activated automatically for the Project, including\nGoogle Cloud Storage.",
+          "request": {
+            "$ref": "Project"
+          },
+          "response": {
+            "$ref": "Project"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "useLegacyStack": {
+              "type": "boolean",
+              "location": "query",
+              "description": "A safety hatch to opt out of the new reliable project creation process."
+            }
+          },
+          "flatPath": "v1beta1/projects",
+          "path": "v1beta1/projects",
+          "id": "cloudresourcemanager.projects.create"
+        },
+        "getIamPolicy": {
+          "path": "v1beta1/projects/{resource}:getIamPolicy",
+          "id": "cloudresourcemanager.projects.getIamPolicy",
+          "description": "Returns the IAM access control policy for the specified Project.\nPermission is denied if the policy or the resource does not exist.",
+          "request": {
+            "$ref": "GetIamPolicyRequest"
+          },
+          "response": {
+            "$ref": "Policy"
+          },
+          "parameterOrder": [
+            "resource"
+          ],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "parameters": {
+            "resource": {
+              "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "flatPath": "v1beta1/projects/{resource}:getIamPolicy"
+        },
+        "get": {
+          "httpMethod": "GET",
+          "parameterOrder": [
+            "projectId"
+          ],
+          "response": {
+            "$ref": "Project"
+          },
+          "parameters": {
+            "projectId": {
+              "description": "The Project ID (for example, `my-project-123`).\n\nRequired.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "flatPath": "v1beta1/projects/{projectId}",
+          "id": "cloudresourcemanager.projects.get",
+          "path": "v1beta1/projects/{projectId}",
+          "description": "Retrieves the Project identified by the specified\n`project_id` (for example, `my-project-123`).\n\nThe caller must have read permissions for this Project."
+        },
+        "undelete": {
+          "flatPath": "v1beta1/projects/{projectId}:undelete",
+          "id": "cloudresourcemanager.projects.undelete",
+          "path": "v1beta1/projects/{projectId}:undelete",
+          "description": "Restores the Project identified by the specified\n`project_id` (for example, `my-project-123`).\nYou can only use this method for a Project that has a lifecycle state of\nDELETE_REQUESTED.\nAfter deletion starts, the Project cannot be restored.\n\nThe caller must have modify permissions for this Project.",
+          "request": {
+            "$ref": "UndeleteProjectRequest"
+          },
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "projectId"
+          ],
+          "response": {
+            "$ref": "Empty"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "projectId": {
+              "description": "The project ID (for example, `foo-bar-123`).\n\nRequired.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          }
+        },
+        "update": {
+          "description": "Updates the attributes of the Project identified by the specified\n`project_id` (for example, `my-project-123`).\n\nThe caller must have modify permissions for this Project.",
+          "request": {
+            "$ref": "Project"
+          },
+          "httpMethod": "PUT",
+          "parameterOrder": [
+            "projectId"
+          ],
+          "response": {
+            "$ref": "Project"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "projectId": {
+              "location": "path",
+              "description": "The project ID (for example, `my-project-123`).\n\nRequired.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1beta1/projects/{projectId}",
+          "id": "cloudresourcemanager.projects.update",
+          "path": "v1beta1/projects/{projectId}"
+        },
+        "getAncestry": {
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "projectId"
+          ],
+          "response": {
+            "$ref": "GetAncestryResponse"
+          },
+          "parameters": {
+            "projectId": {
+              "description": "The Project ID (for example, `my-project-123`).\n\nRequired.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only"
+          ],
+          "flatPath": "v1beta1/projects/{projectId}:getAncestry",
+          "id": "cloudresourcemanager.projects.getAncestry",
+          "path": "v1beta1/projects/{projectId}:getAncestry",
+          "request": {
+            "$ref": "GetAncestryRequest"
+          },
+          "description": "Gets a list of ancestors in the resource hierarchy for the Project\nidentified by the specified `project_id` (for example, `my-project-123`).\n\nThe caller must have read permissions for this Project."
         }
       }
     }
   },
+  "parameters": {
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string",
+      "location": "query"
+    },
+    "$.xgafv": {
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ]
+    },
+    "callback": {
+      "description": "JSONP",
+      "type": "string",
+      "location": "query"
+    },
+    "alt": {
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query"
+    },
+    "access_token": {
+      "description": "OAuth access token.",
+      "type": "string",
+      "location": "query"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string",
+      "location": "query"
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "oauth_token": {
+      "type": "string",
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user."
+    },
+    "bearer_token": {
+      "location": "query",
+      "description": "OAuth bearer token.",
+      "type": "string"
+    }
+  },
   "schemas": {
-    "FolderOperationError": {
-      "description": "A classification of the Folder Operation error.",
+    "UndeleteProjectRequest": {
+      "description": "The request sent to the UndeleteProject\nmethod.",
+      "type": "object",
+      "properties": {},
+      "id": "UndeleteProjectRequest"
+    },
+    "Organization": {
+      "description": "The root node in the resource hierarchy to which a particular entity's\n(e.g., company) resources belong.",
       "type": "object",
       "properties": {
-        "errorMessageId": {
-          "description": "The type of operation error experienced.",
-          "enum": [
-            "ERROR_TYPE_UNSPECIFIED",
-            "FOLDER_HEIGHT_VIOLATION",
-            "MAX_CHILD_FOLDERS_VIOLATION",
-            "FOLDER_NAME_UNIQUENESS_VIOLATION",
-            "RESOURCE_DELETED",
-            "PARENT_DELETED",
-            "CYCLE_INTRODUCED_ERROR",
-            "FOLDER_ALREADY_BEING_MOVED",
-            "FOLDER_TO_DELETE_NON_EMPTY"
-          ],
+        "organizationId": {
+          "description": "An immutable id for the Organization that is assigned on creation. This\nshould be omitted when creating a new Organization.\nThis field is read-only.\nThis field is deprecated and will be removed in v1. Use name instead.",
+          "type": "string"
+        },
+        "lifecycleState": {
+          "type": "string",
           "enumDescriptions": [
-            "The error type was unrecognized or unspecified.",
-            "The attempted action would violate the max folder depth constraint.",
-            "The attempted action would violate the max child folders constraint.",
-            "The attempted action would violate the locally-unique folder\ndisplay_name constraint.",
-            "The resource being moved has been deleted.",
-            "The resource a folder was being added to has been deleted.",
-            "The attempted action would introduce cycle in resource path.",
-            "The attempted action would move a folder that is already being moved.",
-            "The folder the caller is trying to delete contains active resources."
+            "Unspecified state.  This is only useful for distinguishing unset values.",
+            "The normal and active state.",
+            "The organization has been marked for deletion by the user."
           ],
+          "enum": [
+            "LIFECYCLE_STATE_UNSPECIFIED",
+            "ACTIVE",
+            "DELETE_REQUESTED"
+          ],
+          "description": "The organization's current lifecycle state. Assigned by the server.\n@OutputOnly"
+        },
+        "displayName": {
+          "description": "A friendly string to be used to refer to the Organization in the UI.\nAssigned by the server, set to the firm name of the Google For Work\ncustomer that owns this organization.\n@OutputOnly",
+          "type": "string"
+        },
+        "creationTime": {
+          "description": "Timestamp when the Organization was created. Assigned by the server.\n@OutputOnly",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "owner": {
+          "$ref": "OrganizationOwner",
+          "description": "The owner of this Organization. The owner should be specified on\ncreation. Once set, it cannot be changed.\nThis field is required."
+        },
+        "name": {
+          "description": "Output Only. The resource name of the organization. This is the\norganization's relative path in the API. Its format is\n\"organizations/[organization_id]\". For example, \"organizations/1234\".",
           "type": "string"
         }
       },
-      "id": "FolderOperationError"
+      "id": "Organization"
+    },
+    "ProjectCreationStatus": {
+      "properties": {
+        "createTime": {
+          "description": "Creation time of the project creation workflow.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "gettable": {
+          "description": "True if the project can be retrieved using GetProject. No other operations\non the project are guaranteed to work until the project creation is\ncomplete.",
+          "type": "boolean"
+        },
+        "ready": {
+          "description": "True if the project creation process is complete.",
+          "type": "boolean"
+        }
+      },
+      "id": "ProjectCreationStatus",
+      "description": "A status object which is used as the `metadata` field for the Operation\nreturned by CreateProject. It provides insight for when significant phases of\nProject creation have completed.",
+      "type": "object"
+    },
+    "GetIamPolicyRequest": {
+      "description": "Request message for `GetIamPolicy` method.",
+      "type": "object",
+      "properties": {},
+      "id": "GetIamPolicyRequest"
+    },
+    "TestIamPermissionsResponse": {
+      "type": "object",
+      "properties": {
+        "permissions": {
+          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "TestIamPermissionsResponse",
+      "description": "Response message for `TestIamPermissions` method."
+    },
+    "GetAncestryResponse": {
+      "description": "Response from the GetAncestry method.",
+      "type": "object",
+      "properties": {
+        "ancestor": {
+          "type": "array",
+          "items": {
+            "$ref": "Ancestor"
+          },
+          "description": "Ancestors are ordered from bottom to top of the resource hierarchy. The\nfirst ancestor is the project itself, followed by the project's parent,\netc."
+        }
+      },
+      "id": "GetAncestryResponse"
+    },
+    "OrganizationOwner": {
+      "description": "The entity that owns an Organization. The lifetime of the Organization and\nall of its descendants are bound to the `OrganizationOwner`. If the\n`OrganizationOwner` is deleted, the Organization and all its descendants will\nbe deleted.",
+      "type": "object",
+      "properties": {
+        "directoryCustomerId": {
+          "description": "The Google for Work customer id used in the Directory API.",
+          "type": "string"
+        }
+      },
+      "id": "OrganizationOwner"
     },
     "ListProjectsResponse": {
+      "id": "ListProjectsResponse",
       "description": "A page of the response received from the\nListProjects\nmethod.\n\nA paginated response where more pages are available has\n`next_page_token` set. This token can be used in a subsequent request to\nretrieve the next request page.",
       "type": "object",
       "properties": {
@@ -523,168 +678,67 @@
           "description": "Pagination token.\n\nIf the result set is too large to fit in a single response, this token\nis returned. It encodes the position of the current result cursor.\nFeeding this value into a new list request with the `page_token` parameter\ngives the next page of the results.\n\nWhen `next_page_token` is not filled in, there is no next page and\nthe list returned is the last page in the result set.\n\nPagination tokens have a limited lifetime.",
           "type": "string"
         }
-      },
-      "id": "ListProjectsResponse"
+      }
     },
-    "UndeleteProjectRequest": {
-      "description": "The request sent to the UndeleteProject\nmethod.",
+    "GetAncestryRequest": {
+      "description": "The request sent to the\nGetAncestry\nmethod.",
       "type": "object",
       "properties": {},
-      "id": "UndeleteProjectRequest"
+      "id": "GetAncestryRequest"
     },
-    "FolderOperation": {
-      "description": "Metadata describing a long running folder operation",
+    "Project": {
+      "description": "A Project is a high-level Google Cloud Platform entity.  It is a\ncontainer for ACLs, APIs, AppEngine Apps, VMs, and other\nGoogle Cloud Platform resources.",
       "type": "object",
       "properties": {
-        "displayName": {
-          "description": "The display name of the folder.",
+        "projectId": {
+          "description": "The unique, user-assigned ID of the Project.\nIt must be 6 to 30 lowercase letters, digits, or hyphens.\nIt must start with a letter.\nTrailing hyphens are prohibited.\n\nExample: \u003ccode\u003etokyo-rain-123\u003c/code\u003e\nRead-only after creation.",
           "type": "string"
         },
-        "sourceParent": {
-          "description": "The resource name of the folder's parent.\nOnly applicable when the operation_type is MOVE.",
-          "type": "string"
-        },
-        "destinationParent": {
-          "description": "The resource name of the folder or organization we are either creating\nthe folder under or moving the folder to.",
-          "type": "string"
-        },
-        "operationType": {
-          "description": "The type of this operation.",
-          "enum": [
-            "OPERATION_TYPE_UNSPECIFIED",
-            "CREATE",
-            "MOVE"
-          ],
-          "enumDescriptions": [
-            "Operation type not specified.",
-            "A create folder operation.",
-            "A move folder operation."
-          ],
-          "type": "string"
-        }
-      },
-      "id": "FolderOperation"
-    },
-    "GetIamPolicyRequest": {
-      "description": "Request message for `GetIamPolicy` method.",
-      "type": "object",
-      "properties": {},
-      "id": "GetIamPolicyRequest"
-    },
-    "SetIamPolicyRequest": {
-      "description": "Request message for `SetIamPolicy` method.",
-      "type": "object",
-      "properties": {
-        "policy": {
-          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them.",
-          "$ref": "Policy"
-        }
-      },
-      "id": "SetIamPolicyRequest"
-    },
-    "TestIamPermissionsResponse": {
-      "description": "Response message for `TestIamPermissions` method.",
-      "type": "object",
-      "properties": {
-        "permissions": {
-          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "TestIamPermissionsResponse"
-    },
-    "Organization": {
-      "description": "The root node in the resource hierarchy to which a particular entity's\n(e.g., company) resources belong.",
-      "type": "object",
-      "properties": {
         "lifecycleState": {
-          "description": "The organization's current lifecycle state. Assigned by the server.\n@OutputOnly",
           "enum": [
             "LIFECYCLE_STATE_UNSPECIFIED",
             "ACTIVE",
-            "DELETE_REQUESTED"
+            "DELETE_REQUESTED",
+            "DELETE_IN_PROGRESS"
           ],
+          "description": "The Project lifecycle state.\n\nRead-only.",
+          "type": "string",
           "enumDescriptions": [
-            "Unspecified state.  This is only useful for distinguishing unset values.",
+            "Unspecified state.  This is only used/useful for distinguishing\nunset values.",
             "The normal and active state.",
-            "The organization has been marked for deletion by the user."
-          ],
+            "The project has been marked for deletion by the user\n(by invoking DeleteProject)\nor by the system (Google Cloud Platform).\nThis can generally be reversed by invoking UndeleteProject.",
+            "This lifecycle state is no longer used and is not returned by the API."
+          ]
+        },
+        "projectNumber": {
+          "description": "The number uniquely identifying the project.\n\nExample: \u003ccode\u003e415104041262\u003c/code\u003e\nRead-only.",
+          "format": "int64",
           "type": "string"
         },
-        "displayName": {
-          "description": "A friendly string to be used to refer to the Organization in the UI.\nAssigned by the server, set to the firm name of the Google For Work\ncustomer that owns this organization.\n@OutputOnly",
-          "type": "string"
-        },
-        "organizationId": {
-          "description": "An immutable id for the Organization that is assigned on creation. This\nshould be omitted when creating a new Organization.\nThis field is read-only.\nThis field is deprecated and will be removed in v1. Use name instead.",
-          "type": "string"
-        },
-        "name": {
-          "description": "Output Only. The resource name of the organization. This is the\norganization's relative path in the API. Its format is\n\"organizations/[organization_id]\". For example, \"organizations/1234\".",
-          "type": "string"
-        },
-        "creationTime": {
-          "description": "Timestamp when the Organization was created. Assigned by the server.\n@OutputOnly",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "owner": {
-          "description": "The owner of this Organization. The owner should be specified on\ncreation. Once set, it cannot be changed.\nThis field is required.",
-          "$ref": "OrganizationOwner"
-        }
-      },
-      "id": "Organization"
-    },
-    "Policy": {
-      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
-      "type": "object",
-      "properties": {
-        "bindings": {
-          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
-          "type": "array",
-          "items": {
-            "$ref": "Binding"
-          }
-        },
-        "etag": {
-          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
-          "type": "string",
-          "format": "byte"
-        },
-        "version": {
-          "description": "Version of the `Policy`. The default version is 0.",
-          "type": "integer",
-          "format": "int32"
-        }
-      },
-      "id": "Policy"
-    },
-    "ProjectCreationStatus": {
-      "description": "A status object which is used as the `metadata` field for the Operation\nreturned by CreateProject. It provides insight for when significant phases of\nProject creation have completed.",
-      "type": "object",
-      "properties": {
-        "ready": {
-          "description": "True if the project creation process is complete.",
-          "type": "boolean"
-        },
-        "gettable": {
-          "description": "True if the project can be retrieved using GetProject. No other operations\non the project are guaranteed to work until the project creation is\ncomplete.",
-          "type": "boolean"
+        "parent": {
+          "description": "An optional reference to a parent Resource.\n\nThe only supported parent type is \"organization\". Once set, the parent\ncannot be modified. The `parent` can be set on creation or using the\n`UpdateProject` method; the end user must have the\n`resourcemanager.projects.create` permission on the parent.\n\nRead-write.",
+          "$ref": "ResourceId"
         },
         "createTime": {
-          "description": "Creation time of the project creation workflow.",
-          "type": "string",
-          "format": "google-datetime"
+          "description": "Creation time.\n\nRead-only.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "The labels associated with this Project.\n\nLabel keys must be between 1 and 63 characters long and must conform\nto the following regular expression: \\[a-z\\](\\[-a-z0-9\\]*\\[a-z0-9\\])?.\n\nLabel values must be between 0 and 63 characters long and must conform\nto the regular expression (\\[a-z\\](\\[-a-z0-9\\]*\\[a-z0-9\\])?)?.\n\nNo more than 256 labels can be associated with a given resource.\n\nClients should store labels in a representation such as JSON that does not\ndepend on specific characters being disallowed.\n\nExample: \u003ccode\u003e\"environment\" : \"dev\"\u003c/code\u003e\nRead-write.",
+          "type": "object"
+        },
+        "name": {
+          "description": "The user-assigned display name of the Project.\nIt must be 4 to 30 characters.\nAllowed characters are: lowercase and uppercase letters, numbers,\nhyphen, single-quote, double-quote, space, and exclamation point.\n\nExample: \u003ccode\u003eMy Project\u003c/code\u003e\nRead-write.",
+          "type": "string"
         }
       },
-      "id": "ProjectCreationStatus"
+      "id": "Project"
     },
     "TestIamPermissionsRequest": {
-      "description": "Request message for `TestIamPermissions` method.",
-      "type": "object",
       "properties": {
         "permissions": {
           "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
@@ -694,264 +748,210 @@
           }
         }
       },
-      "id": "TestIamPermissionsRequest"
+      "id": "TestIamPermissionsRequest",
+      "description": "Request message for `TestIamPermissions` method.",
+      "type": "object"
     },
-    "ListOrganizationsResponse": {
-      "description": "The response returned from the `ListOrganizations` method.",
+    "FolderOperationError": {
+      "description": "A classification of the Folder Operation error.",
       "type": "object",
       "properties": {
-        "organizations": {
-          "description": "The list of Organizations that matched the list query, possibly paginated.",
+        "errorMessageId": {
+          "type": "string",
+          "enumDescriptions": [
+            "The error type was unrecognized or unspecified.",
+            "The attempted action would violate the max folder depth constraint.",
+            "The attempted action would violate the max child folders constraint.",
+            "The attempted action would violate the locally-unique folder\ndisplay_name constraint.",
+            "The resource being moved has been deleted.",
+            "The resource a folder was being added to has been deleted.",
+            "The attempted action would introduce cycle in resource path.",
+            "The attempted action would move a folder that is already being moved.",
+            "The folder the caller is trying to delete contains active resources."
+          ],
+          "enum": [
+            "ERROR_TYPE_UNSPECIFIED",
+            "FOLDER_HEIGHT_VIOLATION",
+            "MAX_CHILD_FOLDERS_VIOLATION",
+            "FOLDER_NAME_UNIQUENESS_VIOLATION",
+            "RESOURCE_DELETED",
+            "PARENT_DELETED",
+            "CYCLE_INTRODUCED_ERROR",
+            "FOLDER_ALREADY_BEING_MOVED",
+            "FOLDER_TO_DELETE_NON_EMPTY"
+          ],
+          "description": "The type of operation error experienced."
+        }
+      },
+      "id": "FolderOperationError"
+    },
+    "FolderOperation": {
+      "description": "Metadata describing a long running folder operation",
+      "type": "object",
+      "properties": {
+        "operationType": {
+          "enumDescriptions": [
+            "Operation type not specified.",
+            "A create folder operation.",
+            "A move folder operation."
+          ],
+          "enum": [
+            "OPERATION_TYPE_UNSPECIFIED",
+            "CREATE",
+            "MOVE"
+          ],
+          "description": "The type of this operation.",
+          "type": "string"
+        },
+        "displayName": {
+          "description": "The display name of the folder.",
+          "type": "string"
+        },
+        "sourceParent": {
+          "description": "The resource name of the folder's parent.\nOnly applicable when the operation_type is MOVE.",
+          "type": "string"
+        },
+        "destinationParent": {
+          "type": "string",
+          "description": "The resource name of the folder or organization we are either creating\nthe folder under or moving the folder to."
+        }
+      },
+      "id": "FolderOperation"
+    },
+    "Policy": {
+      "id": "Policy",
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
+      "type": "object",
+      "properties": {
+        "etag": {
+          "type": "string",
+          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
+          "format": "byte"
+        },
+        "version": {
+          "description": "Version of the `Policy`. The default version is 0.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "bindings": {
           "type": "array",
           "items": {
-            "$ref": "Organization"
-          }
+            "$ref": "Binding"
+          },
+          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error."
+        }
+      }
+    },
+    "ResourceId": {
+      "id": "ResourceId",
+      "description": "A container to reference an id for any resource type. A `resource` in Google\nCloud Platform is a generic term for something you (a developer) may want to\ninteract with through one of our API's. Some examples are an AppEngine app,\na Compute Engine instance, a Cloud SQL database, and so on.",
+      "type": "object",
+      "properties": {
+        "type": {
+          "type": "string",
+          "description": "Required field representing the resource type this id is for.\nAt present, the valid types are \"project\" and \"organization\"."
         },
-        "nextPageToken": {
-          "description": "A pagination token to be used to retrieve the next page of results. If the\nresult is too large to fit within the page size specified in the request,\nthis field will be set with a token that can be used to fetch the next page\nof results. If this field is empty, it indicates that this response\ncontains the last page of results.",
+        "id": {
+          "description": "Required field for the type-specific id. This should correspond to the id\nused in the type-specific API's.",
           "type": "string"
         }
-      },
-      "id": "ListOrganizationsResponse"
-    },
-    "GetAncestryRequest": {
-      "description": "The request sent to the\nGetAncestry\nmethod.",
-      "type": "object",
-      "properties": {},
-      "id": "GetAncestryRequest"
-    },
-    "GetAncestryResponse": {
-      "description": "Response from the GetAncestry method.",
-      "type": "object",
-      "properties": {
-        "ancestor": {
-          "description": "Ancestors are ordered from bottom to top of the resource hierarchy. The\nfirst ancestor is the project itself, followed by the project's parent,\netc.",
-          "type": "array",
-          "items": {
-            "$ref": "Ancestor"
-          }
-        }
-      },
-      "id": "GetAncestryResponse"
-    },
-    "Empty": {
-      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
-      "type": "object",
-      "properties": {},
-      "id": "Empty"
+      }
     },
     "Ancestor": {
       "description": "Identifying information for a single ancestor of a project.",
       "type": "object",
       "properties": {
         "resourceId": {
-          "description": "Resource id of the ancestor.",
-          "$ref": "ResourceId"
+          "$ref": "ResourceId",
+          "description": "Resource id of the ancestor."
         }
       },
       "id": "Ancestor"
     },
-    "ResourceId": {
-      "description": "A container to reference an id for any resource type. A `resource` in Google\nCloud Platform is a generic term for something you (a developer) may want to\ninteract with through one of our API's. Some examples are an AppEngine app,\na Compute Engine instance, a Cloud SQL database, and so on.",
+    "SetIamPolicyRequest": {
+      "description": "Request message for `SetIamPolicy` method.",
       "type": "object",
       "properties": {
-        "type": {
-          "description": "Required field representing the resource type this id is for.\nAt present, the valid types are \"project\" and \"organization\".",
-          "type": "string"
-        },
-        "id": {
-          "description": "Required field for the type-specific id. This should correspond to the id\nused in the type-specific API's.",
-          "type": "string"
+        "policy": {
+          "$ref": "Policy",
+          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them."
         }
       },
-      "id": "ResourceId"
+      "id": "SetIamPolicyRequest"
     },
-    "Project": {
-      "description": "A Project is a high-level Google Cloud Platform entity.  It is a\ncontainer for ACLs, APIs, AppEngine Apps, VMs, and other\nGoogle Cloud Platform resources.",
+    "ListOrganizationsResponse": {
       "type": "object",
       "properties": {
-        "parent": {
-          "description": "An optional reference to a parent Resource.\n\nThe only supported parent type is \"organization\". Once set, the parent\ncannot be modified. The `parent` can be set on creation or using the\n`UpdateProject` method; the end user must have the\n`resourcemanager.projects.create` permission on the parent.\n\nRead-write.",
-          "$ref": "ResourceId"
-        },
-        "labels": {
-          "description": "The labels associated with this Project.\n\nLabel keys must be between 1 and 63 characters long and must conform\nto the following regular expression: \\[a-z\\](\\[-a-z0-9\\]*\\[a-z0-9\\])?.\n\nLabel values must be between 0 and 63 characters long and must conform\nto the regular expression (\\[a-z\\](\\[-a-z0-9\\]*\\[a-z0-9\\])?)?.\n\nNo more than 256 labels can be associated with a given resource.\n\nClients should store labels in a representation such as JSON that does not\ndepend on specific characters being disallowed.\n\nExample: \u003ccode\u003e\"environment\" : \"dev\"\u003c/code\u003e\nRead-write.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "lifecycleState": {
-          "description": "The Project lifecycle state.\n\nRead-only.",
-          "enum": [
-            "LIFECYCLE_STATE_UNSPECIFIED",
-            "ACTIVE",
-            "DELETE_REQUESTED",
-            "DELETE_IN_PROGRESS"
-          ],
-          "enumDescriptions": [
-            "Unspecified state.  This is only used/useful for distinguishing\nunset values.",
-            "The normal and active state.",
-            "The project has been marked for deletion by the user\n(by invoking DeleteProject)\nor by the system (Google Cloud Platform).\nThis can generally be reversed by invoking UndeleteProject.",
-            "This lifecycle state is no longer used and is not returned by the API."
-          ],
+        "nextPageToken": {
+          "description": "A pagination token to be used to retrieve the next page of results. If the\nresult is too large to fit within the page size specified in the request,\nthis field will be set with a token that can be used to fetch the next page\nof results. If this field is empty, it indicates that this response\ncontains the last page of results.",
           "type": "string"
         },
-        "createTime": {
-          "description": "Creation time.\n\nRead-only.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "name": {
-          "description": "The user-assigned display name of the Project.\nIt must be 4 to 30 characters.\nAllowed characters are: lowercase and uppercase letters, numbers,\nhyphen, single-quote, double-quote, space, and exclamation point.\n\nExample: \u003ccode\u003eMy Project\u003c/code\u003e\nRead-write.",
-          "type": "string"
-        },
-        "projectNumber": {
-          "description": "The number uniquely identifying the project.\n\nExample: \u003ccode\u003e415104041262\u003c/code\u003e\nRead-only.",
-          "type": "string",
-          "format": "int64"
-        },
-        "projectId": {
-          "description": "The unique, user-assigned ID of the Project.\nIt must be 6 to 30 lowercase letters, digits, or hyphens.\nIt must start with a letter.\nTrailing hyphens are prohibited.\n\nExample: \u003ccode\u003etokyo-rain-123\u003c/code\u003e\nRead-only after creation.",
-          "type": "string"
+        "organizations": {
+          "description": "The list of Organizations that matched the list query, possibly paginated.",
+          "type": "array",
+          "items": {
+            "$ref": "Organization"
+          }
         }
       },
-      "id": "Project"
+      "id": "ListOrganizationsResponse",
+      "description": "The response returned from the `ListOrganizations` method."
     },
     "Binding": {
+      "id": "Binding",
       "description": "Associates `members` with a `role`.",
       "type": "object",
       "properties": {
         "members": {
-          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
           "type": "array",
           "items": {
             "type": "string"
-          }
+          },
+          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n"
         },
         "role": {
-          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
-          "type": "string"
+          "type": "string",
+          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired"
         }
-      },
-      "id": "Binding"
+      }
     },
-    "OrganizationOwner": {
-      "description": "The entity that owns an Organization. The lifetime of the Organization and\nall of its descendants are bound to the `OrganizationOwner`. If the\n`OrganizationOwner` is deleted, the Organization and all its descendants will\nbe deleted.",
+    "Empty": {
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
       "type": "object",
-      "properties": {
-        "directoryCustomerId": {
-          "description": "The Google for Work customer id used in the Directory API.",
-          "type": "string"
-        }
-      },
-      "id": "OrganizationOwner"
+      "properties": {},
+      "id": "Empty"
     }
   },
-  "revision": "20170122",
-  "basePath": "",
   "icons": {
-    "x32": "http://www.google.com/images/icons/product/search-32.gif",
-    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
   },
-  "canonicalName": "Cloud Resource Manager",
-  "discoveryVersion": "v1",
+  "protocol": "rest",
+  "version": "v1beta1",
   "baseUrl": "https://cloudresourcemanager.googleapis.com/",
-  "name": "cloudresourcemanager",
-  "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
+  "canonicalName": "Cloud Resource Manager",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform.read-only": {
+          "description": "View your data across Google Cloud Platform services"
+        },
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
     }
   },
-  "documentationLink": "https://cloud.google.com/resource-manager",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
+  "kind": "discovery#restDescription",
+  "description": "The Google Cloud Resource Manager API provides methods for creating, reading, and updating project metadata.",
   "servicePath": "",
-  "ownerName": "Google",
-  "version": "v1beta1",
   "rootUrl": "https://cloudresourcemanager.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "cloudresourcemanager",
+  "batchPath": "batch",
+  "id": "cloudresourcemanager:v1beta1",
+  "documentationLink": "https://cloud.google.com/resource-manager",
+  "revision": "20170206",
+  "title": "Google Cloud Resource Manager API"
 }
diff --git a/cloudresourcemanager/v1beta1/cloudresourcemanager-gen.go b/cloudresourcemanager/v1beta1/cloudresourcemanager-gen.go
index 5163131..03504f8 100644
--- a/cloudresourcemanager/v1beta1/cloudresourcemanager-gen.go
+++ b/cloudresourcemanager/v1beta1/cloudresourcemanager-gen.go
@@ -65,9 +65,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Organizations *OrganizationsService
 
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewOrganizationsService(s *Service) *OrganizationsService {
 	rs := &OrganizationsService{s: s}
 	return rs
@@ -1038,6 +1043,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1178,6 +1184,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.getiampolicyrequest)
 	if err != nil {
@@ -1367,6 +1374,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1527,6 +1535,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -1665,6 +1674,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -1802,6 +1812,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.organization)
 	if err != nil {
@@ -1952,6 +1963,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.project)
 	if err != nil {
@@ -2104,6 +2116,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/projects/{projectId}")
@@ -2242,6 +2255,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2377,6 +2391,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.getancestryrequest)
 	if err != nil {
@@ -2514,6 +2529,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.getiampolicyrequest)
 	if err != nil {
@@ -2707,6 +2723,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2914,6 +2931,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -3049,6 +3067,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -3192,6 +3211,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.undeleteprojectrequest)
 	if err != nil {
@@ -3330,6 +3350,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.project)
 	if err != nil {
diff --git a/cloudtrace/v1/cloudtrace-api.json b/cloudtrace/v1/cloudtrace-api.json
index fd8cc0f..97bca1c 100644
--- a/cloudtrace/v1/cloudtrace-api.json
+++ b/cloudtrace/v1/cloudtrace-api.json
@@ -1,362 +1,383 @@
 {
- "kind": "discovery#restDescription",
- "etag": "\"C5oy1hgQsABtYOYIOXWcR3BgYqU/avS4leRd3oaImhwLi14P2pt74p0\"",
- "discoveryVersion": "v1",
- "id": "cloudtrace:v1",
- "name": "cloudtrace",
- "canonicalName": "Cloud Trace",
- "version": "v1",
- "revision": "20160518",
- "title": "Google Cloud Trace API",
- "description": "Send and retrieve trace data from Google Cloud Trace. Data is generated and available by default for all App Engine applications. Data from other applications can be written to Cloud Trace for display, reporting, and analysis.",
- "ownerDomain": "google.com",
- "ownerName": "Google",
- "icons": {
-  "x16": "http://www.google.com/images/icons/product/search-16.gif",
-  "x32": "http://www.google.com/images/icons/product/search-32.gif"
- },
- "documentationLink": "https://cloud.google.com/tools/cloud-trace",
- "protocol": "rest",
- "baseUrl": "https://cloudtrace.googleapis.com/",
- "basePath": "",
- "rootUrl": "https://cloudtrace.googleapis.com/",
- "servicePath": "",
- "batchPath": "batch",
- "version_module": true,
- "parameters": {
-  "access_token": {
-   "type": "string",
-   "description": "OAuth access token.",
-   "location": "query"
-  },
-  "alt": {
-   "type": "string",
-   "description": "Data format for response.",
-   "default": "json",
-   "enumDescriptions": [
-    "Responses with Content-Type of application/json",
-    "Media download with context-dependent Content-Type",
-    "Responses with Content-Type of application/x-protobuf"
-   ],
-   "location": "query"
-  },
-  "bearer_token": {
-   "type": "string",
-   "description": "OAuth bearer token.",
-   "location": "query"
-  },
-  "callback": {
-   "type": "string",
-   "description": "JSONP",
-   "location": "query"
-  },
-  "fields": {
-   "type": "string",
-   "description": "Selector specifying which fields to include in a partial response.",
-   "location": "query"
-  },
-  "key": {
-   "type": "string",
-   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-   "location": "query"
-  },
-  "oauth_token": {
-   "type": "string",
-   "description": "OAuth 2.0 token for the current user.",
-   "location": "query"
-  },
-  "pp": {
-   "type": "boolean",
-   "description": "Pretty-print response.",
-   "default": "true",
-   "location": "query"
-  },
-  "prettyPrint": {
-   "type": "boolean",
-   "description": "Returns response with indentations and line breaks.",
-   "default": "true",
-   "location": "query"
-  },
-  "quotaUser": {
-   "type": "string",
-   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-   "location": "query"
-  },
-  "upload_protocol": {
-   "type": "string",
-   "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-   "location": "query"
-  },
-  "uploadType": {
-   "type": "string",
-   "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-   "location": "query"
-  },
-  "$.xgafv": {
-   "type": "string",
-   "description": "V1 error format.",
-   "enumDescriptions": [
-    "v1 error format",
-    "v2 error format"
-   ],
-   "location": "query"
-  }
- },
- "auth": {
-  "oauth2": {
-   "scopes": {
-    "https://www.googleapis.com/auth/cloud-platform": {
-     "description": "View and manage your data across Google Cloud Platform services"
-    },
-    "https://www.googleapis.com/auth/trace.append": {
-     "description": "Write Trace data for a project or application"
-    },
-    "https://www.googleapis.com/auth/trace.readonly": {
-     "description": "Read Trace data for a project or application"
-    }
-   }
-  }
- },
- "schemas": {
-  "ListTracesResponse": {
-   "id": "ListTracesResponse",
-   "type": "object",
-   "description": "The response message for the `ListTraces` method.",
-   "properties": {
-    "traces": {
-     "type": "array",
-     "description": "List of trace records returned.",
-     "items": {
-      "$ref": "Trace"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "If defined, indicates that there are more traces that match the request and that this value should be passed to the next request to continue retrieving additional traces."
-    }
-   }
-  },
-  "Trace": {
-   "id": "Trace",
-   "type": "object",
-   "description": "A trace describes how long it takes for an application to perform an operation. It consists of a set of spans, each of which represent a single timed event within the operation.",
-   "properties": {
-    "projectId": {
-     "type": "string",
-     "description": "Project ID of the Cloud project where the trace data is stored."
-    },
-    "traceId": {
-     "type": "string",
-     "description": "Globally unique identifier for the trace. This identifier is a 128-bit numeric value formatted as a 32-byte hex string."
-    },
-    "spans": {
-     "type": "array",
-     "description": "Collection of spans in the trace.",
-     "items": {
-      "$ref": "TraceSpan"
-     }
-    }
-   }
-  },
-  "TraceSpan": {
-   "id": "TraceSpan",
-   "type": "object",
-   "description": "A span represents a single timed event within a trace. Spans can be nested and form a trace tree. Often, a trace contains a root span that describes the end-to-end latency of an operation and, optionally, one or more subspans for its suboperations. Spans do not need to be contiguous. There may be gaps between spans in a trace.",
-   "properties": {
-    "spanId": {
-     "type": "string",
-     "description": "Identifier for the span. This identifier must be unique within a trace.",
-     "format": "uint64"
-    },
-    "kind": {
-     "type": "string",
-     "description": "Distinguishes between spans generated in a particular context. For example, two spans with the same name may be distinguished using `RPC_CLIENT` and `RPC_SERVER` to identify queueing latency associated with the span.",
-     "enum": [
-      "SPAN_KIND_UNSPECIFIED",
-      "RPC_SERVER",
-      "RPC_CLIENT"
-     ]
-    },
-    "name": {
-     "type": "string",
-     "description": "Name of the trace. The trace name is sanitized and displayed in the Stackdriver Trace tool in the {% dynamic print site_values.console_name %}. The name may be a method name or some other per-call site name. For the same executable and the same call point, a best practice is to use a consistent name, which makes it easier to correlate cross-trace spans."
-    },
-    "startTime": {
-     "type": "string",
-     "description": "Start time of the span in nanoseconds from the UNIX epoch."
-    },
-    "endTime": {
-     "type": "string",
-     "description": "End time of the span in nanoseconds from the UNIX epoch."
-    },
-    "parentSpanId": {
-     "type": "string",
-     "description": "ID of the parent span, if any. Optional.",
-     "format": "uint64"
-    },
-    "labels": {
-     "type": "object",
-     "description": "Collection of labels associated with the span.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "Traces": {
-   "id": "Traces",
-   "type": "object",
-   "description": "List of new or updated traces.",
-   "properties": {
-    "traces": {
-     "type": "array",
-     "description": "List of traces.",
-     "items": {
-      "$ref": "Trace"
-     }
-    }
-   }
-  },
-  "Empty": {
-   "id": "Empty",
-   "type": "object",
-   "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance: service Foo { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); } The JSON representation for `Empty` is empty JSON object `{}`."
-  }
- },
- "resources": {
-  "projects": {
-   "methods": {
-    "patchTraces": {
-     "id": "cloudtrace.projects.patchTraces",
-     "path": "v1/projects/{projectId}/traces",
-     "httpMethod": "PATCH",
-     "description": "Sends new traces to Stackdriver Trace or updates existing traces. If the ID of a trace that you send matches that of an existing trace, any fields in the existing trace and its spans are overwritten by the provided values, and any new fields provided are merged with the existing trace data. If the ID does not match, a new trace is created.",
-     "parameters": {
-      "projectId": {
-       "type": "string",
-       "description": "ID of the Cloud project where the trace data is stored.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "projectId"
-     ],
-     "request": {
-      "$ref": "Traces"
-     },
-     "response": {
-      "$ref": "Empty"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/trace.append"
-     ]
-    }
-   },
-   "resources": {
-    "traces": {
-     "methods": {
-      "list": {
-       "id": "cloudtrace.projects.traces.list",
-       "path": "v1/projects/{projectId}/traces",
-       "httpMethod": "GET",
-       "description": "Returns of a list of traces that match the specified filter conditions.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "ID of the Cloud project where the trace data is stored.",
-         "required": true,
-         "location": "path"
+  "id": "cloudtrace:v1",
+  "revision": "20170208",
+  "documentationLink": "https://cloud.google.com/trace",
+  "discoveryVersion": "v1",
+  "version_module": "True",
+  "schemas": {
+    "TraceSpan": {
+      "description": "A span represents a single timed event within a trace. Spans can be nested\nand form a trace tree. Often, a trace contains a root span that describes the\nend-to-end latency of an operation and, optionally, one or more subspans for\nits suboperations. Spans do not need to be contiguous. There may be gaps\nbetween spans in a trace.",
+      "type": "object",
+      "properties": {
+        "spanId": {
+          "type": "string",
+          "description": "Identifier for the span. Must be a 64-bit integer other than 0 and\nunique within a trace.",
+          "format": "uint64"
         },
-        "view": {
-         "type": "string",
-         "description": "Type of data returned for traces in the list. Optional. Default is `MINIMAL`.",
-         "enum": [
-          "VIEW_TYPE_UNSPECIFIED",
-          "MINIMAL",
-          "ROOTSPAN",
-          "COMPLETE"
-         ],
-         "location": "query"
-        },
-        "pageSize": {
-         "type": "integer",
-         "description": "Maximum number of traces to return. If not specified or \u003c= 0, the implementation selects a reasonable value. The implementation may return fewer traces than the requested page size. Optional.",
-         "format": "int32",
-         "location": "query"
-        },
-        "pageToken": {
-         "type": "string",
-         "description": "Token identifying the page of results to return. If provided, use the value of the `next_page_token` field from a previous request. Optional.",
-         "location": "query"
-        },
-        "startTime": {
-         "type": "string",
-         "description": "End of the time interval (inclusive) during which the trace data was collected from the application.",
-         "location": "query"
+        "parentSpanId": {
+          "description": "ID of the parent span, if any. Optional.",
+          "format": "uint64",
+          "type": "string"
         },
         "endTime": {
-         "type": "string",
-         "description": "Start of the time interval (inclusive) during which the trace data was collected from the application.",
-         "location": "query"
+          "type": "string",
+          "description": "End time of the span in nanoseconds from the UNIX epoch.",
+          "format": "google-datetime"
         },
-        "filter": {
-         "type": "string",
-         "description": "An optional filter for the request.",
-         "location": "query"
+        "startTime": {
+          "description": "Start time of the span in nanoseconds from the UNIX epoch.",
+          "format": "google-datetime",
+          "type": "string"
         },
-        "orderBy": {
-         "type": "string",
-         "description": "Field used to sort the returned traces. Optional. Can be one of the following: * `trace_id` * `name` (`name` field of root span in the trace) * `duration` (difference between `end_time` and `start_time` fields of the root span) * `start` (`start_time` field of the root span) Descending order can be specified by appending `desc` to the sort field (for example, `name desc`). Only one sort field is permitted.",
-         "location": "query"
+        "kind": {
+          "description": "Distinguishes between spans generated in a particular context. For example,\ntwo spans with the same name may be distinguished using `RPC_CLIENT`\nand `RPC_SERVER` to identify queueing latency associated with the span.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified.",
+            "Indicates that the span covers server-side handling of an RPC or other\nremote network request.",
+            "Indicates that the span covers the client-side wrapper around an RPC or\nother remote request."
+          ],
+          "enum": [
+            "SPAN_KIND_UNSPECIFIED",
+            "RPC_SERVER",
+            "RPC_CLIENT"
+          ]
+        },
+        "labels": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Collection of labels associated with the span. Label keys must be less than\n128 bytes. Label values must be less than 16 kilobytes."
+        },
+        "name": {
+          "description": "Name of the span. Must be less than 128 bytes. The span name is sanitized\nand displayed in the Stackdriver Trace tool in the\n{% dynamic print site_values.console_name %}.\nThe name may be a method name or some other per-call site name.\nFor the same executable and the same call point, a best practice is\nto use a consistent name, which makes it easier to correlate\ncross-trace spans.",
+          "type": "string"
         }
-       },
-       "parameterOrder": [
-        "projectId"
-       ],
-       "response": {
-        "$ref": "ListTracesResponse"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform",
-        "https://www.googleapis.com/auth/trace.readonly"
-       ]
       },
-      "get": {
-       "id": "cloudtrace.projects.traces.get",
-       "path": "v1/projects/{projectId}/traces/{traceId}",
-       "httpMethod": "GET",
-       "description": "Gets a single trace by its ID.",
-       "parameters": {
+      "id": "TraceSpan"
+    },
+    "ListTracesResponse": {
+      "description": "The response message for the `ListTraces` method.",
+      "type": "object",
+      "properties": {
+        "traces": {
+          "description": "List of trace records returned.",
+          "type": "array",
+          "items": {
+            "$ref": "Trace"
+          }
+        },
+        "nextPageToken": {
+          "description": "If defined, indicates that there are more traces that match the request\nand that this value should be passed to the next request to continue\nretrieving additional traces.",
+          "type": "string"
+        }
+      },
+      "id": "ListTracesResponse"
+    },
+    "Empty": {
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
+      "type": "object",
+      "properties": {},
+      "id": "Empty"
+    },
+    "Trace": {
+      "description": "A trace describes how long it takes for an application to perform an\noperation. It consists of a set of spans, each of which represent a single\ntimed event within the operation.",
+      "type": "object",
+      "properties": {
         "projectId": {
-         "type": "string",
-         "description": "ID of the Cloud project where the trace data is stored.",
-         "required": true,
-         "location": "path"
+          "description": "Project ID of the Cloud project where the trace data is stored.",
+          "type": "string"
+        },
+        "spans": {
+          "description": "Collection of spans in the trace.",
+          "type": "array",
+          "items": {
+            "$ref": "TraceSpan"
+          }
         },
         "traceId": {
-         "type": "string",
-         "description": "ID of the trace to return.",
-         "required": true,
-         "location": "path"
+          "description": "Globally unique identifier for the trace. This identifier is a 128-bit\nnumeric value formatted as a 32-byte hex string.",
+          "type": "string"
         }
-       },
-       "parameterOrder": [
-        "projectId",
-        "traceId"
-       ],
-       "response": {
-        "$ref": "Trace"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform",
-        "https://www.googleapis.com/auth/trace.readonly"
-       ]
-      }
-     }
+      },
+      "id": "Trace"
+    },
+    "Traces": {
+      "description": "List of new or updated traces.",
+      "type": "object",
+      "properties": {
+        "traces": {
+          "type": "array",
+          "items": {
+            "$ref": "Trace"
+          },
+          "description": "List of traces."
+        }
+      },
+      "id": "Traces"
     }
-   }
-  }
- }
+  },
+  "icons": {
+    "x32": "http://www.google.com/images/icons/product/search-32.gif",
+    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+  },
+  "protocol": "rest",
+  "canonicalName": "Cloud Trace",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/trace.readonly": {
+          "description": "Read Trace data for a project or application"
+        },
+        "https://www.googleapis.com/auth/trace.append": {
+          "description": "Write Trace data for a project or application"
+        },
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
+    }
+  },
+  "rootUrl": "https://cloudtrace.googleapis.com/",
+  "ownerDomain": "google.com",
+  "name": "cloudtrace",
+  "batchPath": "batch",
+  "title": "Stackdriver Trace API",
+  "ownerName": "Google",
+  "resources": {
+    "projects": {
+      "methods": {
+        "patchTraces": {
+          "description": "Sends new traces to Stackdriver Trace or updates existing traces. If the ID\nof a trace that you send matches that of an existing trace, any fields\nin the existing trace and its spans are overwritten by the provided values,\nand any new fields provided are merged with the existing trace data. If the\nID does not match, a new trace is created.",
+          "request": {
+            "$ref": "Traces"
+          },
+          "httpMethod": "PATCH",
+          "parameterOrder": [
+            "projectId"
+          ],
+          "response": {
+            "$ref": "Empty"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/trace.append"
+          ],
+          "parameters": {
+            "projectId": {
+              "required": true,
+              "type": "string",
+              "location": "path",
+              "description": "ID of the Cloud project where the trace data is stored."
+            }
+          },
+          "flatPath": "v1/projects/{projectId}/traces",
+          "id": "cloudtrace.projects.patchTraces",
+          "path": "v1/projects/{projectId}/traces"
+        }
+      },
+      "resources": {
+        "traces": {
+          "methods": {
+            "list": {
+              "response": {
+                "$ref": "ListTracesResponse"
+              },
+              "parameterOrder": [
+                "projectId"
+              ],
+              "httpMethod": "GET",
+              "parameters": {
+                "orderBy": {
+                  "location": "query",
+                  "description": "Field used to sort the returned traces. Optional.\nCan be one of the following:\n\n*   `trace_id`\n*   `name` (`name` field of root span in the trace)\n*   `duration` (difference between `end_time` and `start_time` fields of\n     the root span)\n*   `start` (`start_time` field of the root span)\n\nDescending order can be specified by appending `desc` to the sort field\n(for example, `name desc`).\n\nOnly one sort field is permitted.",
+                  "type": "string"
+                },
+                "projectId": {
+                  "location": "path",
+                  "description": "ID of the Cloud project where the trace data is stored.",
+                  "required": true,
+                  "type": "string"
+                },
+                "filter": {
+                  "description": "An optional filter for the request.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "endTime": {
+                  "location": "query",
+                  "description": "Start of the time interval (inclusive) during which the trace data was\ncollected from the application.",
+                  "format": "google-datetime",
+                  "type": "string"
+                },
+                "pageToken": {
+                  "type": "string",
+                  "location": "query",
+                  "description": "Token identifying the page of results to return. If provided, use the\nvalue of the `next_page_token` field from a previous request. Optional."
+                },
+                "startTime": {
+                  "location": "query",
+                  "description": "End of the time interval (inclusive) during which the trace data was\ncollected from the application.",
+                  "format": "google-datetime",
+                  "type": "string"
+                },
+                "pageSize": {
+                  "description": "Maximum number of traces to return. If not specified or \u003c= 0, the\nimplementation selects a reasonable value.  The implementation may\nreturn fewer traces than the requested page size. Optional.",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                },
+                "view": {
+                  "location": "query",
+                  "enum": [
+                    "VIEW_TYPE_UNSPECIFIED",
+                    "MINIMAL",
+                    "ROOTSPAN",
+                    "COMPLETE"
+                  ],
+                  "description": "Type of data returned for traces in the list. Optional. Default is\n`MINIMAL`.",
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/trace.readonly"
+              ],
+              "flatPath": "v1/projects/{projectId}/traces",
+              "path": "v1/projects/{projectId}/traces",
+              "id": "cloudtrace.projects.traces.list",
+              "description": "Returns of a list of traces that match the specified filter conditions."
+            },
+            "get": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "projectId",
+                "traceId"
+              ],
+              "response": {
+                "$ref": "Trace"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/trace.readonly"
+              ],
+              "parameters": {
+                "projectId": {
+                  "description": "ID of the Cloud project where the trace data is stored.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                },
+                "traceId": {
+                  "required": true,
+                  "type": "string",
+                  "location": "path",
+                  "description": "ID of the trace to return."
+                }
+              },
+              "flatPath": "v1/projects/{projectId}/traces/{traceId}",
+              "id": "cloudtrace.projects.traces.get",
+              "path": "v1/projects/{projectId}/traces/{traceId}",
+              "description": "Gets a single trace by its ID."
+            }
+          }
+        }
+      }
+    }
+  },
+  "parameters": {
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "bearer_token": {
+      "type": "string",
+      "location": "query",
+      "description": "OAuth bearer token."
+    },
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    },
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query"
+    },
+    "alt": {
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query"
+    },
+    "access_token": {
+      "description": "OAuth access token.",
+      "type": "string",
+      "location": "query"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string",
+      "location": "query"
+    },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string",
+      "location": "query"
+    }
+  },
+  "version": "v1",
+  "baseUrl": "https://cloudtrace.googleapis.com/",
+  "servicePath": "",
+  "kind": "discovery#restDescription",
+  "description": "Send and retrieve trace data from Stackdriver Trace. Data is generated and available by default for all App Engine applications. Data from other applications can be written to Stackdriver Trace for display, reporting, and analysis.\n",
+  "basePath": ""
 }
diff --git a/cloudtrace/v1/cloudtrace-gen.go b/cloudtrace/v1/cloudtrace-gen.go
index 14c42d3..3d8313b 100644
--- a/cloudtrace/v1/cloudtrace-gen.go
+++ b/cloudtrace/v1/cloudtrace-gen.go
@@ -1,6 +1,6 @@
-// Package cloudtrace provides access to the Google Cloud Trace API.
+// Package cloudtrace provides access to the Stackdriver Trace API.
 //
-// See https://cloud.google.com/tools/cloud-trace
+// See https://cloud.google.com/trace
 //
 // Usage example:
 //
@@ -67,9 +67,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Traces = NewProjectsTracesService(s)
@@ -103,11 +108,17 @@
 }
 
 // Empty: A generic empty message that you can re-use to avoid defining
-// duplicated empty messages in your APIs. A typical example is to use
-// it as the request or the response type of an API method. For
-// instance: service Foo { rpc Bar(google.protobuf.Empty) returns
-// (google.protobuf.Empty); } The JSON representation for `Empty` is
-// empty JSON object `{}`.
+// duplicated
+// empty messages in your APIs. A typical example is to use it as the
+// request
+// or the response type of an API method. For instance:
+//
+//     service Foo {
+//       rpc Bar(google.protobuf.Empty) returns
+// (google.protobuf.Empty);
+//     }
+//
+// The JSON representation for `Empty` is empty JSON object `{}`.
 type Empty struct {
 	// ServerResponse contains the HTTP response code and headers from the
 	// server.
@@ -117,8 +128,10 @@
 // ListTracesResponse: The response message for the `ListTraces` method.
 type ListTracesResponse struct {
 	// NextPageToken: If defined, indicates that there are more traces that
-	// match the request and that this value should be passed to the next
-	// request to continue retrieving additional traces.
+	// match the request
+	// and that this value should be passed to the next request to
+	// continue
+	// retrieving additional traces.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
 	// Traces: List of trace records returned.
@@ -152,8 +165,10 @@
 }
 
 // Trace: A trace describes how long it takes for an application to
-// perform an operation. It consists of a set of spans, each of which
-// represent a single timed event within the operation.
+// perform an
+// operation. It consists of a set of spans, each of which represent a
+// single
+// timed event within the operation.
 type Trace struct {
 	// ProjectId: Project ID of the Cloud project where the trace data is
 	// stored.
@@ -163,7 +178,8 @@
 	Spans []*TraceSpan `json:"spans,omitempty"`
 
 	// TraceId: Globally unique identifier for the trace. This identifier is
-	// a 128-bit numeric value formatted as a 32-byte hex string.
+	// a 128-bit
+	// numeric value formatted as a 32-byte hex string.
 	TraceId string `json:"traceId,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -194,41 +210,58 @@
 }
 
 // TraceSpan: A span represents a single timed event within a trace.
-// Spans can be nested and form a trace tree. Often, a trace contains a
-// root span that describes the end-to-end latency of an operation and,
-// optionally, one or more subspans for its suboperations. Spans do not
-// need to be contiguous. There may be gaps between spans in a trace.
+// Spans can be nested
+// and form a trace tree. Often, a trace contains a root span that
+// describes the
+// end-to-end latency of an operation and, optionally, one or more
+// subspans for
+// its suboperations. Spans do not need to be contiguous. There may be
+// gaps
+// between spans in a trace.
 type TraceSpan struct {
 	// EndTime: End time of the span in nanoseconds from the UNIX epoch.
 	EndTime string `json:"endTime,omitempty"`
 
 	// Kind: Distinguishes between spans generated in a particular context.
-	// For example, two spans with the same name may be distinguished using
-	// `RPC_CLIENT` and `RPC_SERVER` to identify queueing latency associated
-	// with the span.
+	// For example,
+	// two spans with the same name may be distinguished using
+	// `RPC_CLIENT`
+	// and `RPC_SERVER` to identify queueing latency associated with the
+	// span.
 	//
 	// Possible values:
-	//   "SPAN_KIND_UNSPECIFIED"
-	//   "RPC_SERVER"
-	//   "RPC_CLIENT"
+	//   "SPAN_KIND_UNSPECIFIED" - Unspecified.
+	//   "RPC_SERVER" - Indicates that the span covers server-side handling
+	// of an RPC or other
+	// remote network request.
+	//   "RPC_CLIENT" - Indicates that the span covers the client-side
+	// wrapper around an RPC or
+	// other remote request.
 	Kind string `json:"kind,omitempty"`
 
-	// Labels: Collection of labels associated with the span.
+	// Labels: Collection of labels associated with the span. Label keys
+	// must be less than
+	// 128 bytes. Label values must be less than 16 kilobytes.
 	Labels map[string]string `json:"labels,omitempty"`
 
-	// Name: Name of the trace. The trace name is sanitized and displayed in
-	// the Stackdriver Trace tool in the {% dynamic print
-	// site_values.console_name %}. The name may be a method name or some
-	// other per-call site name. For the same executable and the same call
-	// point, a best practice is to use a consistent name, which makes it
-	// easier to correlate cross-trace spans.
+	// Name: Name of the span. Must be less than 128 bytes. The span name is
+	// sanitized
+	// and displayed in the Stackdriver Trace tool in the
+	// {% dynamic print site_values.console_name %}.
+	// The name may be a method name or some other per-call site name.
+	// For the same executable and the same call point, a best practice
+	// is
+	// to use a consistent name, which makes it easier to
+	// correlate
+	// cross-trace spans.
 	Name string `json:"name,omitempty"`
 
 	// ParentSpanId: ID of the parent span, if any. Optional.
 	ParentSpanId uint64 `json:"parentSpanId,omitempty,string"`
 
-	// SpanId: Identifier for the span. This identifier must be unique
-	// within a trace.
+	// SpanId: Identifier for the span. Must be a 64-bit integer other than
+	// 0 and
+	// unique within a trace.
 	SpanId uint64 `json:"spanId,omitempty,string"`
 
 	// StartTime: Start time of the span in nanoseconds from the UNIX epoch.
@@ -297,11 +330,14 @@
 }
 
 // PatchTraces: Sends new traces to Stackdriver Trace or updates
-// existing traces. If the ID of a trace that you send matches that of
-// an existing trace, any fields in the existing trace and its spans are
-// overwritten by the provided values, and any new fields provided are
-// merged with the existing trace data. If the ID does not match, a new
-// trace is created.
+// existing traces. If the ID
+// of a trace that you send matches that of an existing trace, any
+// fields
+// in the existing trace and its spans are overwritten by the provided
+// values,
+// and any new fields provided are merged with the existing trace data.
+// If the
+// ID does not match, a new trace is created.
 func (r *ProjectsService) PatchTraces(projectId string, traces *Traces) *ProjectsPatchTracesCall {
 	c := &ProjectsPatchTracesCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.projectId = projectId
@@ -340,6 +376,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.traces)
 	if err != nil {
@@ -395,7 +432,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Sends new traces to Stackdriver Trace or updates existing traces. If the ID of a trace that you send matches that of an existing trace, any fields in the existing trace and its spans are overwritten by the provided values, and any new fields provided are merged with the existing trace data. If the ID does not match, a new trace is created.",
+	//   "description": "Sends new traces to Stackdriver Trace or updates existing traces. If the ID\nof a trace that you send matches that of an existing trace, any fields\nin the existing trace and its spans are overwritten by the provided values,\nand any new fields provided are merged with the existing trace data. If the\nID does not match, a new trace is created.",
+	//   "flatPath": "v1/projects/{projectId}/traces",
 	//   "httpMethod": "PATCH",
 	//   "id": "cloudtrace.projects.patchTraces",
 	//   "parameterOrder": [
@@ -485,6 +523,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -540,6 +579,7 @@
 	return ret, nil
 	// {
 	//   "description": "Gets a single trace by its ID.",
+	//   "flatPath": "v1/projects/{projectId}/traces/{traceId}",
 	//   "httpMethod": "GET",
 	//   "id": "cloudtrace.projects.traces.get",
 	//   "parameterOrder": [
@@ -592,8 +632,8 @@
 }
 
 // EndTime sets the optional parameter "endTime": Start of the time
-// interval (inclusive) during which the trace data was collected from
-// the application.
+// interval (inclusive) during which the trace data was
+// collected from the application.
 func (c *ProjectsTracesListCall) EndTime(endTime string) *ProjectsTracesListCall {
 	c.urlParams_.Set("endTime", endTime)
 	return c
@@ -607,44 +647,55 @@
 }
 
 // OrderBy sets the optional parameter "orderBy": Field used to sort the
-// returned traces.  Can be one of the following: * `trace_id` * `name`
-// (`name` field of root span in the trace) * `duration` (difference
-// between `end_time` and `start_time` fields of the root span) *
-// `start` (`start_time` field of the root span) Descending order can be
-// specified by appending `desc` to the sort field (for example, `name
-// desc`). Only one sort field is permitted.
+// returned traces.
+// Can be one of the following:
+//
+// *   `trace_id`
+// *   `name` (`name` field of root span in the trace)
+// *   `duration` (difference between `end_time` and `start_time` fields
+// of
+//      the root span)
+// *   `start` (`start_time` field of the root span)
+//
+// Descending order can be specified by appending `desc` to the sort
+// field
+// (for example, `name desc`).
+//
+// Only one sort field is permitted.
 func (c *ProjectsTracesListCall) OrderBy(orderBy string) *ProjectsTracesListCall {
 	c.urlParams_.Set("orderBy", orderBy)
 	return c
 }
 
 // PageSize sets the optional parameter "pageSize": Maximum number of
-// traces to return. If not specified or <= 0, the implementation
-// selects a reasonable value. The implementation may return fewer
-// traces than the requested page size.
+// traces to return. If not specified or <= 0, the
+// implementation selects a reasonable value.  The implementation
+// may
+// return fewer traces than the requested page size.
 func (c *ProjectsTracesListCall) PageSize(pageSize int64) *ProjectsTracesListCall {
 	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
 	return c
 }
 
 // PageToken sets the optional parameter "pageToken": Token identifying
-// the page of results to return. If provided, use the value of the
-// `next_page_token` field from a previous request.
+// the page of results to return. If provided, use the
+// value of the `next_page_token` field from a previous request.
 func (c *ProjectsTracesListCall) PageToken(pageToken string) *ProjectsTracesListCall {
 	c.urlParams_.Set("pageToken", pageToken)
 	return c
 }
 
 // StartTime sets the optional parameter "startTime": End of the time
-// interval (inclusive) during which the trace data was collected from
-// the application.
+// interval (inclusive) during which the trace data was
+// collected from the application.
 func (c *ProjectsTracesListCall) StartTime(startTime string) *ProjectsTracesListCall {
 	c.urlParams_.Set("startTime", startTime)
 	return c
 }
 
 // View sets the optional parameter "view": Type of data returned for
-// traces in the list.  Default is `MINIMAL`.
+// traces in the list.  Default is
+// `MINIMAL`.
 //
 // Possible values:
 //   "VIEW_TYPE_UNSPECIFIED"
@@ -697,6 +748,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -751,6 +803,7 @@
 	return ret, nil
 	// {
 	//   "description": "Returns of a list of traces that match the specified filter conditions.",
+	//   "flatPath": "v1/projects/{projectId}/traces",
 	//   "httpMethod": "GET",
 	//   "id": "cloudtrace.projects.traces.list",
 	//   "parameterOrder": [
@@ -758,7 +811,8 @@
 	//   ],
 	//   "parameters": {
 	//     "endTime": {
-	//       "description": "Start of the time interval (inclusive) during which the trace data was collected from the application.",
+	//       "description": "Start of the time interval (inclusive) during which the trace data was\ncollected from the application.",
+	//       "format": "google-datetime",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -768,18 +822,18 @@
 	//       "type": "string"
 	//     },
 	//     "orderBy": {
-	//       "description": "Field used to sort the returned traces. Optional. Can be one of the following: * `trace_id` * `name` (`name` field of root span in the trace) * `duration` (difference between `end_time` and `start_time` fields of the root span) * `start` (`start_time` field of the root span) Descending order can be specified by appending `desc` to the sort field (for example, `name desc`). Only one sort field is permitted.",
+	//       "description": "Field used to sort the returned traces. Optional.\nCan be one of the following:\n\n*   `trace_id`\n*   `name` (`name` field of root span in the trace)\n*   `duration` (difference between `end_time` and `start_time` fields of\n     the root span)\n*   `start` (`start_time` field of the root span)\n\nDescending order can be specified by appending `desc` to the sort field\n(for example, `name desc`).\n\nOnly one sort field is permitted.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "pageSize": {
-	//       "description": "Maximum number of traces to return. If not specified or \u003c= 0, the implementation selects a reasonable value. The implementation may return fewer traces than the requested page size. Optional.",
+	//       "description": "Maximum number of traces to return. If not specified or \u003c= 0, the\nimplementation selects a reasonable value.  The implementation may\nreturn fewer traces than the requested page size. Optional.",
 	//       "format": "int32",
 	//       "location": "query",
 	//       "type": "integer"
 	//     },
 	//     "pageToken": {
-	//       "description": "Token identifying the page of results to return. If provided, use the value of the `next_page_token` field from a previous request. Optional.",
+	//       "description": "Token identifying the page of results to return. If provided, use the\nvalue of the `next_page_token` field from a previous request. Optional.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -790,12 +844,13 @@
 	//       "type": "string"
 	//     },
 	//     "startTime": {
-	//       "description": "End of the time interval (inclusive) during which the trace data was collected from the application.",
+	//       "description": "End of the time interval (inclusive) during which the trace data was\ncollected from the application.",
+	//       "format": "google-datetime",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "view": {
-	//       "description": "Type of data returned for traces in the list. Optional. Default is `MINIMAL`.",
+	//       "description": "Type of data returned for traces in the list. Optional. Default is\n`MINIMAL`.",
 	//       "enum": [
 	//         "VIEW_TYPE_UNSPECIFIED",
 	//         "MINIMAL",
diff --git a/clouduseraccounts/v0.alpha/clouduseraccounts-gen.go b/clouduseraccounts/v0.alpha/clouduseraccounts-gen.go
index 69c6533..146811c 100644
--- a/clouduseraccounts/v0.alpha/clouduseraccounts-gen.go
+++ b/clouduseraccounts/v0.alpha/clouduseraccounts-gen.go
@@ -73,9 +73,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	GlobalAccountsOperations *GlobalAccountsOperationsService
 
@@ -93,6 +94,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewGlobalAccountsOperationsService(s *Service) *GlobalAccountsOperationsService {
 	rs := &GlobalAccountsOperationsService{s: s}
 	return rs
@@ -1471,6 +1476,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}")
@@ -1590,6 +1596,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1811,6 +1818,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1990,6 +1998,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.groupsaddmemberrequest)
 	if err != nil {
@@ -2134,6 +2143,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/groups/{groupName}")
@@ -2281,6 +2291,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2434,6 +2445,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2576,6 +2588,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
 	if err != nil {
@@ -2791,6 +2804,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2970,6 +2984,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.groupsremovememberrequest)
 	if err != nil {
@@ -3117,6 +3132,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
 	if err != nil {
@@ -3266,6 +3282,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -3423,6 +3440,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/authorizedKeysView/{user}")
@@ -3655,6 +3673,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/linuxAccountViews")
@@ -3828,6 +3847,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.publickey)
 	if err != nil {
@@ -3972,6 +3992,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/users/{user}")
@@ -4119,6 +4140,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4272,6 +4294,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4414,6 +4437,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
 	if err != nil {
@@ -4629,6 +4653,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4807,6 +4832,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/users/{user}/removePublicKey")
@@ -4954,6 +4980,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
 	if err != nil {
@@ -5103,6 +5130,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
diff --git a/clouduseraccounts/v0.beta/clouduseraccounts-gen.go b/clouduseraccounts/v0.beta/clouduseraccounts-gen.go
index 7a9896e..05b52c2 100644
--- a/clouduseraccounts/v0.beta/clouduseraccounts-gen.go
+++ b/clouduseraccounts/v0.beta/clouduseraccounts-gen.go
@@ -73,9 +73,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	GlobalAccountsOperations *GlobalAccountsOperationsService
 
@@ -93,6 +94,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewGlobalAccountsOperationsService(s *Service) *GlobalAccountsOperationsService {
 	rs := &GlobalAccountsOperationsService{s: s}
 	return rs
@@ -1045,6 +1050,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}")
@@ -1164,6 +1170,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1385,6 +1392,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1564,6 +1572,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.groupsaddmemberrequest)
 	if err != nil {
@@ -1708,6 +1717,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/groups/{groupName}")
@@ -1855,6 +1865,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1997,6 +2008,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
 	if err != nil {
@@ -2212,6 +2224,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2391,6 +2404,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.groupsremovememberrequest)
 	if err != nil {
@@ -2546,6 +2560,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/authorizedKeysView/{user}")
@@ -2778,6 +2793,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/linuxAccountViews")
@@ -2951,6 +2967,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.publickey)
 	if err != nil {
@@ -3095,6 +3112,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/users/{user}")
@@ -3242,6 +3260,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3384,6 +3403,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
 	if err != nil {
@@ -3599,6 +3619,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3777,6 +3798,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/users/{user}/removePublicKey")
diff --git a/clouduseraccounts/vm_alpha/clouduseraccounts-gen.go b/clouduseraccounts/vm_alpha/clouduseraccounts-gen.go
index ccd9a8d..929d779 100644
--- a/clouduseraccounts/vm_alpha/clouduseraccounts-gen.go
+++ b/clouduseraccounts/vm_alpha/clouduseraccounts-gen.go
@@ -73,9 +73,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	GlobalAccountsOperations *GlobalAccountsOperationsService
 
@@ -93,6 +94,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewGlobalAccountsOperationsService(s *Service) *GlobalAccountsOperationsService {
 	rs := &GlobalAccountsOperationsService{s: s}
 	return rs
@@ -1471,6 +1476,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}")
@@ -1590,6 +1596,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1811,6 +1818,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1990,6 +1998,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.groupsaddmemberrequest)
 	if err != nil {
@@ -2134,6 +2143,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/groups/{groupName}")
@@ -2281,6 +2291,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2434,6 +2445,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2576,6 +2588,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
 	if err != nil {
@@ -2791,6 +2804,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2970,6 +2984,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.groupsremovememberrequest)
 	if err != nil {
@@ -3117,6 +3132,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
 	if err != nil {
@@ -3266,6 +3282,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -3423,6 +3440,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/authorizedKeysView/{user}")
@@ -3655,6 +3673,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/linuxAccountViews")
@@ -3828,6 +3847,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.publickey)
 	if err != nil {
@@ -3972,6 +3992,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/users/{user}")
@@ -4119,6 +4140,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4272,6 +4294,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4414,6 +4437,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
 	if err != nil {
@@ -4629,6 +4653,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4807,6 +4832,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/users/{user}/removePublicKey")
@@ -4954,6 +4980,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
 	if err != nil {
@@ -5103,6 +5130,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
diff --git a/clouduseraccounts/vm_beta/clouduseraccounts-gen.go b/clouduseraccounts/vm_beta/clouduseraccounts-gen.go
index 5f16d89..53ef49a 100644
--- a/clouduseraccounts/vm_beta/clouduseraccounts-gen.go
+++ b/clouduseraccounts/vm_beta/clouduseraccounts-gen.go
@@ -73,9 +73,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	GlobalAccountsOperations *GlobalAccountsOperationsService
 
@@ -93,6 +94,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewGlobalAccountsOperationsService(s *Service) *GlobalAccountsOperationsService {
 	rs := &GlobalAccountsOperationsService{s: s}
 	return rs
@@ -1045,6 +1050,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}")
@@ -1164,6 +1170,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1385,6 +1392,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1564,6 +1572,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.groupsaddmemberrequest)
 	if err != nil {
@@ -1708,6 +1717,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/groups/{groupName}")
@@ -1855,6 +1865,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1997,6 +2008,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
 	if err != nil {
@@ -2212,6 +2224,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2391,6 +2404,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.groupsremovememberrequest)
 	if err != nil {
@@ -2546,6 +2560,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/authorizedKeysView/{user}")
@@ -2778,6 +2793,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/linuxAccountViews")
@@ -2951,6 +2967,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.publickey)
 	if err != nil {
@@ -3095,6 +3112,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/users/{user}")
@@ -3242,6 +3260,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3384,6 +3403,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
 	if err != nil {
@@ -3599,6 +3619,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3777,6 +3798,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/users/{user}/removePublicKey")
diff --git a/compute/v0.alpha/compute-api.json b/compute/v0.alpha/compute-api.json
index 5b0e3ca..327416c 100644
--- a/compute/v0.alpha/compute-api.json
+++ b/compute/v0.alpha/compute-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/2elvVtUis8Edx7anV3MuaVUCiBY\"",
+ "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/x9AVZb0DFub7qYBAESo32Be1F4A\"",
  "discoveryVersion": "v1",
  "id": "compute:alpha",
  "name": "compute",
  "version": "alpha",
- "revision": "20170118",
+ "revision": "20170124",
  "title": "Compute Engine API",
  "description": "Creates and runs virtual machines on Google Cloud Platform.",
  "ownerDomain": "google.com",
@@ -107,6 +107,197 @@
     }
    }
   },
+  "AcceleratorType": {
+   "id": "AcceleratorType",
+   "type": "object",
+   "description": "An Accelerator Type resource.",
+   "properties": {
+    "creationTimestamp": {
+     "type": "string",
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
+    },
+    "deprecated": {
+     "$ref": "DeprecationStatus",
+     "description": "[Output Only] The deprecation status associated with this accelerator type."
+    },
+    "description": {
+     "type": "string",
+     "description": "[Output Only] An optional textual description of the resource."
+    },
+    "id": {
+     "type": "string",
+     "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "[Output Only] The type of the resource. Always compute#acceleratorType for accelerator types.",
+     "default": "compute#acceleratorType"
+    },
+    "maximumCardsPerInstance": {
+     "type": "integer",
+     "description": "[Output Only] Maximum accelerator cards allowed per instance.",
+     "format": "int32"
+    },
+    "name": {
+     "type": "string",
+     "description": "[Output Only] Name of the resource.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?"
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "[Output Only] Server-defined fully-qualified URL for this resource."
+    },
+    "zone": {
+     "type": "string",
+     "description": "[Output Only] The name of the zone where the accelerator type resides, such as us-central1-a."
+    }
+   }
+  },
+  "AcceleratorTypeAggregatedList": {
+   "id": "AcceleratorTypeAggregatedList",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server."
+    },
+    "items": {
+     "type": "object",
+     "description": "[Output Only] A map of scoped accelerator type lists.",
+     "additionalProperties": {
+      "$ref": "AcceleratorTypesScopedList",
+      "description": "[Output Only] Name of the scope containing this set of accelerator types."
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "[Output Only] Type of resource. Always compute#acceleratorTypeAggregatedList for aggregated lists of accelerator types.",
+     "default": "compute#acceleratorTypeAggregatedList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "[Output Only] Server-defined URL for this resource."
+    }
+   }
+  },
+  "AcceleratorTypeList": {
+   "id": "AcceleratorTypeList",
+   "type": "object",
+   "description": "Contains a list of accelerator types.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
+    },
+    "items": {
+     "type": "array",
+     "description": "A list of AcceleratorType resources.",
+     "items": {
+      "$ref": "AcceleratorType"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "[Output Only] Type of resource. Always compute#acceleratorTypeList for lists of accelerator types.",
+     "default": "compute#acceleratorTypeList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "[Output Only] A token used to continue a truncated list request."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "[Output Only] Server-defined URL for this resource."
+    }
+   }
+  },
+  "AcceleratorTypesScopedList": {
+   "id": "AcceleratorTypesScopedList",
+   "type": "object",
+   "properties": {
+    "acceleratorTypes": {
+     "type": "array",
+     "description": "[Output Only] List of accelerator types contained in this scope.",
+     "items": {
+      "$ref": "AcceleratorType"
+     }
+    },
+    "warning": {
+     "type": "object",
+     "description": "[Output Only] An informational warning that appears when the accelerator types list is empty.",
+     "properties": {
+      "code": {
+       "type": "string",
+       "description": "[Output Only] A warning code, if applicable. For example, Compute Engine returns NO_RESULTS_ON_PAGE if there are no results in the response.",
+       "enum": [
+        "CLEANUP_FAILED",
+        "DEPRECATED_RESOURCE_USED",
+        "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
+        "FIELD_VALUE_OVERRIDEN",
+        "INJECTED_KERNELS_DEPRECATED",
+        "NEXT_HOP_ADDRESS_NOT_ASSIGNED",
+        "NEXT_HOP_CANNOT_IP_FORWARD",
+        "NEXT_HOP_INSTANCE_NOT_FOUND",
+        "NEXT_HOP_INSTANCE_NOT_ON_NETWORK",
+        "NEXT_HOP_NOT_RUNNING",
+        "NOT_CRITICAL_ERROR",
+        "NO_RESULTS_ON_PAGE",
+        "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
+        "RESOURCE_NOT_DELETED",
+        "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
+        "UNREACHABLE"
+       ],
+       "enumDescriptions": [
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        ""
+       ]
+      },
+      "data": {
+       "type": "array",
+       "description": "[Output Only] Metadata about this warning in key: value format. For example:\n\"data\": [ { \"key\": \"scope\", \"value\": \"zones/us-east1-d\" }",
+       "items": {
+        "type": "object",
+        "properties": {
+         "key": {
+          "type": "string",
+          "description": "[Output Only] A key that provides more detail on the warning being returned. For example, for warnings where there are no results in a list request for a particular zone, this key might be scope and the key value might be the zone name. Other examples might be a key indicating a deprecated resource and a suggested replacement, or a warning about invalid network settings (for example, if an instance attempts to perform IP forwarding but is not enabled for IP forwarding)."
+         },
+         "value": {
+          "type": "string",
+          "description": "[Output Only] A warning data value corresponding to the key."
+         }
+        }
+       }
+      },
+      "message": {
+       "type": "string",
+       "description": "[Output Only] A human-readable description of the warning code."
+      }
+     }
+    }
+   }
+  },
   "AccessConfig": {
    "id": "AccessConfig",
    "type": "object",
@@ -127,10 +318,10 @@
     },
     "networkTier": {
      "type": "string",
-     "description": "This signifies the networking tier used for configuring this access configuration and can only take the following values: CLOUD_NETWORK_PREMIUM , CLOUD_NETWORK_SELECT. If this field is not specified, it is assumed to be CLOUD_NETWORK_PREMIUM.",
+     "description": "This signifies the networking tier used for configuring this access configuration and can only take the following values: PREMIUM , SELECT. If this field is not specified, it is assumed to be PREMIUM.",
      "enum": [
-      "CLOUD_NETWORK_PREMIUM",
-      "CLOUD_NETWORK_SELECT"
+      "PREMIUM",
+      "SELECT"
      ],
      "enumDescriptions": [
       "",
@@ -188,6 +379,20 @@
      "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.",
      "format": "uint64"
     },
+    "ipVersion": {
+     "type": "string",
+     "description": "The IP Version that will be used by this address. Valid options are IPV4 or IPV6. This can only be specified for a global address.",
+     "enum": [
+      "IPV4",
+      "IPV6",
+      "UNSPECIFIED_VERSION"
+     ],
+     "enumDescriptions": [
+      "",
+      "",
+      ""
+     ]
+    },
     "kind": {
      "type": "string",
      "description": "[Output Only] Type of the resource. Always compute#address for addresses.",
@@ -217,10 +422,10 @@
     },
     "networkTier": {
      "type": "string",
-     "description": "This signifies the networking tier used for configuring this Address and can only take the following values: CLOUD_NETWORK_PREMIUM , CLOUD_NETWORK_SELECT. If this field is not specified, it is assumed to be CLOUD_NETWORK_PREMIUM.",
+     "description": "This signifies the networking tier used for configuring this Address and can only take the following values: PREMIUM , SELECT. If this field is not specified, it is assumed to be PREMIUM.",
      "enum": [
-      "CLOUD_NETWORK_PREMIUM",
-      "CLOUD_NETWORK_SELECT"
+      "PREMIUM",
+      "SELECT"
      ],
      "enumDescriptions": [
       "",
@@ -350,6 +555,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -370,6 +576,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -550,18 +757,18 @@
   "AuditConfig": {
    "id": "AuditConfig",
    "type": "object",
-   "description": "Provides the configuration for non-admin_activity logging for a service. Controls exemptions and specific log sub-types.",
+   "description": "Specifies the audit configuration for a service. It consists of which permission types are logged, and what identities, if any, are exempted from logging. An AuditConifg must have one or more AuditLogConfigs.",
    "properties": {
     "auditLogConfigs": {
      "type": "array",
-     "description": "The configuration for each type of logging",
+     "description": "The configuration for logging of each type of permission.",
      "items": {
       "$ref": "AuditLogConfig"
      }
     },
     "exemptedMembers": {
      "type": "array",
-     "description": "Specifies the identities that are exempted from \"data access\" audit logging for the `service` specified above. Follows the same format of Binding.members.",
+     "description": "Specifies the identities that are exempted from \"data access\" audit logging for the `service` specified above. Follows the same format of Binding.members. This field is deprecated in favor of per-permission-type exemptions.",
      "items": {
       "type": "string"
      }
@@ -575,11 +782,11 @@
   "AuditLogConfig": {
    "id": "AuditLogConfig",
    "type": "object",
-   "description": "Provides the configuration for a sub-type of logging.",
+   "description": "Provides the configuration for logging a type of permissions. Example:\n\n{ \"audit_log_configs\": [ { \"log_type\": \"DATA_READ\", \"exempted_members\": [ \"user:foo@gmail.com\" ] }, { \"log_type\": \"DATA_WRITE\", } ] }\n\nThis enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting foo@gmail.com from DATA_READ logging.",
    "properties": {
     "exemptedMembers": {
      "type": "array",
-     "description": "Specifies the identities that are exempted from this type of logging Follows the same format of Binding.members.",
+     "description": "Specifies the identities that do not cause logging for this type of permission. Follows the same format of [Binding.members][].",
      "items": {
       "type": "string"
      }
@@ -818,6 +1025,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -838,6 +1046,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -1133,20 +1342,6 @@
     }
    }
   },
-  "BackendSSLPolicy": {
-   "id": "BackendSSLPolicy",
-   "type": "object",
-   "description": "Message containing backend SSL policies.",
-   "properties": {
-    "pinnedPeerCertificates": {
-     "type": "array",
-     "description": "List of PEM-encoded peer certificates, from which the public keys are extracted for authenticating the backend service.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
   "BackendService": {
    "id": "BackendService",
    "type": "object",
@@ -1157,10 +1352,6 @@
      "description": "Lifetime of cookies in seconds if session_affinity is GENERATED_COOKIE. If set to 0, the cookie is non-persistent and lasts only until the end of the browser session (or equivalent). The maximum allowed value for TTL is one day.\n\nWhen the load balancing scheme is INTERNAL, this field is not used.",
      "format": "int32"
     },
-    "backendSslPolicy": {
-     "$ref": "BackendSSLPolicy",
-     "description": "Backend SSL policies to enforce."
-    },
     "backends": {
      "type": "array",
      "description": "The list of backends that serve this BackendService.",
@@ -1441,6 +1632,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -1461,6 +1653,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -1739,6 +1932,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -1759,6 +1953,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -2140,11 +2335,11 @@
    "properties": {
     "id": {
      "type": "string",
-     "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "array",
-     "description": "[Output Only] A list of persistent disks.",
+     "description": "A list of Disk resources.",
      "items": {
       "$ref": "Disk"
      }
@@ -2156,7 +2351,7 @@
     },
     "nextPageToken": {
      "type": "string",
-     "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
@@ -2323,6 +2518,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -2343,6 +2539,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -2414,6 +2611,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -2434,6 +2632,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -2575,6 +2774,13 @@
       "type": "string"
      }
     },
+    "sourceServiceAccounts": {
+     "type": "array",
+     "description": "If source service accounts are specified, the firewall will apply only to traffic originating from an instance with a service account in this list. Source service accounts cannot be used to control traffic to an instance's external IP address because service accounts are associated with an instance, not an IP address. sourceRanges can be set at the same time as sourceServiceAccounts. If both are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP belongs to an instance with service account listed in sourceServiceAccount. The connection does not need to match both properties for the firewall to apply. sourceServiceAccounts cannot be used at the same time as sourceTags or targetTags.",
+     "items": {
+      "type": "string"
+     }
+    },
     "sourceTags": {
      "type": "array",
      "description": "If source tags are specified, the firewall will apply only to traffic with source IP that belongs to a tag listed in source tags. Source tags cannot be used to control traffic to an instance's external IP address. Because tags are associated with an instance, not an IP address. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply.",
@@ -2658,11 +2864,11 @@
    "properties": {
     "IPAddress": {
      "type": "string",
-     "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP; for regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IP from the same scope (global or regional) will be assigned.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule. Only IPv4 is supported."
+     "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP. For regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IP from the same scope (global or regional) will be assigned.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule. Only IPv4 is supported."
     },
     "IPProtocol": {
      "type": "string",
-     "description": "The IP protocol to which this rule applies. Valid options are TCP, UDP, ESP, AH, SCTP or ICMP.\n\nWhen the load balancing scheme is INTERNAL\u003c/code, only TCP and UDP are valid.",
+     "description": "The IP protocol to which this rule applies. Valid options are TCP, UDP, ESP, AH, SCTP or ICMP.\n\nWhen the load balancing scheme is INTERNAL, only TCP and UDP are valid.",
      "enum": [
       "AH",
       "ESP",
@@ -2697,6 +2903,20 @@
      "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.",
      "format": "uint64"
     },
+    "ipVersion": {
+     "type": "string",
+     "description": "The IP Version that will be used by this forwarding rule. Valid options are IPV4 or IPV6. This can only be specified for a global forwarding rule.",
+     "enum": [
+      "IPV4",
+      "IPV6",
+      "UNSPECIFIED_VERSION"
+     ],
+     "enumDescriptions": [
+      "",
+      "",
+      ""
+     ]
+    },
     "kind": {
      "type": "string",
      "description": "[Output Only] Type of the resource. Always compute#forwardingRule for Forwarding Rule resources.",
@@ -2716,7 +2936,7 @@
     },
     "loadBalancingScheme": {
      "type": "string",
-     "description": "This signifies what the ForwardingRule will be used for and can only take the following values: INTERNAL EXTERNAL The value of INTERNAL means that this will be used for Internal Network Load Balancing (TCP, UDP). The value of EXTERNAL means that this will be used for External Load Balancing (HTTP(S) LB, External TCP/UDP LB, SSL Proxy)",
+     "description": "This signifies what the ForwardingRule will be used for and can only take the following values: INTERNAL, EXTERNAL The value of INTERNAL means that this will be used for Internal Network Load Balancing (TCP, UDP). The value of EXTERNAL means that this will be used for External Load Balancing (HTTP(S) LB, External TCP/UDP LB, SSL Proxy)",
      "enum": [
       "EXTERNAL",
       "INTERNAL",
@@ -2739,10 +2959,10 @@
     },
     "networkTier": {
      "type": "string",
-     "description": "This signifies the networking tier used for configuring this load balancer and can only take the following values: CLOUD_NETWORK_PREMIUM , CLOUD_NETWORK_SELECT. If this field is not specified, it is assumed to be CLOUD_NETWORK_PREMIUM.",
+     "description": "This signifies the networking tier used for configuring this load balancer and can only take the following values: PREMIUM , SELECT. If this field is not specified, it is assumed to be PREMIUM.",
      "enum": [
-      "CLOUD_NETWORK_PREMIUM",
-      "CLOUD_NETWORK_SELECT"
+      "PREMIUM",
+      "SELECT"
      ],
      "enumDescriptions": [
       "",
@@ -2881,6 +3101,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -2901,6 +3122,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -3267,7 +3489,7 @@
     },
     "hostType": {
      "type": "string",
-     "description": "Full or partial URL of the host type resource to use for this host, in the format: zones/zone/hostTypes/host-type. This is provided by the client when the host is created. For example, the following is a valid partial url to a predefined host type:\n\nzones/us-central1-f/hostTypes/n1-host-64-416"
+     "description": "Full or partial URL of the host type resource to use for this host, in the format: zones/zone/hostTypes/host-type. This is provided by the client when the host is created. For example, the following is a valid partial url to a predefined host type:\n\nzones/us-central1-b/hostTypes/n1-host-64-416"
     },
     "id": {
      "type": "string",
@@ -3406,6 +3628,211 @@
     }
    }
   },
+  "HostType": {
+   "id": "HostType",
+   "type": "object",
+   "description": "A Host Type resource.",
+   "properties": {
+    "cpuPlatform": {
+     "type": "string",
+     "description": "[Output Only] The CPU platform used by this host type."
+    },
+    "creationTimestamp": {
+     "type": "string",
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
+    },
+    "deprecated": {
+     "$ref": "DeprecationStatus",
+     "description": "[Output Only] The deprecation status associated with this host type."
+    },
+    "description": {
+     "type": "string",
+     "description": "[Output Only] An optional textual description of the resource."
+    },
+    "guestCpus": {
+     "type": "integer",
+     "description": "[Output Only] The number of virtual CPUs that are available to the host type.",
+     "format": "int32"
+    },
+    "id": {
+     "type": "string",
+     "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "[Output Only] The type of the resource. Always compute#hostType for host types.",
+     "default": "compute#hostType"
+    },
+    "localSsdGb": {
+     "type": "integer",
+     "description": "[Output Only] Local SSD available to the host type, defined in GB.",
+     "format": "int32"
+    },
+    "memoryMb": {
+     "type": "integer",
+     "description": "[Output Only] The amount of physical memory available to the host type, defined in MB.",
+     "format": "int32"
+    },
+    "name": {
+     "type": "string",
+     "description": "[Output Only] Name of the resource.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?"
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "[Output Only] Server-defined URL for the resource."
+    },
+    "zone": {
+     "type": "string",
+     "description": "[Output Only] The name of the zone where the host type resides, such as us-central1-a."
+    }
+   }
+  },
+  "HostTypeAggregatedList": {
+   "id": "HostTypeAggregatedList",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server."
+    },
+    "items": {
+     "type": "object",
+     "description": "[Output Only] A map of scoped host type lists.",
+     "additionalProperties": {
+      "$ref": "HostTypesScopedList",
+      "description": "[Output Only] Name of the scope containing this set of host types."
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "[Output Only] Type of resource.Always compute#hostTypeAggregatedList for aggregated lists of host types.",
+     "default": "compute#hostTypeAggregatedList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "[Output Only] Server-defined URL for the resource."
+    }
+   }
+  },
+  "HostTypeList": {
+   "id": "HostTypeList",
+   "type": "object",
+   "description": "Contains a list of host types.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server."
+    },
+    "items": {
+     "type": "array",
+     "description": "[Output Only] A list of Host Type resources.",
+     "items": {
+      "$ref": "HostType"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "[Output Only] Type of resource.Always compute#hostTypeList for lists of host types.",
+     "default": "compute#hostTypeList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "[Output Only] Server-defined URL for the resource."
+    }
+   }
+  },
+  "HostTypesScopedList": {
+   "id": "HostTypesScopedList",
+   "type": "object",
+   "properties": {
+    "hostTypes": {
+     "type": "array",
+     "description": "[Output Only] List of host types contained in this scope.",
+     "items": {
+      "$ref": "HostType"
+     }
+    },
+    "warning": {
+     "type": "object",
+     "description": "[Output Only] An informational warning that appears when the host types list is empty.",
+     "properties": {
+      "code": {
+       "type": "string",
+       "description": "[Output Only] A warning code, if applicable. For example, Compute Engine returns NO_RESULTS_ON_PAGE if there are no results in the response.",
+       "enum": [
+        "CLEANUP_FAILED",
+        "DEPRECATED_RESOURCE_USED",
+        "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
+        "FIELD_VALUE_OVERRIDEN",
+        "INJECTED_KERNELS_DEPRECATED",
+        "NEXT_HOP_ADDRESS_NOT_ASSIGNED",
+        "NEXT_HOP_CANNOT_IP_FORWARD",
+        "NEXT_HOP_INSTANCE_NOT_FOUND",
+        "NEXT_HOP_INSTANCE_NOT_ON_NETWORK",
+        "NEXT_HOP_NOT_RUNNING",
+        "NOT_CRITICAL_ERROR",
+        "NO_RESULTS_ON_PAGE",
+        "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
+        "RESOURCE_NOT_DELETED",
+        "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
+        "UNREACHABLE"
+       ],
+       "enumDescriptions": [
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        ""
+       ]
+      },
+      "data": {
+       "type": "array",
+       "description": "[Output Only] Metadata about this warning in key: value format. For example:\n\"data\": [ { \"key\": \"scope\", \"value\": \"zones/us-east1-d\" }",
+       "items": {
+        "type": "object",
+        "properties": {
+         "key": {
+          "type": "string",
+          "description": "[Output Only] A key that provides more detail on the warning being returned. For example, for warnings where there are no results in a list request for a particular zone, this key might be scope and the key value might be the zone name. Other examples might be a key indicating a deprecated resource and a suggested replacement, or a warning about invalid network settings (for example, if an instance attempts to perform IP forwarding but is not enabled for IP forwarding)."
+         },
+         "value": {
+          "type": "string",
+          "description": "[Output Only] A warning data value corresponding to the key."
+         }
+        }
+       }
+      },
+      "message": {
+       "type": "string",
+       "description": "[Output Only] A human-readable description of the warning code."
+      }
+     }
+    }
+   }
+  },
   "HostsScopedList": {
    "id": "HostsScopedList",
    "type": "object",
@@ -3438,6 +3865,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -3458,6 +3886,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -3944,6 +4373,10 @@
      "$ref": "Metadata",
      "description": "The metadata key/value pairs assigned to this instance. This includes custom metadata and predefined keys."
     },
+    "minCpuPlatform": {
+     "type": "string",
+     "description": "Minimum cpu/platform to be used by this instance. We may schedule on the specified or later cpu/platform."
+    },
     "name": {
      "type": "string",
      "description": "The name of the resource, provided by the client when initially creating the resource. The resource name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash."
@@ -4519,9 +4952,13 @@
     "instanceTemplate": {
      "type": "string"
     },
+    "name": {
+     "type": "string",
+     "description": "Name of the version. Unique among all versions in the scope of this managed instance group."
+    },
     "tag": {
      "type": "string",
-     "description": "Tag describing the version. Used to trigger rollout of a target version even if instance_template remains unchanged."
+     "description": "Tag describing the version. Used to trigger rollout of a target version even if instance_template remains unchanged. Deprecated in favor of 'name'."
     },
     "targetSize": {
      "$ref": "FixedOrPercent",
@@ -4565,6 +5002,10 @@
      "items": {
       "$ref": "ManagedInstance"
      }
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results."
     }
    }
   },
@@ -4628,6 +5069,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -4648,6 +5090,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -4822,6 +5265,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -4842,6 +5286,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -5158,6 +5603,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -5178,6 +5624,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -5224,6 +5671,18 @@
     }
    }
   },
+  "InstancesSetMachineResourcesRequest": {
+   "id": "InstancesSetMachineResourcesRequest",
+   "type": "object",
+   "properties": {
+    "guestAccelerators": {
+     "type": "array",
+     "items": {
+      "$ref": "AcceleratorConfig"
+     }
+    }
+   }
+  },
   "InstancesSetMachineTypeRequest": {
    "id": "InstancesSetMachineTypeRequest",
    "type": "object",
@@ -5493,6 +5952,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -5513,6 +5973,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -5625,6 +6086,10 @@
     "tag": {
      "type": "string",
      "description": "[Output Only] Tag describing the version."
+    },
+    "version": {
+     "$ref": "ManagedInstanceVersion",
+     "description": "[Output Only] Intended version of this instance."
     }
    }
   },
@@ -5661,6 +6126,20 @@
     }
    }
   },
+  "ManagedInstanceVersion": {
+   "id": "ManagedInstanceVersion",
+   "type": "object",
+   "properties": {
+    "instanceTemplate": {
+     "type": "string",
+     "description": "[Output Only] The intended template of the instance. This field is empty when current_action is one of { DELETING, ABANDONING }."
+    },
+    "name": {
+     "type": "string",
+     "description": "[Output Only] Name of the version."
+    }
+   }
+  },
   "Metadata": {
    "id": "Metadata",
    "type": "object",
@@ -5845,12 +6324,7 @@
     },
     "network": {
      "type": "string",
-     "description": "URL of the network resource for this instance. This is required for creating an instance but optional when creating a firewall rule. If not specified when creating a firewall rule, the default network is used:\n\nglobal/networks/default \n\nIf you specify this property, you can specify the network as a full or partial URL. For example, the following are all valid URLs:  \n- https://www.googleapis.com/compute/v1/projects/project/global/networks/network \n- projects/project/global/networks/network \n- global/networks/default",
-     "annotations": {
-      "required": [
-       "compute.instances.insert"
-      ]
-     }
+     "description": "URL of the network resource for this instance. When creating an instance, if neither the network nor the subnetwork is specified, the default network global/networks/default is used; if the network is not specified but the subnetwork is specified, the network is inferred.\n\nThis field is optional when creating a firewall rule. If not specified when creating a firewall rule, the default network global/networks/default is used.\n\nIf you specify this property, you can specify the network as a full or partial URL. For example, the following are all valid URLs:  \n- https://www.googleapis.com/compute/v1/projects/project/global/networks/network \n- projects/project/global/networks/network \n- global/networks/default"
     },
     "networkIP": {
      "type": "string",
@@ -6106,6 +6580,7 @@
          "NOT_CRITICAL_ERROR",
          "NO_RESULTS_ON_PAGE",
          "REQUIRED_TOS_AGREEMENT",
+         "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
          "RESOURCE_NOT_DELETED",
          "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
          "UNREACHABLE"
@@ -6126,6 +6601,7 @@
          "",
          "",
          "",
+         "",
          ""
         ]
        },
@@ -6253,6 +6729,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -6273,6 +6750,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -6352,7 +6830,7 @@
    "properties": {
     "auditConfigs": {
      "type": "array",
-     "description": "Specifies audit logging configs for \"data access\". \"data access\": generally refers to data reads/writes and admin reads. \"admin activity\": generally refers to admin writes.\n\nNote: `AuditConfig` doesn't apply to \"admin activity\", which always enables audit logging.",
+     "description": "Specifies cloud audit logging configuration for this policy.",
      "items": {
       "$ref": "AuditConfig"
      }
@@ -6538,6 +7016,7 @@
       "BACKEND_BUCKETS",
       "BACKEND_SERVICES",
       "CPUS",
+      "CPUS_ALL_REGIONS",
       "DISKS_TOTAL_GB",
       "FIREWALLS",
       "FORWARDING_RULES",
@@ -6568,7 +7047,6 @@
       "TARGET_SSL_PROXIES",
       "TARGET_TCP_PROXIES",
       "TARGET_VPN_GATEWAYS",
-      "TOTAL_CPUS",
       "URL_MAPS",
       "VPN_TUNNELS"
      ],
@@ -6852,6 +7330,10 @@
      "items": {
       "$ref": "ManagedInstance"
      }
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results."
     }
    }
   },
@@ -7069,7 +7551,7 @@
   "Route": {
    "id": "Route",
    "type": "object",
-   "description": "Represents a Route resource. A route specifies how certain packets should be handled by the network. Routes are associated with instances by tags and the set of routes for a particular instance is called its routing table.\n\nFor each packet leaving a instance, the system searches that instance's routing table for a single best matching route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching routes. The packet is then forwarded as specified by the nextHop field of the winning route - either to another instance destination, a instance gateway or a Google Compute Engine-operated gateway.\n\nPackets that do not match any route in the sending instance's routing table are dropped.",
+   "description": "Represents a Route resource. A route specifies how certain packets should be handled by the network. Routes are associated with instances by tags and the set of routes for a particular instance is called its routing table.\n\nFor each packet leaving a instance, the system searches that instance's routing table for a single best matching route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching routes. The packet is then forwarded as specified by the nextHop field of the winning route - either to another instance destination, an instance gateway, or a Google Compute Engine-operated gateway.\n\nPackets that do not match any route in the sending instance's routing table are dropped.",
    "properties": {
     "creationTimestamp": {
      "type": "string",
@@ -7190,6 +7672,7 @@
          "NOT_CRITICAL_ERROR",
          "NO_RESULTS_ON_PAGE",
          "REQUIRED_TOS_AGREEMENT",
+         "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
          "RESOURCE_NOT_DELETED",
          "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
          "UNREACHABLE"
@@ -7210,6 +7693,7 @@
          "",
          "",
          "",
+         "",
          ""
         ]
        },
@@ -7477,6 +7961,13 @@
       "$ref": "Route"
      }
     },
+    "bestRoutesForRouter": {
+     "type": "array",
+     "description": "Best routes learned by this router.",
+     "items": {
+      "$ref": "Route"
+     }
+    },
     "bgpPeerStatus": {
      "type": "array",
      "items": {
@@ -7605,6 +8096,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -7625,6 +8117,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -8244,6 +8737,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -8264,6 +8758,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -8663,6 +9158,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -8683,6 +9179,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -8953,6 +9450,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -8973,6 +9471,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -9428,6 +9927,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -9448,6 +9948,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -9959,6 +10460,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -9979,6 +10481,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -10065,6 +10568,13 @@
    "type": "object",
    "description": "A Zone resource.",
    "properties": {
+    "availableCpuPlatforms": {
+     "type": "array",
+     "description": "[Output Only] Available cpu/platform selections for the zone.",
+     "items": {
+      "type": "string"
+     }
+    },
     "creationTimestamp": {
      "type": "string",
      "description": "[Output Only] Creation timestamp in RFC3339 text format."
@@ -10164,6 +10674,158 @@
   }
  },
  "resources": {
+  "acceleratorTypes": {
+   "methods": {
+    "aggregatedList": {
+     "id": "compute.acceleratorTypes.aggregatedList",
+     "path": "{project}/aggregated/acceleratorTypes",
+     "httpMethod": "GET",
+     "description": "Retrieves an aggregated list of accelerator types.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+       "default": "500",
+       "format": "uint32",
+       "minimum": "0",
+       "location": "query"
+      },
+      "orderBy": {
+       "type": "string",
+       "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "AcceleratorTypeAggregatedList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "get": {
+     "id": "compute.acceleratorTypes.get",
+     "path": "{project}/zones/{zone}/acceleratorTypes/{acceleratorType}",
+     "httpMethod": "GET",
+     "description": "Returns the specified accelerator type. Get a list of available accelerator types by making a list() request.",
+     "parameters": {
+      "acceleratorType": {
+       "type": "string",
+       "description": "Name of the accelerator type to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "The name of the zone for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "acceleratorType"
+     ],
+     "response": {
+      "$ref": "AcceleratorType"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "list": {
+     "id": "compute.acceleratorTypes.list",
+     "path": "{project}/zones/{zone}/acceleratorTypes",
+     "httpMethod": "GET",
+     "description": "Retrieves a list of accelerator types available to the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+       "default": "500",
+       "format": "uint32",
+       "minimum": "0",
+       "location": "query"
+      },
+      "orderBy": {
+       "type": "string",
+       "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "The name of the zone for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone"
+     ],
+     "response": {
+      "$ref": "AcceleratorTypeList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
   "addresses": {
    "methods": {
     "aggregatedList": {
@@ -10183,7 +10845,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10352,7 +11013,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10393,6 +11053,50 @@
       "https://www.googleapis.com/auth/compute.readonly"
      ]
     },
+    "setLabels": {
+     "id": "compute.addresses.setLabels",
+     "path": "{project}/regions/{region}/addresses/{resource}/setLabels",
+     "httpMethod": "POST",
+     "description": "Sets the labels on an Address. To learn more about labels, read the Labeling or Tagging Resources documentation.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "region": {
+       "type": "string",
+       "description": "The region for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "resource": {
+       "type": "string",
+       "description": "Name of the resource for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "region",
+      "resource"
+     ],
+     "request": {
+      "$ref": "RegionSetLabelsRequest"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
     "testIamPermissions": {
      "id": "compute.addresses.testIamPermissions",
      "path": "{project}/regions/{region}/addresses/{resource}/testIamPermissions",
@@ -10459,7 +11163,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10628,7 +11331,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10950,7 +11652,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11150,7 +11851,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11331,7 +12031,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11535,7 +12234,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11705,7 +12403,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11857,7 +12554,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11949,7 +12645,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12011,7 +12706,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12232,7 +12926,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12522,7 +13215,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12685,7 +13377,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12854,7 +13545,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12895,6 +13585,50 @@
       "https://www.googleapis.com/auth/compute.readonly"
      ]
     },
+    "setLabels": {
+     "id": "compute.forwardingRules.setLabels",
+     "path": "{project}/regions/{region}/forwardingRules/{resource}/setLabels",
+     "httpMethod": "POST",
+     "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling or Tagging Resources documentation.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "region": {
+       "type": "string",
+       "description": "The region for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "resource": {
+       "type": "string",
+       "description": "Name of the resource for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "region",
+      "resource"
+     ],
+     "request": {
+      "$ref": "RegionSetLabelsRequest"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
     "setTarget": {
      "id": "compute.forwardingRules.setTarget",
      "path": "{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget",
@@ -13100,7 +13834,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13133,6 +13866,42 @@
       "https://www.googleapis.com/auth/compute.readonly"
      ]
     },
+    "setLabels": {
+     "id": "compute.globalAddresses.setLabels",
+     "path": "{project}/global/addresses/{resource}/setLabels",
+     "httpMethod": "POST",
+     "description": "Sets the labels on a GlobalAddress. To learn more about labels, read the Labeling or Tagging Resources documentation.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "resource": {
+       "type": "string",
+       "description": "Name of the resource for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "resource"
+     ],
+     "request": {
+      "$ref": "GlobalSetLabelsRequest"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
     "testIamPermissions": {
      "id": "compute.globalAddresses.testIamPermissions",
      "path": "{project}/global/addresses/{resource}/testIamPermissions",
@@ -13286,7 +14055,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13319,6 +14087,42 @@
       "https://www.googleapis.com/auth/compute.readonly"
      ]
     },
+    "setLabels": {
+     "id": "compute.globalForwardingRules.setLabels",
+     "path": "{project}/global/forwardingRules/{resource}/setLabels",
+     "httpMethod": "POST",
+     "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling or Tagging Resources documentation.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "resource": {
+       "type": "string",
+       "description": "Name of the resource for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "resource"
+     ],
+     "request": {
+      "$ref": "GlobalSetLabelsRequest"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
     "setTarget": {
      "id": "compute.globalForwardingRules.setTarget",
      "path": "{project}/global/forwardingRules/{forwardingRule}/setTarget",
@@ -13413,7 +14217,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13527,7 +14330,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13676,7 +14478,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13820,6 +14621,158 @@
     }
    }
   },
+  "hostTypes": {
+   "methods": {
+    "aggregatedList": {
+     "id": "compute.hostTypes.aggregatedList",
+     "path": "{project}/aggregated/hostTypes",
+     "httpMethod": "GET",
+     "description": "Retrieves an aggregated list of host types.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+       "default": "500",
+       "format": "uint32",
+       "minimum": "0",
+       "location": "query"
+      },
+      "orderBy": {
+       "type": "string",
+       "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "HostTypeAggregatedList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "get": {
+     "id": "compute.hostTypes.get",
+     "path": "{project}/zones/{zone}/hostTypes/{hostType}",
+     "httpMethod": "GET",
+     "description": "Returns the specified host type. Get a list of available host types by making a list() request.",
+     "parameters": {
+      "hostType": {
+       "type": "string",
+       "description": "Name of the host type to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "The name of the zone for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "hostType"
+     ],
+     "response": {
+      "$ref": "HostType"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "list": {
+     "id": "compute.hostTypes.list",
+     "path": "{project}/zones/{zone}/hostTypes",
+     "httpMethod": "GET",
+     "description": "Retrieves a list of host types available to the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+       "default": "500",
+       "format": "uint32",
+       "minimum": "0",
+       "location": "query"
+      },
+      "orderBy": {
+       "type": "string",
+       "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "The name of the zone for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone"
+     ],
+     "response": {
+      "$ref": "HostTypeList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
   "hosts": {
    "methods": {
     "aggregatedList": {
@@ -13839,7 +14792,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -14050,7 +15002,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -14297,7 +15248,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -14338,7 +15288,7 @@
      "parameters": {
       "httpHealthCheck": {
        "type": "string",
-       "description": "Name of the HttpHealthCheck resource to update.",
+       "description": "Name of the HttpHealthCheck resource to patch.",
        "required": true,
        "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
        "location": "path"
@@ -14363,7 +15313,8 @@
      },
      "scopes": [
       "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/compute"
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
      ]
     },
     "testIamPermissions": {
@@ -14555,7 +15506,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -14844,6 +15794,11 @@
      "httpMethod": "POST",
      "description": "Creates an image in the specified project using the data included in the request.",
      "parameters": {
+      "forceCreation": {
+       "type": "boolean",
+       "description": "Force image creation if true.",
+       "location": "query"
+      },
       "project": {
        "type": "string",
        "description": "Project ID for this request.",
@@ -14886,7 +15841,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15055,7 +16009,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15261,7 +16214,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15322,7 +16274,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "order_by": {
@@ -15365,7 +16316,7 @@
      "id": "compute.instanceGroupManagers.patch",
      "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}",
      "httpMethod": "PATCH",
-     "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports patch semantics.",
+     "description": "Updates a managed instance group using the information that you specify in the request. The field statefulPolicy is updated using PATCH semantics. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports patch semantics.",
      "parameters": {
       "instanceGroupManager": {
        "type": "string",
@@ -15709,7 +16660,7 @@
      "id": "compute.instanceGroupManagers.update",
      "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}",
      "httpMethod": "PUT",
-     "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method.",
+     "description": "Updates a managed instance group using the information that you specify in the request. The field statefulPolicy is updated using PATCH semantics. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method.",
      "parameters": {
       "instanceGroupManager": {
        "type": "string",
@@ -15810,7 +16761,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15974,7 +16924,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16037,7 +16986,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16326,7 +17274,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16468,7 +17415,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16888,7 +17834,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17115,6 +18060,50 @@
       "https://www.googleapis.com/auth/compute"
      ]
     },
+    "setMachineResources": {
+     "id": "compute.instances.setMachineResources",
+     "path": "{project}/zones/{zone}/instances/{instance}/setMachineResources",
+     "httpMethod": "POST",
+     "description": "Changes the number and/or type of accelerator for a stopped instance to the values specified in the request.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Name of the instance scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "The name of the zone for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "instance"
+     ],
+     "request": {
+      "$ref": "InstancesSetMachineResourcesRequest"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
     "setMachineType": {
      "id": "compute.instances.setMachineType",
      "path": "{project}/zones/{zone}/instances/{instance}/setMachineType",
@@ -17667,7 +18656,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17759,7 +18747,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17952,7 +18939,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -18268,7 +19254,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "order_by": {
@@ -18305,6 +19290,25 @@
      "httpMethod": "POST",
      "description": "List all XPN host projects visible to the user in an organization.",
      "parameters": {
+      "filter": {
+       "type": "string",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "default": "500",
+       "format": "uint32",
+       "minimum": "0",
+       "location": "query"
+      },
+      "order_by": {
+       "type": "string",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "location": "query"
+      },
       "project": {
        "type": "string",
        "description": "Project ID for this request.",
@@ -18611,7 +19615,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -18967,7 +19970,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -19204,7 +20206,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -19437,7 +20438,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -19830,7 +20830,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -19891,7 +20890,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "order_by": {
@@ -20336,7 +21334,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -20399,7 +21396,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -20631,7 +21627,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -20727,7 +21722,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -20781,7 +21775,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -20992,7 +21985,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -21327,7 +22319,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -21485,7 +22476,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -21707,7 +22697,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -21798,7 +22787,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -22053,7 +23041,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -22344,7 +23331,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -22566,7 +23552,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -22729,7 +23714,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -22898,7 +23882,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -23093,7 +24076,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -23307,7 +24289,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -23647,7 +24628,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -23941,7 +24921,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -24104,7 +25083,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -24273,7 +25251,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -24511,7 +25488,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -24710,7 +25686,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -24879,7 +25854,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -24920,6 +25894,50 @@
       "https://www.googleapis.com/auth/compute.readonly"
      ]
     },
+    "setLabels": {
+     "id": "compute.vpnTunnels.setLabels",
+     "path": "{project}/regions/{region}/vpnTunnels/{resource}/setLabels",
+     "httpMethod": "POST",
+     "description": "Sets the labels on a VpnTunnel. To learn more about labels, read the Labeling or Tagging Resources documentation.",
+     "parameters": {
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "region": {
+       "type": "string",
+       "description": "The region for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "resource": {
+       "type": "string",
+       "description": "Name of the resource for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "region",
+      "resource"
+     ],
+     "request": {
+      "$ref": "RegionSetLabelsRequest"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
     "testIamPermissions": {
      "id": "compute.vpnTunnels.testIamPermissions",
      "path": "{project}/regions/{region}/vpnTunnels/{resource}/testIamPermissions",
@@ -25066,7 +26084,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -25162,7 +26179,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
diff --git a/compute/v0.alpha/compute-gen.go b/compute/v0.alpha/compute-gen.go
index 595ab8c..10c85e1 100644
--- a/compute/v0.alpha/compute-gen.go
+++ b/compute/v0.alpha/compute-gen.go
@@ -71,6 +71,7 @@
 		return nil, errors.New("client is nil")
 	}
 	s := &Service{client: client, BasePath: basePath}
+	s.AcceleratorTypes = NewAcceleratorTypesService(s)
 	s.Addresses = NewAddressesService(s)
 	s.Autoscalers = NewAutoscalersService(s)
 	s.BackendBuckets = NewBackendBucketsService(s)
@@ -85,6 +86,7 @@
 	s.GlobalForwardingRules = NewGlobalForwardingRulesService(s)
 	s.GlobalOperations = NewGlobalOperationsService(s)
 	s.HealthChecks = NewHealthChecksService(s)
+	s.HostTypes = NewHostTypesService(s)
 	s.Hosts = NewHostsService(s)
 	s.HttpHealthChecks = NewHttpHealthChecksService(s)
 	s.HttpsHealthChecks = NewHttpsHealthChecksService(s)
@@ -125,9 +127,12 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
+
+	AcceleratorTypes *AcceleratorTypesService
 
 	Addresses *AddressesService
 
@@ -157,6 +162,8 @@
 
 	HealthChecks *HealthChecksService
 
+	HostTypes *HostTypesService
+
 	Hosts *HostsService
 
 	HttpHealthChecks *HttpHealthChecksService
@@ -237,6 +244,19 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
+func NewAcceleratorTypesService(s *Service) *AcceleratorTypesService {
+	rs := &AcceleratorTypesService{s: s}
+	return rs
+}
+
+type AcceleratorTypesService struct {
+	s *Service
+}
+
 func NewAddressesService(s *Service) *AddressesService {
 	rs := &AddressesService{s: s}
 	return rs
@@ -363,6 +383,15 @@
 	s *Service
 }
 
+func NewHostTypesService(s *Service) *HostTypesService {
+	rs := &HostTypesService{s: s}
+	return rs
+}
+
+type HostTypesService struct {
+	s *Service
+}
+
 func NewHostsService(s *Service) *HostsService {
 	rs := &HostsService{s: s}
 	return rs
@@ -722,6 +751,298 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// AcceleratorType: An Accelerator Type resource.
+type AcceleratorType struct {
+	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
+	// format.
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Deprecated: [Output Only] The deprecation status associated with this
+	// accelerator type.
+	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
+
+	// Description: [Output Only] An optional textual description of the
+	// resource.
+	Description string `json:"description,omitempty"`
+
+	// Id: [Output Only] The unique identifier for the resource. This
+	// identifier is defined by the server.
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: [Output Only] The type of the resource. Always
+	// compute#acceleratorType for accelerator types.
+	Kind string `json:"kind,omitempty"`
+
+	// MaximumCardsPerInstance: [Output Only] Maximum accelerator cards
+	// allowed per instance.
+	MaximumCardsPerInstance int64 `json:"maximumCardsPerInstance,omitempty"`
+
+	// Name: [Output Only] Name of the resource.
+	Name string `json:"name,omitempty"`
+
+	// SelfLink: [Output Only] Server-defined fully-qualified URL for this
+	// resource.
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// Zone: [Output Only] The name of the zone where the accelerator type
+	// resides, such as us-central1-a.
+	Zone string `json:"zone,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "CreationTimestamp")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "CreationTimestamp") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorType) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorType
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type AcceleratorTypeAggregatedList struct {
+	// Id: [Output Only] The unique identifier for the resource. This
+	// identifier is defined by the server.
+	Id string `json:"id,omitempty"`
+
+	// Items: [Output Only] A map of scoped accelerator type lists.
+	Items map[string]AcceleratorTypesScopedList `json:"items,omitempty"`
+
+	// Kind: [Output Only] Type of resource. Always
+	// compute#acceleratorTypeAggregatedList for aggregated lists of
+	// accelerator types.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: [Output Only] This token allows you to get the next
+	// page of results for list requests. If the number of results is larger
+	// than maxResults, use the nextPageToken as a value for the query
+	// parameter pageToken in the next list request. Subsequent list
+	// requests will have their own nextPageToken to continue paging through
+	// the results.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: [Output Only] Server-defined URL for this resource.
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Id") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Id") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorTypeAggregatedList) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorTypeAggregatedList
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// AcceleratorTypeList: Contains a list of accelerator types.
+type AcceleratorTypeList struct {
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
+	Id string `json:"id,omitempty"`
+
+	// Items: A list of AcceleratorType resources.
+	Items []*AcceleratorType `json:"items,omitempty"`
+
+	// Kind: [Output Only] Type of resource. Always
+	// compute#acceleratorTypeList for lists of accelerator types.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: [Output Only] Server-defined URL for this resource.
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Id") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Id") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorTypeList) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorTypeList
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type AcceleratorTypesScopedList struct {
+	// AcceleratorTypes: [Output Only] List of accelerator types contained
+	// in this scope.
+	AcceleratorTypes []*AcceleratorType `json:"acceleratorTypes,omitempty"`
+
+	// Warning: [Output Only] An informational warning that appears when the
+	// accelerator types list is empty.
+	Warning *AcceleratorTypesScopedListWarning `json:"warning,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "AcceleratorTypes") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "AcceleratorTypes") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorTypesScopedList) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorTypesScopedList
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// AcceleratorTypesScopedListWarning: [Output Only] An informational
+// warning that appears when the accelerator types list is empty.
+type AcceleratorTypesScopedListWarning struct {
+	// Code: [Output Only] A warning code, if applicable. For example,
+	// Compute Engine returns NO_RESULTS_ON_PAGE if there are no results in
+	// the response.
+	//
+	// Possible values:
+	//   "CLEANUP_FAILED"
+	//   "DEPRECATED_RESOURCE_USED"
+	//   "DISK_SIZE_LARGER_THAN_IMAGE_SIZE"
+	//   "FIELD_VALUE_OVERRIDEN"
+	//   "INJECTED_KERNELS_DEPRECATED"
+	//   "NEXT_HOP_ADDRESS_NOT_ASSIGNED"
+	//   "NEXT_HOP_CANNOT_IP_FORWARD"
+	//   "NEXT_HOP_INSTANCE_NOT_FOUND"
+	//   "NEXT_HOP_INSTANCE_NOT_ON_NETWORK"
+	//   "NEXT_HOP_NOT_RUNNING"
+	//   "NOT_CRITICAL_ERROR"
+	//   "NO_RESULTS_ON_PAGE"
+	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
+	//   "RESOURCE_NOT_DELETED"
+	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
+	//   "UNREACHABLE"
+	Code string `json:"code,omitempty"`
+
+	// Data: [Output Only] Metadata about this warning in key: value format.
+	// For example:
+	// "data": [ { "key": "scope", "value": "zones/us-east1-d" }
+	Data []*AcceleratorTypesScopedListWarningData `json:"data,omitempty"`
+
+	// Message: [Output Only] A human-readable description of the warning
+	// code.
+	Message string `json:"message,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Code") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Code") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorTypesScopedListWarning) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorTypesScopedListWarning
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type AcceleratorTypesScopedListWarningData struct {
+	// Key: [Output Only] A key that provides more detail on the warning
+	// being returned. For example, for warnings where there are no results
+	// in a list request for a particular zone, this key might be scope and
+	// the key value might be the zone name. Other examples might be a key
+	// indicating a deprecated resource and a suggested replacement, or a
+	// warning about invalid network settings (for example, if an instance
+	// attempts to perform IP forwarding but is not enabled for IP
+	// forwarding).
+	Key string `json:"key,omitempty"`
+
+	// Value: [Output Only] A warning data value corresponding to the key.
+	Value string `json:"value,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Key") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Key") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorTypesScopedListWarningData) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorTypesScopedListWarningData
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // AccessConfig: An access configuration attached to an instance's
 // network interface. Only one access config per instance is supported.
 type AccessConfig struct {
@@ -741,12 +1062,12 @@
 
 	// NetworkTier: This signifies the networking tier used for configuring
 	// this access configuration and can only take the following values:
-	// CLOUD_NETWORK_PREMIUM , CLOUD_NETWORK_SELECT. If this field is not
-	// specified, it is assumed to be CLOUD_NETWORK_PREMIUM.
+	// PREMIUM , SELECT. If this field is not specified, it is assumed to be
+	// PREMIUM.
 	//
 	// Possible values:
-	//   "CLOUD_NETWORK_PREMIUM"
-	//   "CLOUD_NETWORK_SELECT"
+	//   "PREMIUM"
+	//   "SELECT"
 	NetworkTier string `json:"networkTier,omitempty"`
 
 	// PublicDnsName: [Output Only] The public DNS domain name for the
@@ -814,6 +1135,16 @@
 	// identifier is defined by the server.
 	Id uint64 `json:"id,omitempty,string"`
 
+	// IpVersion: The IP Version that will be used by this address. Valid
+	// options are IPV4 or IPV6. This can only be specified for a global
+	// address.
+	//
+	// Possible values:
+	//   "IPV4"
+	//   "IPV6"
+	//   "UNSPECIFIED_VERSION"
+	IpVersion string `json:"ipVersion,omitempty"`
+
 	// Kind: [Output Only] Type of the resource. Always compute#address for
 	// addresses.
 	Kind string `json:"kind,omitempty"`
@@ -844,13 +1175,12 @@
 	Name string `json:"name,omitempty"`
 
 	// NetworkTier: This signifies the networking tier used for configuring
-	// this Address and can only take the following values:
-	// CLOUD_NETWORK_PREMIUM , CLOUD_NETWORK_SELECT. If this field is not
-	// specified, it is assumed to be CLOUD_NETWORK_PREMIUM.
+	// this Address and can only take the following values: PREMIUM ,
+	// SELECT. If this field is not specified, it is assumed to be PREMIUM.
 	//
 	// Possible values:
-	//   "CLOUD_NETWORK_PREMIUM"
-	//   "CLOUD_NETWORK_SELECT"
+	//   "PREMIUM"
+	//   "SELECT"
 	NetworkTier string `json:"networkTier,omitempty"`
 
 	// Region: [Output Only] URL of the region where the regional address
@@ -1054,6 +1384,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -1406,16 +1737,19 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// AuditConfig: Provides the configuration for non-admin_activity
-// logging for a service. Controls exemptions and specific log
-// sub-types.
+// AuditConfig: Specifies the audit configuration for a service. It
+// consists of which permission types are logged, and what identities,
+// if any, are exempted from logging. An AuditConifg must have one or
+// more AuditLogConfigs.
 type AuditConfig struct {
-	// AuditLogConfigs: The configuration for each type of logging
+	// AuditLogConfigs: The configuration for logging of each type of
+	// permission.
 	AuditLogConfigs []*AuditLogConfig `json:"auditLogConfigs,omitempty"`
 
 	// ExemptedMembers: Specifies the identities that are exempted from
 	// "data access" audit logging for the `service` specified above.
-	// Follows the same format of Binding.members.
+	// Follows the same format of Binding.members. This field is deprecated
+	// in favor of per-permission-type exemptions.
 	ExemptedMembers []string `json:"exemptedMembers,omitempty"`
 
 	// Service: Specifies a service that will be enabled for audit logging.
@@ -1447,10 +1781,19 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// AuditLogConfig: Provides the configuration for a sub-type of logging.
+// AuditLogConfig: Provides the configuration for logging a type of
+// permissions. Example:
+//
+// { "audit_log_configs": [ { "log_type": "DATA_READ",
+// "exempted_members": [ "user:foo@gmail.com" ] }, { "log_type":
+// "DATA_WRITE", } ] }
+//
+// This enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting
+// foo@gmail.com from DATA_READ logging.
 type AuditLogConfig struct {
-	// ExemptedMembers: Specifies the identities that are exempted from this
-	// type of logging Follows the same format of Binding.members.
+	// ExemptedMembers: Specifies the identities that do not cause logging
+	// for this type of permission. Follows the same format of
+	// [Binding.members][].
 	ExemptedMembers []string `json:"exemptedMembers,omitempty"`
 
 	// LogType: The log type that this config enables.
@@ -1781,6 +2124,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -2436,38 +2780,6 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// BackendSSLPolicy: Message containing backend SSL policies.
-type BackendSSLPolicy struct {
-	// PinnedPeerCertificates: List of PEM-encoded peer certificates, from
-	// which the public keys are extracted for authenticating the backend
-	// service.
-	PinnedPeerCertificates []string `json:"pinnedPeerCertificates,omitempty"`
-
-	// ForceSendFields is a list of field names (e.g.
-	// "PinnedPeerCertificates") to unconditionally include in API requests.
-	// By default, fields with empty values are omitted from API requests.
-	// However, any non-pointer, non-interface field appearing in
-	// ForceSendFields will be sent to the server regardless of whether the
-	// field is empty or not. This may be used to include empty fields in
-	// Patch requests.
-	ForceSendFields []string `json:"-"`
-
-	// NullFields is a list of field names (e.g. "PinnedPeerCertificates")
-	// to include in API requests with the JSON null value. By default,
-	// fields with empty values are omitted from API requests. However, any
-	// field with an empty value appearing in NullFields will be sent to the
-	// server as null. It is an error if a field in this list has a
-	// non-empty value. This may be used to include null fields in Patch
-	// requests.
-	NullFields []string `json:"-"`
-}
-
-func (s *BackendSSLPolicy) MarshalJSON() ([]byte, error) {
-	type noMethod BackendSSLPolicy
-	raw := noMethod(*s)
-	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
-}
-
 // BackendService: A BackendService resource. This resource defines a
 // group of backend virtual machines and their serving capacity.
 type BackendService struct {
@@ -2479,9 +2791,6 @@
 	// When the load balancing scheme is INTERNAL, this field is not used.
 	AffinityCookieTtlSec int64 `json:"affinityCookieTtlSec,omitempty"`
 
-	// BackendSslPolicy: Backend SSL policies to enforce.
-	BackendSslPolicy *BackendSSLPolicy `json:"backendSslPolicy,omitempty"`
-
 	// Backends: The list of backends that serve this BackendService.
 	Backends []*Backend `json:"backends,omitempty"`
 
@@ -2882,6 +3191,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -3351,6 +3661,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -3930,23 +4241,19 @@
 
 // DiskList: A list of Disk resources.
 type DiskList struct {
-	// Id: [Output Only] The unique identifier for the resource. This
-	// identifier is defined by the server.
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: [Output Only] A list of persistent disks.
+	// Items: A list of Disk resources.
 	Items []*Disk `json:"items,omitempty"`
 
 	// Kind: [Output Only] Type of resource. Always compute#diskList for
 	// lists of disks.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: [Output Only] This token allows you to get the next
-	// page of results for list requests. If the number of results is larger
-	// than maxResults, use the nextPageToken as a value for the query
-	// parameter pageToken in the next list request. Subsequent list
-	// requests will have their own nextPageToken to continue paging through
-	// the results.
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
 	// SelfLink: [Output Only] Server-defined URL for this resource.
@@ -4241,6 +4548,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -4395,6 +4703,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -4556,6 +4865,20 @@
 	// the firewall to apply. Only IPv4 is supported.
 	SourceRanges []string `json:"sourceRanges,omitempty"`
 
+	// SourceServiceAccounts: If source service accounts are specified, the
+	// firewall will apply only to traffic originating from an instance with
+	// a service account in this list. Source service accounts cannot be
+	// used to control traffic to an instance's external IP address because
+	// service accounts are associated with an instance, not an IP address.
+	// sourceRanges can be set at the same time as sourceServiceAccounts. If
+	// both are set, the firewall will apply to traffic that has source IP
+	// address within sourceRanges OR the source IP belongs to an instance
+	// with service account listed in sourceServiceAccount. The connection
+	// does not need to match both properties for the firewall to apply.
+	// sourceServiceAccounts cannot be used at the same time as sourceTags
+	// or targetTags.
+	SourceServiceAccounts []string `json:"sourceServiceAccounts,omitempty"`
+
 	// SourceTags: If source tags are specified, the firewall will apply
 	// only to traffic with source IP that belongs to a tag listed in source
 	// tags. Source tags cannot be used to control traffic to an instance's
@@ -4779,7 +5102,7 @@
 	// IPAddress: The IP address that this forwarding rule is serving on
 	// behalf of.
 	//
-	// For global forwarding rules, the address must be a global IP; for
+	// For global forwarding rules, the address must be a global IP. For
 	// regional forwarding rules, the address must live in the same region
 	// as the forwarding rule. By default, this field is empty and an
 	// ephemeral IP from the same scope (global or regional) will be
@@ -4796,8 +5119,8 @@
 	// IPProtocol: The IP protocol to which this rule applies. Valid options
 	// are TCP, UDP, ESP, AH, SCTP or ICMP.
 	//
-	// When the load balancing scheme is INTERNAL</code, only TCP and UDP
-	// are valid.
+	// When the load balancing scheme is INTERNAL, only TCP and UDP are
+	// valid.
 	//
 	// Possible values:
 	//   "AH"
@@ -4827,6 +5150,16 @@
 	// identifier is defined by the server.
 	Id uint64 `json:"id,omitempty,string"`
 
+	// IpVersion: The IP Version that will be used by this forwarding rule.
+	// Valid options are IPV4 or IPV6. This can only be specified for a
+	// global forwarding rule.
+	//
+	// Possible values:
+	//   "IPV4"
+	//   "IPV6"
+	//   "UNSPECIFIED_VERSION"
+	IpVersion string `json:"ipVersion,omitempty"`
+
 	// Kind: [Output Only] Type of the resource. Always
 	// compute#forwardingRule for Forwarding Rule resources.
 	Kind string `json:"kind,omitempty"`
@@ -4848,7 +5181,7 @@
 	Labels map[string]string `json:"labels,omitempty"`
 
 	// LoadBalancingScheme: This signifies what the ForwardingRule will be
-	// used for and can only take the following values: INTERNAL EXTERNAL
+	// used for and can only take the following values: INTERNAL, EXTERNAL
 	// The value of INTERNAL means that this will be used for Internal
 	// Network Load Balancing (TCP, UDP). The value of EXTERNAL means that
 	// this will be used for External Load Balancing (HTTP(S) LB, External
@@ -4877,13 +5210,12 @@
 	Network string `json:"network,omitempty"`
 
 	// NetworkTier: This signifies the networking tier used for configuring
-	// this load balancer and can only take the following values:
-	// CLOUD_NETWORK_PREMIUM , CLOUD_NETWORK_SELECT. If this field is not
-	// specified, it is assumed to be CLOUD_NETWORK_PREMIUM.
+	// this load balancer and can only take the following values: PREMIUM ,
+	// SELECT. If this field is not specified, it is assumed to be PREMIUM.
 	//
 	// Possible values:
-	//   "CLOUD_NETWORK_PREMIUM"
-	//   "CLOUD_NETWORK_SELECT"
+	//   "PREMIUM"
+	//   "SELECT"
 	NetworkTier string `json:"networkTier,omitempty"`
 
 	// PortRange: Applicable only when IPProtocol is TCP, UDP, or SCTP, only
@@ -5135,6 +5467,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -5696,7 +6029,7 @@
 	// following is a valid partial url to a predefined host
 	// type:
 	//
-	// zones/us-central1-f/hostTypes/n1-host-64-416
+	// zones/us-central1-b/hostTypes/n1-host-64-416
 	HostType string `json:"hostType,omitempty"`
 
 	// Id: [Output Only] The unique identifier for the resource. This
@@ -5913,6 +6246,308 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// HostType: A Host Type resource.
+type HostType struct {
+	// CpuPlatform: [Output Only] The CPU platform used by this host type.
+	CpuPlatform string `json:"cpuPlatform,omitempty"`
+
+	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
+	// format.
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Deprecated: [Output Only] The deprecation status associated with this
+	// host type.
+	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
+
+	// Description: [Output Only] An optional textual description of the
+	// resource.
+	Description string `json:"description,omitempty"`
+
+	// GuestCpus: [Output Only] The number of virtual CPUs that are
+	// available to the host type.
+	GuestCpus int64 `json:"guestCpus,omitempty"`
+
+	// Id: [Output Only] The unique identifier for the resource. This
+	// identifier is defined by the server.
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: [Output Only] The type of the resource. Always compute#hostType
+	// for host types.
+	Kind string `json:"kind,omitempty"`
+
+	// LocalSsdGb: [Output Only] Local SSD available to the host type,
+	// defined in GB.
+	LocalSsdGb int64 `json:"localSsdGb,omitempty"`
+
+	// MemoryMb: [Output Only] The amount of physical memory available to
+	// the host type, defined in MB.
+	MemoryMb int64 `json:"memoryMb,omitempty"`
+
+	// Name: [Output Only] Name of the resource.
+	Name string `json:"name,omitempty"`
+
+	// SelfLink: [Output Only] Server-defined URL for the resource.
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// Zone: [Output Only] The name of the zone where the host type resides,
+	// such as us-central1-a.
+	Zone string `json:"zone,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "CpuPlatform") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "CpuPlatform") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *HostType) MarshalJSON() ([]byte, error) {
+	type noMethod HostType
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type HostTypeAggregatedList struct {
+	// Id: [Output Only] The unique identifier for the resource. This
+	// identifier is defined by the server.
+	Id string `json:"id,omitempty"`
+
+	// Items: [Output Only] A map of scoped host type lists.
+	Items map[string]HostTypesScopedList `json:"items,omitempty"`
+
+	// Kind: [Output Only] Type of resource.Always
+	// compute#hostTypeAggregatedList for aggregated lists of host types.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: [Output Only] This token allows you to get the next
+	// page of results for list requests. If the number of results is larger
+	// than maxResults, use the nextPageToken as a value for the query
+	// parameter pageToken in the next list request. Subsequent list
+	// requests will have their own nextPageToken to continue paging through
+	// the results.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: [Output Only] Server-defined URL for the resource.
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Id") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Id") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *HostTypeAggregatedList) MarshalJSON() ([]byte, error) {
+	type noMethod HostTypeAggregatedList
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// HostTypeList: Contains a list of host types.
+type HostTypeList struct {
+	// Id: [Output Only] The unique identifier for the resource. This
+	// identifier is defined by the server.
+	Id string `json:"id,omitempty"`
+
+	// Items: [Output Only] A list of Host Type resources.
+	Items []*HostType `json:"items,omitempty"`
+
+	// Kind: [Output Only] Type of resource.Always compute#hostTypeList for
+	// lists of host types.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: [Output Only] This token allows you to get the next
+	// page of results for list requests. If the number of results is larger
+	// than maxResults, use the nextPageToken as a value for the query
+	// parameter pageToken in the next list request. Subsequent list
+	// requests will have their own nextPageToken to continue paging through
+	// the results.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: [Output Only] Server-defined URL for the resource.
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Id") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Id") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *HostTypeList) MarshalJSON() ([]byte, error) {
+	type noMethod HostTypeList
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type HostTypesScopedList struct {
+	// HostTypes: [Output Only] List of host types contained in this scope.
+	HostTypes []*HostType `json:"hostTypes,omitempty"`
+
+	// Warning: [Output Only] An informational warning that appears when the
+	// host types list is empty.
+	Warning *HostTypesScopedListWarning `json:"warning,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "HostTypes") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "HostTypes") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *HostTypesScopedList) MarshalJSON() ([]byte, error) {
+	type noMethod HostTypesScopedList
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// HostTypesScopedListWarning: [Output Only] An informational warning
+// that appears when the host types list is empty.
+type HostTypesScopedListWarning struct {
+	// Code: [Output Only] A warning code, if applicable. For example,
+	// Compute Engine returns NO_RESULTS_ON_PAGE if there are no results in
+	// the response.
+	//
+	// Possible values:
+	//   "CLEANUP_FAILED"
+	//   "DEPRECATED_RESOURCE_USED"
+	//   "DISK_SIZE_LARGER_THAN_IMAGE_SIZE"
+	//   "FIELD_VALUE_OVERRIDEN"
+	//   "INJECTED_KERNELS_DEPRECATED"
+	//   "NEXT_HOP_ADDRESS_NOT_ASSIGNED"
+	//   "NEXT_HOP_CANNOT_IP_FORWARD"
+	//   "NEXT_HOP_INSTANCE_NOT_FOUND"
+	//   "NEXT_HOP_INSTANCE_NOT_ON_NETWORK"
+	//   "NEXT_HOP_NOT_RUNNING"
+	//   "NOT_CRITICAL_ERROR"
+	//   "NO_RESULTS_ON_PAGE"
+	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
+	//   "RESOURCE_NOT_DELETED"
+	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
+	//   "UNREACHABLE"
+	Code string `json:"code,omitempty"`
+
+	// Data: [Output Only] Metadata about this warning in key: value format.
+	// For example:
+	// "data": [ { "key": "scope", "value": "zones/us-east1-d" }
+	Data []*HostTypesScopedListWarningData `json:"data,omitempty"`
+
+	// Message: [Output Only] A human-readable description of the warning
+	// code.
+	Message string `json:"message,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Code") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Code") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *HostTypesScopedListWarning) MarshalJSON() ([]byte, error) {
+	type noMethod HostTypesScopedListWarning
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type HostTypesScopedListWarningData struct {
+	// Key: [Output Only] A key that provides more detail on the warning
+	// being returned. For example, for warnings where there are no results
+	// in a list request for a particular zone, this key might be scope and
+	// the key value might be the zone name. Other examples might be a key
+	// indicating a deprecated resource and a suggested replacement, or a
+	// warning about invalid network settings (for example, if an instance
+	// attempts to perform IP forwarding but is not enabled for IP
+	// forwarding).
+	Key string `json:"key,omitempty"`
+
+	// Value: [Output Only] A warning data value corresponding to the key.
+	Value string `json:"value,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Key") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Key") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *HostTypesScopedListWarningData) MarshalJSON() ([]byte, error) {
+	type noMethod HostTypesScopedListWarningData
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 type HostsScopedList struct {
 	// Hosts: [Output Only] List of hosts contained in this scope.
 	Hosts []*Host `json:"hosts,omitempty"`
@@ -5965,6 +6600,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -6687,6 +7323,10 @@
 	// This includes custom metadata and predefined keys.
 	Metadata *Metadata `json:"metadata,omitempty"`
 
+	// MinCpuPlatform: Minimum cpu/platform to be used by this instance. We
+	// may schedule on the specified or later cpu/platform.
+	MinCpuPlatform string `json:"minCpuPlatform,omitempty"`
+
 	// Name: The name of the resource, provided by the client when initially
 	// creating the resource. The resource name must be 1-63 characters
 	// long, and comply with RFC1035. Specifically, the name must be 1-63
@@ -7486,8 +8126,13 @@
 type InstanceGroupManagerVersion struct {
 	InstanceTemplate string `json:"instanceTemplate,omitempty"`
 
+	// Name: Name of the version. Unique among all versions in the scope of
+	// this managed instance group.
+	Name string `json:"name,omitempty"`
+
 	// Tag: Tag describing the version. Used to trigger rollout of a target
-	// version even if instance_template remains unchanged.
+	// version even if instance_template remains unchanged. Deprecated in
+	// favor of 'name'.
 	Tag string `json:"tag,omitempty"`
 
 	// TargetSize: Intended number of instances that are created from
@@ -7584,6 +8229,14 @@
 	// instance group.
 	ManagedInstances []*ManagedInstance `json:"managedInstances,omitempty"`
 
+	// NextPageToken: [Output Only] This token allows you to get the next
+	// page of results for list requests. If the number of results is larger
+	// than maxResults, use the nextPageToken as a value for the query
+	// parameter pageToken in the next list request. Subsequent list
+	// requests will have their own nextPageToken to continue paging through
+	// the results.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
 	// ServerResponse contains the HTTP response code and headers from the
 	// server.
 	googleapi.ServerResponse `json:"-"`
@@ -7749,6 +8402,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -8115,6 +8769,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -8639,6 +9294,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -8755,6 +9411,33 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type InstancesSetMachineResourcesRequest struct {
+	GuestAccelerators []*AcceleratorConfig `json:"guestAccelerators,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "GuestAccelerators")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "GuestAccelerators") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *InstancesSetMachineResourcesRequest) MarshalJSON() ([]byte, error) {
+	type noMethod InstancesSetMachineResourcesRequest
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 type InstancesSetMachineTypeRequest struct {
 	// MachineType: Full or partial URL of the machine type resource. See
 	// Machine Types for a full list of machine types. For example:
@@ -9205,6 +9888,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -9358,6 +10042,9 @@
 	// Tag: [Output Only] Tag describing the version.
 	Tag string `json:"tag,omitempty"`
 
+	// Version: [Output Only] Intended version of this instance.
+	Version *ManagedInstanceVersion `json:"version,omitempty"`
+
 	// ForceSendFields is a list of field names (e.g. "CurrentAction") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -9473,6 +10160,39 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type ManagedInstanceVersion struct {
+	// InstanceTemplate: [Output Only] The intended template of the
+	// instance. This field is empty when current_action is one of {
+	// DELETING, ABANDONING }.
+	InstanceTemplate string `json:"instanceTemplate,omitempty"`
+
+	// Name: [Output Only] Name of the version.
+	Name string `json:"name,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "InstanceTemplate") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "InstanceTemplate") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ManagedInstanceVersion) MarshalJSON() ([]byte, error) {
+	type noMethod ManagedInstanceVersion
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // Metadata: A metadata key/value entry.
 type Metadata struct {
 	// Fingerprint: Specifies a fingerprint for this request, which is
@@ -9705,12 +10425,15 @@
 	// the server. For network devices, these are eth0, eth1, etc.
 	Name string `json:"name,omitempty"`
 
-	// Network: URL of the network resource for this instance. This is
-	// required for creating an instance but optional when creating a
-	// firewall rule. If not specified when creating a firewall rule, the
-	// default network is used:
+	// Network: URL of the network resource for this instance. When creating
+	// an instance, if neither the network nor the subnetwork is specified,
+	// the default network global/networks/default is used; if the network
+	// is not specified but the subnetwork is specified, the network is
+	// inferred.
 	//
-	// global/networks/default
+	// This field is optional when creating a firewall rule. If not
+	// specified when creating a firewall rule, the default network
+	// global/networks/default is used.
 	//
 	// If you specify this property, you can specify the network as a full
 	// or partial URL. For example, the following are all valid URLs:
@@ -10151,6 +10874,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -10378,6 +11102,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -10560,12 +11285,8 @@
 // For a description of IAM and its features, see the [IAM developer's
 // guide](https://cloud.google.com/iam).
 type Policy struct {
-	// AuditConfigs: Specifies audit logging configs for "data access".
-	// "data access": generally refers to data reads/writes and admin reads.
-	// "admin activity": generally refers to admin writes.
-	//
-	// Note: `AuditConfig` doesn't apply to "admin activity", which always
-	// enables audit logging.
+	// AuditConfigs: Specifies cloud audit logging configuration for this
+	// policy.
 	AuditConfigs []*AuditConfig `json:"auditConfigs,omitempty"`
 
 	// Bindings: Associates a list of `members` to a `role`. Multiple
@@ -10877,6 +11598,7 @@
 	//   "BACKEND_BUCKETS"
 	//   "BACKEND_SERVICES"
 	//   "CPUS"
+	//   "CPUS_ALL_REGIONS"
 	//   "DISKS_TOTAL_GB"
 	//   "FIREWALLS"
 	//   "FORWARDING_RULES"
@@ -10907,7 +11629,6 @@
 	//   "TARGET_SSL_PROXIES"
 	//   "TARGET_TCP_PROXIES"
 	//   "TARGET_VPN_GATEWAYS"
-	//   "TOTAL_CPUS"
 	//   "URL_MAPS"
 	//   "VPN_TUNNELS"
 	Metric string `json:"metric,omitempty"`
@@ -11306,6 +12027,14 @@
 	// ManagedInstances: List of managed instances.
 	ManagedInstances []*ManagedInstance `json:"managedInstances,omitempty"`
 
+	// NextPageToken: [Output Only] This token allows you to get the next
+	// page of results for list requests. If the number of results is larger
+	// than maxResults, use the nextPageToken as a value for the query
+	// parameter pageToken in the next list request. Subsequent list
+	// requests will have their own nextPageToken to continue paging through
+	// the results.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
 	// ServerResponse contains the HTTP response code and headers from the
 	// server.
 	googleapi.ServerResponse `json:"-"`
@@ -11741,8 +12470,8 @@
 // a tie, it uses the layer three and four packet headers to select just
 // one of the remaining matching routes. The packet is then forwarded as
 // specified by the nextHop field of the winning route - either to
-// another instance destination, a instance gateway or a Google Compute
-// Engine-operated gateway.
+// another instance destination, an instance gateway, or a Google
+// Compute Engine-operated gateway.
 //
 // Packets that do not match any route in the sending instance's routing
 // table are dropped.
@@ -11874,6 +12603,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -12299,6 +13029,9 @@
 	// BestRoutes: Best routes for this router's network.
 	BestRoutes []*Route `json:"bestRoutes,omitempty"`
 
+	// BestRoutesForRouter: Best routes learned by this router.
+	BestRoutesForRouter []*Route `json:"bestRoutesForRouter,omitempty"`
+
 	BgpPeerStatus []*RouterStatusBgpPeerStatus `json:"bgpPeerStatus,omitempty"`
 
 	// Network: URI of the network to which this router belongs.
@@ -12504,6 +13237,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -13492,6 +14226,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -14189,6 +14924,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -14714,6 +15450,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -15455,6 +16192,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -16279,6 +17017,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -16441,6 +17180,10 @@
 
 // Zone: A Zone resource.
 type Zone struct {
+	// AvailableCpuPlatforms: [Output Only] Available cpu/platform
+	// selections for the zone.
+	AvailableCpuPlatforms []string `json:"availableCpuPlatforms,omitempty"`
+
 	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
 	// format.
 	CreationTimestamp string `json:"creationTimestamp,omitempty"`
@@ -16481,15 +17224,16 @@
 	// server.
 	googleapi.ServerResponse `json:"-"`
 
-	// ForceSendFields is a list of field names (e.g. "CreationTimestamp")
-	// to unconditionally include in API requests. By default, fields with
-	// empty values are omitted from API requests. However, any non-pointer,
-	// non-interface field appearing in ForceSendFields will be sent to the
-	// server regardless of whether the field is empty or not. This may be
-	// used to include empty fields in Patch requests.
+	// ForceSendFields is a list of field names (e.g.
+	// "AvailableCpuPlatforms") to unconditionally include in API requests.
+	// By default, fields with empty values are omitted from API requests.
+	// However, any non-pointer, non-interface field appearing in
+	// ForceSendFields will be sent to the server regardless of whether the
+	// field is empty or not. This may be used to include empty fields in
+	// Patch requests.
 	ForceSendFields []string `json:"-"`
 
-	// NullFields is a list of field names (e.g. "CreationTimestamp") to
+	// NullFields is a list of field names (e.g. "AvailableCpuPlatforms") to
 	// include in API requests with the JSON null value. By default, fields
 	// with empty values are omitted from API requests. However, any field
 	// with an empty value appearing in NullFields will be sent to the
@@ -16591,6 +17335,686 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// method id "compute.acceleratorTypes.aggregatedList":
+
+type AcceleratorTypesAggregatedListCall struct {
+	s            *Service
+	project      string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// AggregatedList: Retrieves an aggregated list of accelerator types.
+func (r *AcceleratorTypesService) AggregatedList(project string) *AcceleratorTypesAggregatedListCall {
+	c := &AcceleratorTypesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Sets a filter expression
+// for filtering listed resources, in the form filter={expression}. Your
+// {expression} must be in the format: field_name comparison_string
+// literal_string.
+//
+// The field_name is the name of the field you want to compare. Only
+// atomic field types are supported (string, number, boolean). The
+// comparison_string must be either eq (equals) or ne (not equals). The
+// literal_string is the string value to filter to. The literal value
+// must be valid for the type of field you are filtering by (string,
+// number, boolean). For string fields, the literal value is interpreted
+// as a regular expression using RE2 syntax. The literal value must
+// match the entire field.
+//
+// For example, to filter for instances that do not have a name of
+// example-instance, you would use filter=name ne example-instance.
+//
+// You can filter on nested fields. For example, you could filter on
+// instances that have set the scheduling.automaticRestart field to
+// true. Use filtering on nested fields to take advantage of labels to
+// organize and search for results based on label values.
+//
+// To filter on multiple expressions, provide each separate expression
+// within parentheses. For example, (scheduling.automaticRestart eq
+// true) (zone eq us-central1-f). Multiple expressions are treated as
+// AND expressions, meaning that resources must match all expressions to
+// pass the filters.
+func (c *AcceleratorTypesAggregatedListCall) Filter(filter string) *AcceleratorTypesAggregatedListCall {
+	c.urlParams_.Set("filter", filter)
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of results per page that should be returned. If the number of
+// available results is larger than maxResults, Compute Engine returns a
+// nextPageToken that can be used to get the next page of results in
+// subsequent list requests.
+func (c *AcceleratorTypesAggregatedListCall) MaxResults(maxResults int64) *AcceleratorTypesAggregatedListCall {
+	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
+	return c
+}
+
+// OrderBy sets the optional parameter "orderBy": Sorts list results by
+// a certain order. By default, results are returned in alphanumerical
+// order based on the resource name.
+//
+// You can also sort results in descending order based on the creation
+// timestamp using orderBy="creationTimestamp desc". This sorts results
+// based on the creationTimestamp field in reverse chronological order
+// (newest result first). Use this to sort resources like operations so
+// that the newest operation is returned first.
+//
+// Currently, only sorting by name or creationTimestamp desc is
+// supported.
+func (c *AcceleratorTypesAggregatedListCall) OrderBy(orderBy string) *AcceleratorTypesAggregatedListCall {
+	c.urlParams_.Set("orderBy", orderBy)
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Specifies a page
+// token to use. Set pageToken to the nextPageToken returned by a
+// previous list request to get the next page of results.
+func (c *AcceleratorTypesAggregatedListCall) PageToken(pageToken string) *AcceleratorTypesAggregatedListCall {
+	c.urlParams_.Set("pageToken", pageToken)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AcceleratorTypesAggregatedListCall) Fields(s ...googleapi.Field) *AcceleratorTypesAggregatedListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *AcceleratorTypesAggregatedListCall) IfNoneMatch(entityTag string) *AcceleratorTypesAggregatedListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *AcceleratorTypesAggregatedListCall) Context(ctx context.Context) *AcceleratorTypesAggregatedListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *AcceleratorTypesAggregatedListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *AcceleratorTypesAggregatedListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/acceleratorTypes")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project": c.project,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.acceleratorTypes.aggregatedList" call.
+// Exactly one of *AcceleratorTypeAggregatedList or error will be
+// non-nil. Any non-2xx status code is an error. Response headers are in
+// either *AcceleratorTypeAggregatedList.ServerResponse.Header or (if a
+// response was returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *AcceleratorTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*AcceleratorTypeAggregatedList, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AcceleratorTypeAggregatedList{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves an aggregated list of accelerator types.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.acceleratorTypes.aggregatedList",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "500",
+	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "orderBy": {
+	//       "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/aggregated/acceleratorTypes",
+	//   "response": {
+	//     "$ref": "AcceleratorTypeAggregatedList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *AcceleratorTypesAggregatedListCall) Pages(ctx context.Context, f func(*AcceleratorTypeAggregatedList) error) error {
+	c.ctx_ = ctx
+	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.PageToken(x.NextPageToken)
+	}
+}
+
+// method id "compute.acceleratorTypes.get":
+
+type AcceleratorTypesGetCall struct {
+	s               *Service
+	project         string
+	zone            string
+	acceleratorType string
+	urlParams_      gensupport.URLParams
+	ifNoneMatch_    string
+	ctx_            context.Context
+	header_         http.Header
+}
+
+// Get: Returns the specified accelerator type. Get a list of available
+// accelerator types by making a list() request.
+func (r *AcceleratorTypesService) Get(project string, zone string, acceleratorType string) *AcceleratorTypesGetCall {
+	c := &AcceleratorTypesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.zone = zone
+	c.acceleratorType = acceleratorType
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AcceleratorTypesGetCall) Fields(s ...googleapi.Field) *AcceleratorTypesGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *AcceleratorTypesGetCall) IfNoneMatch(entityTag string) *AcceleratorTypesGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *AcceleratorTypesGetCall) Context(ctx context.Context) *AcceleratorTypesGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *AcceleratorTypesGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *AcceleratorTypesGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/acceleratorTypes/{acceleratorType}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project":         c.project,
+		"zone":            c.zone,
+		"acceleratorType": c.acceleratorType,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.acceleratorTypes.get" call.
+// Exactly one of *AcceleratorType or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *AcceleratorType.ServerResponse.Header or (if a response was returned
+// at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *AcceleratorTypesGetCall) Do(opts ...googleapi.CallOption) (*AcceleratorType, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AcceleratorType{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified accelerator type. Get a list of available accelerator types by making a list() request.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.acceleratorTypes.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "acceleratorType"
+	//   ],
+	//   "parameters": {
+	//     "acceleratorType": {
+	//       "description": "Name of the accelerator type to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "The name of the zone for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/acceleratorTypes/{acceleratorType}",
+	//   "response": {
+	//     "$ref": "AcceleratorType"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.acceleratorTypes.list":
+
+type AcceleratorTypesListCall struct {
+	s            *Service
+	project      string
+	zone         string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// List: Retrieves a list of accelerator types available to the
+// specified project.
+func (r *AcceleratorTypesService) List(project string, zone string) *AcceleratorTypesListCall {
+	c := &AcceleratorTypesListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.zone = zone
+	return c
+}
+
+// Filter sets the optional parameter "filter": Sets a filter expression
+// for filtering listed resources, in the form filter={expression}. Your
+// {expression} must be in the format: field_name comparison_string
+// literal_string.
+//
+// The field_name is the name of the field you want to compare. Only
+// atomic field types are supported (string, number, boolean). The
+// comparison_string must be either eq (equals) or ne (not equals). The
+// literal_string is the string value to filter to. The literal value
+// must be valid for the type of field you are filtering by (string,
+// number, boolean). For string fields, the literal value is interpreted
+// as a regular expression using RE2 syntax. The literal value must
+// match the entire field.
+//
+// For example, to filter for instances that do not have a name of
+// example-instance, you would use filter=name ne example-instance.
+//
+// You can filter on nested fields. For example, you could filter on
+// instances that have set the scheduling.automaticRestart field to
+// true. Use filtering on nested fields to take advantage of labels to
+// organize and search for results based on label values.
+//
+// To filter on multiple expressions, provide each separate expression
+// within parentheses. For example, (scheduling.automaticRestart eq
+// true) (zone eq us-central1-f). Multiple expressions are treated as
+// AND expressions, meaning that resources must match all expressions to
+// pass the filters.
+func (c *AcceleratorTypesListCall) Filter(filter string) *AcceleratorTypesListCall {
+	c.urlParams_.Set("filter", filter)
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of results per page that should be returned. If the number of
+// available results is larger than maxResults, Compute Engine returns a
+// nextPageToken that can be used to get the next page of results in
+// subsequent list requests.
+func (c *AcceleratorTypesListCall) MaxResults(maxResults int64) *AcceleratorTypesListCall {
+	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
+	return c
+}
+
+// OrderBy sets the optional parameter "orderBy": Sorts list results by
+// a certain order. By default, results are returned in alphanumerical
+// order based on the resource name.
+//
+// You can also sort results in descending order based on the creation
+// timestamp using orderBy="creationTimestamp desc". This sorts results
+// based on the creationTimestamp field in reverse chronological order
+// (newest result first). Use this to sort resources like operations so
+// that the newest operation is returned first.
+//
+// Currently, only sorting by name or creationTimestamp desc is
+// supported.
+func (c *AcceleratorTypesListCall) OrderBy(orderBy string) *AcceleratorTypesListCall {
+	c.urlParams_.Set("orderBy", orderBy)
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Specifies a page
+// token to use. Set pageToken to the nextPageToken returned by a
+// previous list request to get the next page of results.
+func (c *AcceleratorTypesListCall) PageToken(pageToken string) *AcceleratorTypesListCall {
+	c.urlParams_.Set("pageToken", pageToken)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AcceleratorTypesListCall) Fields(s ...googleapi.Field) *AcceleratorTypesListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *AcceleratorTypesListCall) IfNoneMatch(entityTag string) *AcceleratorTypesListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *AcceleratorTypesListCall) Context(ctx context.Context) *AcceleratorTypesListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *AcceleratorTypesListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *AcceleratorTypesListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/acceleratorTypes")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project": c.project,
+		"zone":    c.zone,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.acceleratorTypes.list" call.
+// Exactly one of *AcceleratorTypeList or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *AcceleratorTypeList.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *AcceleratorTypesListCall) Do(opts ...googleapi.CallOption) (*AcceleratorTypeList, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AcceleratorTypeList{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves a list of accelerator types available to the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.acceleratorTypes.list",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "500",
+	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "orderBy": {
+	//       "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "The name of the zone for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/acceleratorTypes",
+	//   "response": {
+	//     "$ref": "AcceleratorTypeList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *AcceleratorTypesListCall) Pages(ctx context.Context, f func(*AcceleratorTypeList) error) error {
+	c.ctx_ = ctx
+	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.PageToken(x.NextPageToken)
+	}
+}
+
 // method id "compute.addresses.aggregatedList":
 
 type AddressesAggregatedListCall struct {
@@ -16718,6 +18142,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16788,7 +18213,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -16897,6 +18321,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses/{address}")
@@ -17056,6 +18481,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17209,6 +18635,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.address)
 	if err != nil {
@@ -17433,6 +18860,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17505,7 +18933,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -17568,6 +18995,165 @@
 	}
 }
 
+// method id "compute.addresses.setLabels":
+
+type AddressesSetLabelsCall struct {
+	s                      *Service
+	project                string
+	region                 string
+	resource               string
+	regionsetlabelsrequest *RegionSetLabelsRequest
+	urlParams_             gensupport.URLParams
+	ctx_                   context.Context
+	header_                http.Header
+}
+
+// SetLabels: Sets the labels on an Address. To learn more about labels,
+// read the Labeling or Tagging Resources documentation.
+func (r *AddressesService) SetLabels(project string, region string, resource string, regionsetlabelsrequest *RegionSetLabelsRequest) *AddressesSetLabelsCall {
+	c := &AddressesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.region = region
+	c.resource = resource
+	c.regionsetlabelsrequest = regionsetlabelsrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AddressesSetLabelsCall) Fields(s ...googleapi.Field) *AddressesSetLabelsCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *AddressesSetLabelsCall) Context(ctx context.Context) *AddressesSetLabelsCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *AddressesSetLabelsCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *AddressesSetLabelsCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regionsetlabelsrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses/{resource}/setLabels")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project":  c.project,
+		"region":   c.region,
+		"resource": c.resource,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.addresses.setLabels" call.
+// Exactly one of *Operation or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *Operation.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *AddressesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Operation{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Sets the labels on an Address. To learn more about labels, read the Labeling or Tagging Resources documentation.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.addresses.setLabels",
+	//   "parameterOrder": [
+	//     "project",
+	//     "region",
+	//     "resource"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "The region for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "resource": {
+	//       "description": "Name of the resource for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/regions/{region}/addresses/{resource}/setLabels",
+	//   "request": {
+	//     "$ref": "RegionSetLabelsRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
 // method id "compute.addresses.testIamPermissions":
 
 type AddressesTestIamPermissionsCall struct {
@@ -17623,6 +19209,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -17853,6 +19440,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17923,7 +19511,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -18031,6 +19618,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers/{autoscaler}")
@@ -18190,6 +19778,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18342,6 +19931,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler)
 	if err != nil {
@@ -18565,6 +20155,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18637,7 +20228,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -18754,6 +20344,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler2)
 	if err != nil {
@@ -18911,6 +20502,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -19075,6 +20667,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler)
 	if err != nil {
@@ -19225,6 +20818,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets/{backendBucket}")
@@ -19373,6 +20967,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19525,6 +21120,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19666,6 +21262,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendbucket)
 	if err != nil {
@@ -19878,6 +21475,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19948,7 +21546,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -20057,6 +21654,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendbucket)
 	if err != nil {
@@ -20204,6 +21802,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
 	if err != nil {
@@ -20352,6 +21951,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -20500,6 +22100,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendbucket)
 	if err != nil {
@@ -20721,6 +22322,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20791,7 +22393,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -20898,6 +22499,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}")
@@ -21047,6 +22649,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21191,6 +22794,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourcegroupreference)
 	if err != nil {
@@ -21339,6 +22943,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -21552,6 +23157,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21622,7 +23228,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -21735,6 +23340,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -21882,6 +23488,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -22033,6 +23640,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -22180,6 +23788,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -22401,6 +24010,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22471,7 +24081,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -22591,6 +24200,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22754,6 +24364,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22906,6 +24517,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.commitment)
 	if err != nil {
@@ -23129,6 +24741,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23201,7 +24814,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -23319,6 +24931,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
 	if err != nil {
@@ -23478,6 +25091,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -23709,6 +25323,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23779,7 +25394,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -23900,6 +25514,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24129,6 +25744,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24201,7 +25817,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -24391,6 +26006,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24461,7 +26077,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -24578,6 +26193,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.snapshot)
 	if err != nil {
@@ -24741,6 +26357,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}")
@@ -24900,6 +26517,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25063,6 +26681,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.disk)
 	if err != nil {
@@ -25292,6 +26911,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25364,7 +26984,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -25481,6 +27100,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.disksresizerequest)
 	if err != nil {
@@ -25639,6 +27259,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.zonesetlabelsrequest)
 	if err != nil {
@@ -25797,6 +27418,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -25952,6 +27574,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}")
@@ -26100,6 +27723,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26242,6 +27866,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall)
 	if err != nil {
@@ -26455,6 +28080,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26525,7 +28151,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -26635,6 +28260,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2)
 	if err != nil {
@@ -26782,6 +28408,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -26931,6 +28558,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2)
 	if err != nil {
@@ -27152,6 +28780,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27222,7 +28851,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -27331,6 +28959,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{forwardingRule}")
@@ -27490,6 +29119,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27643,6 +29273,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.forwardingrule)
 	if err != nil {
@@ -27867,6 +29498,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27939,7 +29571,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -28002,6 +29633,165 @@
 	}
 }
 
+// method id "compute.forwardingRules.setLabels":
+
+type ForwardingRulesSetLabelsCall struct {
+	s                      *Service
+	project                string
+	region                 string
+	resource               string
+	regionsetlabelsrequest *RegionSetLabelsRequest
+	urlParams_             gensupport.URLParams
+	ctx_                   context.Context
+	header_                http.Header
+}
+
+// SetLabels: Sets the labels on the specified resource. To learn more
+// about labels, read the Labeling or Tagging Resources documentation.
+func (r *ForwardingRulesService) SetLabels(project string, region string, resource string, regionsetlabelsrequest *RegionSetLabelsRequest) *ForwardingRulesSetLabelsCall {
+	c := &ForwardingRulesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.region = region
+	c.resource = resource
+	c.regionsetlabelsrequest = regionsetlabelsrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ForwardingRulesSetLabelsCall) Fields(s ...googleapi.Field) *ForwardingRulesSetLabelsCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ForwardingRulesSetLabelsCall) Context(ctx context.Context) *ForwardingRulesSetLabelsCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ForwardingRulesSetLabelsCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ForwardingRulesSetLabelsCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regionsetlabelsrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{resource}/setLabels")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project":  c.project,
+		"region":   c.region,
+		"resource": c.resource,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.forwardingRules.setLabels" call.
+// Exactly one of *Operation or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *Operation.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *ForwardingRulesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Operation{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling or Tagging Resources documentation.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.forwardingRules.setLabels",
+	//   "parameterOrder": [
+	//     "project",
+	//     "region",
+	//     "resource"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "The region for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "resource": {
+	//       "description": "Name of the resource for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/regions/{region}/forwardingRules/{resource}/setLabels",
+	//   "request": {
+	//     "$ref": "RegionSetLabelsRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
 // method id "compute.forwardingRules.setTarget":
 
 type ForwardingRulesSetTargetCall struct {
@@ -28058,6 +29848,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
 	if err != nil {
@@ -28216,6 +30007,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -28371,6 +30163,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses/{address}")
@@ -28520,6 +30313,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28662,6 +30456,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.address)
 	if err != nil {
@@ -28874,6 +30669,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28944,7 +30740,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -29000,6 +30795,154 @@
 	}
 }
 
+// method id "compute.globalAddresses.setLabels":
+
+type GlobalAddressesSetLabelsCall struct {
+	s                      *Service
+	project                string
+	resource               string
+	globalsetlabelsrequest *GlobalSetLabelsRequest
+	urlParams_             gensupport.URLParams
+	ctx_                   context.Context
+	header_                http.Header
+}
+
+// SetLabels: Sets the labels on a GlobalAddress. To learn more about
+// labels, read the Labeling or Tagging Resources documentation.
+func (r *GlobalAddressesService) SetLabels(project string, resource string, globalsetlabelsrequest *GlobalSetLabelsRequest) *GlobalAddressesSetLabelsCall {
+	c := &GlobalAddressesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.resource = resource
+	c.globalsetlabelsrequest = globalsetlabelsrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *GlobalAddressesSetLabelsCall) Fields(s ...googleapi.Field) *GlobalAddressesSetLabelsCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *GlobalAddressesSetLabelsCall) Context(ctx context.Context) *GlobalAddressesSetLabelsCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *GlobalAddressesSetLabelsCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *GlobalAddressesSetLabelsCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetlabelsrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses/{resource}/setLabels")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project":  c.project,
+		"resource": c.resource,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.globalAddresses.setLabels" call.
+// Exactly one of *Operation or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *Operation.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *GlobalAddressesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Operation{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Sets the labels on a GlobalAddress. To learn more about labels, read the Labeling or Tagging Resources documentation.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.globalAddresses.setLabels",
+	//   "parameterOrder": [
+	//     "project",
+	//     "resource"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "resource": {
+	//       "description": "Name of the resource for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/addresses/{resource}/setLabels",
+	//   "request": {
+	//     "$ref": "GlobalSetLabelsRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
 // method id "compute.globalAddresses.testIamPermissions":
 
 type GlobalAddressesTestIamPermissionsCall struct {
@@ -29053,6 +30996,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -29199,6 +31143,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{forwardingRule}")
@@ -29348,6 +31293,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -29490,6 +31436,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.forwardingrule)
 	if err != nil {
@@ -29703,6 +31650,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -29773,7 +31721,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -29829,6 +31776,154 @@
 	}
 }
 
+// method id "compute.globalForwardingRules.setLabels":
+
+type GlobalForwardingRulesSetLabelsCall struct {
+	s                      *Service
+	project                string
+	resource               string
+	globalsetlabelsrequest *GlobalSetLabelsRequest
+	urlParams_             gensupport.URLParams
+	ctx_                   context.Context
+	header_                http.Header
+}
+
+// SetLabels: Sets the labels on the specified resource. To learn more
+// about labels, read the Labeling or Tagging Resources documentation.
+func (r *GlobalForwardingRulesService) SetLabels(project string, resource string, globalsetlabelsrequest *GlobalSetLabelsRequest) *GlobalForwardingRulesSetLabelsCall {
+	c := &GlobalForwardingRulesSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.resource = resource
+	c.globalsetlabelsrequest = globalsetlabelsrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *GlobalForwardingRulesSetLabelsCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesSetLabelsCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *GlobalForwardingRulesSetLabelsCall) Context(ctx context.Context) *GlobalForwardingRulesSetLabelsCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *GlobalForwardingRulesSetLabelsCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *GlobalForwardingRulesSetLabelsCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetlabelsrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{resource}/setLabels")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project":  c.project,
+		"resource": c.resource,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.globalForwardingRules.setLabels" call.
+// Exactly one of *Operation or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *Operation.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *GlobalForwardingRulesSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Operation{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Sets the labels on the specified resource. To learn more about labels, read the Labeling or Tagging Resources documentation.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.globalForwardingRules.setLabels",
+	//   "parameterOrder": [
+	//     "project",
+	//     "resource"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "resource": {
+	//       "description": "Name of the resource for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9_]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/global/forwardingRules/{resource}/setLabels",
+	//   "request": {
+	//     "$ref": "GlobalSetLabelsRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
 // method id "compute.globalForwardingRules.setTarget":
 
 type GlobalForwardingRulesSetTargetCall struct {
@@ -29883,6 +31978,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
 	if err != nil {
@@ -30030,6 +32126,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -30252,6 +32349,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30322,7 +32420,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -30429,6 +32526,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}")
@@ -30550,6 +32648,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30768,6 +32867,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30838,7 +32938,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -30944,6 +33043,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks/{healthCheck}")
@@ -31092,6 +33192,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31233,6 +33334,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck)
 	if err != nil {
@@ -31445,6 +33547,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31515,7 +33618,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -31625,6 +33727,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck)
 	if err != nil {
@@ -31772,6 +33875,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -31920,6 +34024,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck)
 	if err != nil {
@@ -32014,6 +34119,686 @@
 
 }
 
+// method id "compute.hostTypes.aggregatedList":
+
+type HostTypesAggregatedListCall struct {
+	s            *Service
+	project      string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// AggregatedList: Retrieves an aggregated list of host types.
+func (r *HostTypesService) AggregatedList(project string) *HostTypesAggregatedListCall {
+	c := &HostTypesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Sets a filter expression
+// for filtering listed resources, in the form filter={expression}. Your
+// {expression} must be in the format: field_name comparison_string
+// literal_string.
+//
+// The field_name is the name of the field you want to compare. Only
+// atomic field types are supported (string, number, boolean). The
+// comparison_string must be either eq (equals) or ne (not equals). The
+// literal_string is the string value to filter to. The literal value
+// must be valid for the type of field you are filtering by (string,
+// number, boolean). For string fields, the literal value is interpreted
+// as a regular expression using RE2 syntax. The literal value must
+// match the entire field.
+//
+// For example, to filter for instances that do not have a name of
+// example-instance, you would use filter=name ne example-instance.
+//
+// You can filter on nested fields. For example, you could filter on
+// instances that have set the scheduling.automaticRestart field to
+// true. Use filtering on nested fields to take advantage of labels to
+// organize and search for results based on label values.
+//
+// To filter on multiple expressions, provide each separate expression
+// within parentheses. For example, (scheduling.automaticRestart eq
+// true) (zone eq us-central1-f). Multiple expressions are treated as
+// AND expressions, meaning that resources must match all expressions to
+// pass the filters.
+func (c *HostTypesAggregatedListCall) Filter(filter string) *HostTypesAggregatedListCall {
+	c.urlParams_.Set("filter", filter)
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of results per page that should be returned. If the number of
+// available results is larger than maxResults, Compute Engine returns a
+// nextPageToken that can be used to get the next page of results in
+// subsequent list requests.
+func (c *HostTypesAggregatedListCall) MaxResults(maxResults int64) *HostTypesAggregatedListCall {
+	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
+	return c
+}
+
+// OrderBy sets the optional parameter "orderBy": Sorts list results by
+// a certain order. By default, results are returned in alphanumerical
+// order based on the resource name.
+//
+// You can also sort results in descending order based on the creation
+// timestamp using orderBy="creationTimestamp desc". This sorts results
+// based on the creationTimestamp field in reverse chronological order
+// (newest result first). Use this to sort resources like operations so
+// that the newest operation is returned first.
+//
+// Currently, only sorting by name or creationTimestamp desc is
+// supported.
+func (c *HostTypesAggregatedListCall) OrderBy(orderBy string) *HostTypesAggregatedListCall {
+	c.urlParams_.Set("orderBy", orderBy)
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Specifies a page
+// token to use. Set pageToken to the nextPageToken returned by a
+// previous list request to get the next page of results.
+func (c *HostTypesAggregatedListCall) PageToken(pageToken string) *HostTypesAggregatedListCall {
+	c.urlParams_.Set("pageToken", pageToken)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *HostTypesAggregatedListCall) Fields(s ...googleapi.Field) *HostTypesAggregatedListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *HostTypesAggregatedListCall) IfNoneMatch(entityTag string) *HostTypesAggregatedListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *HostTypesAggregatedListCall) Context(ctx context.Context) *HostTypesAggregatedListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *HostTypesAggregatedListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *HostTypesAggregatedListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/hostTypes")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project": c.project,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.hostTypes.aggregatedList" call.
+// Exactly one of *HostTypeAggregatedList or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *HostTypeAggregatedList.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *HostTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*HostTypeAggregatedList, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &HostTypeAggregatedList{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves an aggregated list of host types.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.hostTypes.aggregatedList",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "500",
+	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "orderBy": {
+	//       "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/aggregated/hostTypes",
+	//   "response": {
+	//     "$ref": "HostTypeAggregatedList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *HostTypesAggregatedListCall) Pages(ctx context.Context, f func(*HostTypeAggregatedList) error) error {
+	c.ctx_ = ctx
+	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.PageToken(x.NextPageToken)
+	}
+}
+
+// method id "compute.hostTypes.get":
+
+type HostTypesGetCall struct {
+	s            *Service
+	project      string
+	zone         string
+	hostType     string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// Get: Returns the specified host type. Get a list of available host
+// types by making a list() request.
+func (r *HostTypesService) Get(project string, zone string, hostType string) *HostTypesGetCall {
+	c := &HostTypesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.zone = zone
+	c.hostType = hostType
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *HostTypesGetCall) Fields(s ...googleapi.Field) *HostTypesGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *HostTypesGetCall) IfNoneMatch(entityTag string) *HostTypesGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *HostTypesGetCall) Context(ctx context.Context) *HostTypesGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *HostTypesGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *HostTypesGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/hostTypes/{hostType}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project":  c.project,
+		"zone":     c.zone,
+		"hostType": c.hostType,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.hostTypes.get" call.
+// Exactly one of *HostType or error will be non-nil. Any non-2xx status
+// code is an error. Response headers are in either
+// *HostType.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *HostTypesGetCall) Do(opts ...googleapi.CallOption) (*HostType, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &HostType{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified host type. Get a list of available host types by making a list() request.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.hostTypes.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "hostType"
+	//   ],
+	//   "parameters": {
+	//     "hostType": {
+	//       "description": "Name of the host type to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "The name of the zone for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/hostTypes/{hostType}",
+	//   "response": {
+	//     "$ref": "HostType"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.hostTypes.list":
+
+type HostTypesListCall struct {
+	s            *Service
+	project      string
+	zone         string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// List: Retrieves a list of host types available to the specified
+// project.
+func (r *HostTypesService) List(project string, zone string) *HostTypesListCall {
+	c := &HostTypesListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.zone = zone
+	return c
+}
+
+// Filter sets the optional parameter "filter": Sets a filter expression
+// for filtering listed resources, in the form filter={expression}. Your
+// {expression} must be in the format: field_name comparison_string
+// literal_string.
+//
+// The field_name is the name of the field you want to compare. Only
+// atomic field types are supported (string, number, boolean). The
+// comparison_string must be either eq (equals) or ne (not equals). The
+// literal_string is the string value to filter to. The literal value
+// must be valid for the type of field you are filtering by (string,
+// number, boolean). For string fields, the literal value is interpreted
+// as a regular expression using RE2 syntax. The literal value must
+// match the entire field.
+//
+// For example, to filter for instances that do not have a name of
+// example-instance, you would use filter=name ne example-instance.
+//
+// You can filter on nested fields. For example, you could filter on
+// instances that have set the scheduling.automaticRestart field to
+// true. Use filtering on nested fields to take advantage of labels to
+// organize and search for results based on label values.
+//
+// To filter on multiple expressions, provide each separate expression
+// within parentheses. For example, (scheduling.automaticRestart eq
+// true) (zone eq us-central1-f). Multiple expressions are treated as
+// AND expressions, meaning that resources must match all expressions to
+// pass the filters.
+func (c *HostTypesListCall) Filter(filter string) *HostTypesListCall {
+	c.urlParams_.Set("filter", filter)
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of results per page that should be returned. If the number of
+// available results is larger than maxResults, Compute Engine returns a
+// nextPageToken that can be used to get the next page of results in
+// subsequent list requests.
+func (c *HostTypesListCall) MaxResults(maxResults int64) *HostTypesListCall {
+	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
+	return c
+}
+
+// OrderBy sets the optional parameter "orderBy": Sorts list results by
+// a certain order. By default, results are returned in alphanumerical
+// order based on the resource name.
+//
+// You can also sort results in descending order based on the creation
+// timestamp using orderBy="creationTimestamp desc". This sorts results
+// based on the creationTimestamp field in reverse chronological order
+// (newest result first). Use this to sort resources like operations so
+// that the newest operation is returned first.
+//
+// Currently, only sorting by name or creationTimestamp desc is
+// supported.
+func (c *HostTypesListCall) OrderBy(orderBy string) *HostTypesListCall {
+	c.urlParams_.Set("orderBy", orderBy)
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Specifies a page
+// token to use. Set pageToken to the nextPageToken returned by a
+// previous list request to get the next page of results.
+func (c *HostTypesListCall) PageToken(pageToken string) *HostTypesListCall {
+	c.urlParams_.Set("pageToken", pageToken)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *HostTypesListCall) Fields(s ...googleapi.Field) *HostTypesListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *HostTypesListCall) IfNoneMatch(entityTag string) *HostTypesListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *HostTypesListCall) Context(ctx context.Context) *HostTypesListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *HostTypesListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *HostTypesListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/hostTypes")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project": c.project,
+		"zone":    c.zone,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.hostTypes.list" call.
+// Exactly one of *HostTypeList or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *HostTypeList.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *HostTypesListCall) Do(opts ...googleapi.CallOption) (*HostTypeList, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &HostTypeList{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves a list of host types available to the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.hostTypes.list",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "500",
+	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "orderBy": {
+	//       "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "The name of the zone for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/hostTypes",
+	//   "response": {
+	//     "$ref": "HostTypeList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *HostTypesListCall) Pages(ctx context.Context, f func(*HostTypeList) error) error {
+	c.ctx_ = ctx
+	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.PageToken(x.NextPageToken)
+	}
+}
+
 // method id "compute.hosts.aggregatedList":
 
 type HostsAggregatedListCall struct {
@@ -32140,6 +34925,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32210,7 +34996,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -32318,6 +35103,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/hosts/{host}")
@@ -32477,6 +35263,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32640,6 +35427,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32792,6 +35580,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.host)
 	if err != nil {
@@ -33014,6 +35803,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33086,7 +35876,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -33204,6 +35993,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
 	if err != nil {
@@ -33363,6 +36153,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -33518,6 +36309,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}")
@@ -33667,6 +36459,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33809,6 +36602,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck)
 	if err != nil {
@@ -34022,6 +36816,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34092,7 +36887,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -34203,6 +36997,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck)
 	if err != nil {
@@ -34268,7 +37063,7 @@
 	//   ],
 	//   "parameters": {
 	//     "httpHealthCheck": {
-	//       "description": "Name of the HttpHealthCheck resource to update.",
+	//       "description": "Name of the HttpHealthCheck resource to patch.",
 	//       "location": "path",
 	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 	//       "required": true,
@@ -34291,7 +37086,8 @@
 	//   },
 	//   "scopes": [
 	//     "https://www.googleapis.com/auth/cloud-platform",
-	//     "https://www.googleapis.com/auth/compute"
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
 	//   ]
 	// }
 
@@ -34350,6 +37146,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -34499,6 +37296,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck)
 	if err != nil {
@@ -34643,6 +37441,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks/{httpsHealthCheck}")
@@ -34791,6 +37590,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34932,6 +37732,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck)
 	if err != nil {
@@ -35144,6 +37945,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35214,7 +38016,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -35324,6 +38125,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck)
 	if err != nil {
@@ -35471,6 +38273,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -35619,6 +38422,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck)
 	if err != nil {
@@ -35764,6 +38568,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{image}")
@@ -35906,6 +38711,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.deprecationstatus)
 	if err != nil {
@@ -36063,6 +38869,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36215,6 +39022,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36326,6 +39134,13 @@
 	return c
 }
 
+// ForceCreation sets the optional parameter "forceCreation": Force
+// image creation if true.
+func (c *ImagesInsertCall) ForceCreation(forceCreation bool) *ImagesInsertCall {
+	c.urlParams_.Set("forceCreation", fmt.Sprint(forceCreation))
+	return c
+}
+
 // Fields allows partial responses to be retrieved. See
 // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
 // for more information.
@@ -36357,6 +39172,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.image)
 	if err != nil {
@@ -36419,6 +39235,11 @@
 	//     "project"
 	//   ],
 	//   "parameters": {
+	//     "forceCreation": {
+	//       "description": "Force image creation if true.",
+	//       "location": "query",
+	//       "type": "boolean"
+	//     },
 	//     "project": {
 	//       "description": "Project ID for this request.",
 	//       "location": "path",
@@ -36578,6 +39399,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36648,7 +39470,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -36757,6 +39578,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetlabelsrequest)
 	if err != nil {
@@ -36904,6 +39726,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -37061,6 +39884,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersabandoninstancesrequest)
 	if err != nil {
@@ -37289,6 +40113,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -37360,7 +40185,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -37471,6 +40295,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}")
@@ -37625,6 +40450,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersdeleteinstancesrequest)
 	if err != nil {
@@ -37791,6 +40617,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -37946,6 +40773,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -38168,6 +40996,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -38240,7 +41069,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -38383,6 +41211,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances")
@@ -38460,7 +41289,6 @@
 	//       "default": "500",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -38499,6 +41327,27 @@
 
 }
 
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *InstanceGroupManagersListManagedInstancesCall) Pages(ctx context.Context, f func(*InstanceGroupManagersListManagedInstancesResponse) error) error {
+	c.ctx_ = ctx
+	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.PageToken(x.NextPageToken)
+	}
+}
+
 // method id "compute.instanceGroupManagers.patch":
 
 type InstanceGroupManagersPatchCall struct {
@@ -38513,11 +41362,12 @@
 }
 
 // Patch: Updates a managed instance group using the information that
-// you specify in the request. This operation is marked as DONE when the
-// group is updated even if the instances in the group have not yet been
-// updated. You must separately verify the status of the individual
-// instances with the listmanagedinstances method. This method supports
-// patch semantics.
+// you specify in the request. The field statefulPolicy is updated using
+// PATCH semantics. This operation is marked as DONE when the group is
+// updated even if the instances in the group have not yet been updated.
+// You must separately verify the status of the individual instances
+// with the listmanagedinstances method. This method supports patch
+// semantics.
 func (r *InstanceGroupManagersService) Patch(project string, zone string, instanceGroupManager string, instancegroupmanager *InstanceGroupManager) *InstanceGroupManagersPatchCall {
 	c := &InstanceGroupManagersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.project = project
@@ -38558,6 +41408,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -38615,7 +41466,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports patch semantics.",
+	//   "description": "Updates a managed instance group using the information that you specify in the request. The field statefulPolicy is updated using PATCH semantics. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports patch semantics.",
 	//   "httpMethod": "PATCH",
 	//   "id": "compute.instanceGroupManagers.patch",
 	//   "parameterOrder": [
@@ -38719,6 +41570,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersrecreateinstancesrequest)
 	if err != nil {
@@ -38879,6 +41731,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize")
@@ -39044,6 +41897,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersresizeadvancedrequest)
 	if err != nil {
@@ -39199,6 +42053,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssetautohealingrequest)
 	if err != nil {
@@ -39356,6 +42211,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssetinstancetemplaterequest)
 	if err != nil {
@@ -39517,6 +42373,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssettargetpoolsrequest)
 	if err != nil {
@@ -39673,6 +42530,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -39791,10 +42649,11 @@
 }
 
 // Update: Updates a managed instance group using the information that
-// you specify in the request. This operation is marked as DONE when the
-// group is updated even if the instances in the group have not yet been
-// updated. You must separately verify the status of the individual
-// instances with the listmanagedinstances method.
+// you specify in the request. The field statefulPolicy is updated using
+// PATCH semantics. This operation is marked as DONE when the group is
+// updated even if the instances in the group have not yet been updated.
+// You must separately verify the status of the individual instances
+// with the listmanagedinstances method.
 func (r *InstanceGroupManagersService) Update(project string, zone string, instanceGroupManager string, instancegroupmanager *InstanceGroupManager) *InstanceGroupManagersUpdateCall {
 	c := &InstanceGroupManagersUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.project = project
@@ -39835,6 +42694,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -39892,7 +42752,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method.",
+	//   "description": "Updates a managed instance group using the information that you specify in the request. The field statefulPolicy is updated using PATCH semantics. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method.",
 	//   "httpMethod": "PUT",
 	//   "id": "compute.instanceGroupManagers.update",
 	//   "parameterOrder": [
@@ -39992,6 +42852,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupsaddinstancesrequest)
 	if err != nil {
@@ -40220,6 +43081,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40290,7 +43152,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -40401,6 +43262,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}")
@@ -40558,6 +43420,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40708,6 +43571,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroup)
 	if err != nil {
@@ -40930,6 +43794,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41002,7 +43867,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -41185,6 +44049,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupslistinstancesrequest)
 	if err != nil {
@@ -41267,7 +44132,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -41387,6 +44251,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupsremoveinstancesrequest)
 	if err != nil {
@@ -41542,6 +44407,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupssetnamedportsrequest)
 	if err != nil {
@@ -41698,6 +44564,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -41857,6 +44724,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates/{instanceTemplate}")
@@ -42006,6 +44874,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42151,6 +45020,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancetemplate)
 	if err != nil {
@@ -42364,6 +45234,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42434,7 +45305,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -42543,6 +45413,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -42695,6 +45566,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accessconfig)
 	if err != nil {
@@ -42932,6 +45804,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43002,7 +45875,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -43121,6 +45993,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.attacheddisk)
 	if err != nil {
@@ -43283,6 +46156,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}")
@@ -43434,6 +46308,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/deleteAccessConfig")
@@ -43597,6 +46472,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/detachDisk")
@@ -43764,6 +46640,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43927,6 +46804,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44106,6 +46984,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44274,6 +47153,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instance)
 	if err != nil {
@@ -44498,6 +47378,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44570,7 +47451,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -44686,6 +47566,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/reset")
@@ -44837,6 +47718,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete")
@@ -45002,6 +47884,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
 	if err != nil {
@@ -45161,6 +48044,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetlabelsrequest)
 	if err != nil {
@@ -45264,6 +48148,165 @@
 
 }
 
+// method id "compute.instances.setMachineResources":
+
+type InstancesSetMachineResourcesCall struct {
+	s                                   *Service
+	project                             string
+	zone                                string
+	instance                            string
+	instancessetmachineresourcesrequest *InstancesSetMachineResourcesRequest
+	urlParams_                          gensupport.URLParams
+	ctx_                                context.Context
+	header_                             http.Header
+}
+
+// SetMachineResources: Changes the number and/or type of accelerator
+// for a stopped instance to the values specified in the request.
+func (r *InstancesService) SetMachineResources(project string, zone string, instance string, instancessetmachineresourcesrequest *InstancesSetMachineResourcesRequest) *InstancesSetMachineResourcesCall {
+	c := &InstancesSetMachineResourcesCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.zone = zone
+	c.instance = instance
+	c.instancessetmachineresourcesrequest = instancessetmachineresourcesrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InstancesSetMachineResourcesCall) Fields(s ...googleapi.Field) *InstancesSetMachineResourcesCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *InstancesSetMachineResourcesCall) Context(ctx context.Context) *InstancesSetMachineResourcesCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *InstancesSetMachineResourcesCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *InstancesSetMachineResourcesCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetmachineresourcesrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setMachineResources")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project":  c.project,
+		"zone":     c.zone,
+		"instance": c.instance,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.instances.setMachineResources" call.
+// Exactly one of *Operation or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *Operation.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *InstancesSetMachineResourcesCall) Do(opts ...googleapi.CallOption) (*Operation, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Operation{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Changes the number and/or type of accelerator for a stopped instance to the values specified in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.instances.setMachineResources",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Name of the instance scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "The name of the zone for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances/{instance}/setMachineResources",
+	//   "request": {
+	//     "$ref": "InstancesSetMachineResourcesRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
 // method id "compute.instances.setMachineType":
 
 type InstancesSetMachineTypeCall struct {
@@ -45319,6 +48362,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetmachinetyperequest)
 	if err != nil {
@@ -45478,6 +48522,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata)
 	if err != nil {
@@ -45636,6 +48681,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.scheduling)
 	if err != nil {
@@ -45793,6 +48839,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetserviceaccountrequest)
 	if err != nil {
@@ -45952,6 +48999,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.tags)
 	if err != nil {
@@ -46110,6 +49158,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/start")
@@ -46261,6 +49310,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesstartwithencryptionkeyrequest)
 	if err != nil {
@@ -46431,6 +49481,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/stop")
@@ -46596,6 +49647,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/suspend")
@@ -46751,6 +49803,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -46911,6 +49964,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accessconfig)
 	if err != nil {
@@ -47084,6 +50138,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47301,6 +50356,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47371,7 +50427,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -47492,6 +50547,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47721,6 +50777,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47793,7 +50850,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -47908,6 +50964,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.networksaddpeeringrequest)
 	if err != nil {
@@ -48053,6 +51110,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}")
@@ -48202,6 +51260,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -48344,6 +51403,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.network)
 	if err != nil {
@@ -48557,6 +51617,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -48627,7 +51688,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -48735,6 +51795,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.networksremovepeeringrequest)
 	if err != nil {
@@ -48880,6 +51941,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}/switchToCustomMode")
@@ -49019,6 +52081,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -49162,6 +52225,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/disableXpnHost")
@@ -49290,6 +52354,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.projectsdisablexpnresourcerequest)
 	if err != nil {
@@ -49423,6 +52488,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/enableXpnHost")
@@ -49553,6 +52619,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.projectsenablexpnresourcerequest)
 	if err != nil {
@@ -49698,6 +52765,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -49839,6 +52907,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -50003,6 +53072,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -50071,7 +53141,6 @@
 	//       "default": "500",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -50145,6 +53214,30 @@
 	return c
 }
 
+// Filter sets the optional parameter "filter":
+func (c *ProjectsListXpnHostsCall) Filter(filter string) *ProjectsListXpnHostsCall {
+	c.urlParams_.Set("filter", filter)
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults":
+func (c *ProjectsListXpnHostsCall) MaxResults(maxResults int64) *ProjectsListXpnHostsCall {
+	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
+	return c
+}
+
+// OrderBy sets the optional parameter "order_by":
+func (c *ProjectsListXpnHostsCall) OrderBy(orderBy string) *ProjectsListXpnHostsCall {
+	c.urlParams_.Set("order_by", orderBy)
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken":
+func (c *ProjectsListXpnHostsCall) PageToken(pageToken string) *ProjectsListXpnHostsCall {
+	c.urlParams_.Set("pageToken", pageToken)
+	return c
+}
+
 // Fields allows partial responses to be retrieved. See
 // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
 // for more information.
@@ -50176,6 +53269,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.projectslistxpnhostsrequest)
 	if err != nil {
@@ -50238,6 +53332,25 @@
 	//     "project"
 	//   ],
 	//   "parameters": {
+	//     "filter": {
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "500",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "order_by": {
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "location": "query",
+	//       "type": "string"
+	//     },
 	//     "project": {
 	//       "description": "Project ID for this request.",
 	//       "location": "path",
@@ -50262,6 +53375,27 @@
 
 }
 
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *ProjectsListXpnHostsCall) Pages(ctx context.Context, f func(*XpnHostList) error) error {
+	c.ctx_ = ctx
+	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.PageToken(x.NextPageToken)
+	}
+}
+
 // method id "compute.projects.moveDisk":
 
 type ProjectsMoveDiskCall struct {
@@ -50312,6 +53446,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.diskmoverequest)
 	if err != nil {
@@ -50448,6 +53583,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancemoverequest)
 	if err != nil {
@@ -50585,6 +53721,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata)
 	if err != nil {
@@ -50722,6 +53859,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.projectssetdefaultserviceaccountrequest)
 	if err != nil {
@@ -50861,6 +53999,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.usageexportlocation)
 	if err != nil {
@@ -51001,6 +54140,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers/{autoscaler}")
@@ -51159,6 +54299,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -51311,6 +54452,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler)
 	if err != nil {
@@ -51534,6 +54676,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -51606,7 +54749,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -51723,6 +54865,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler2)
 	if err != nil {
@@ -51880,6 +55023,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -52044,6 +55188,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler)
 	if err != nil {
@@ -52196,6 +55341,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}")
@@ -52354,6 +55500,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -52508,6 +55655,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourcegroupreference)
 	if err != nil {
@@ -52667,6 +55815,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -52890,6 +56039,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -52962,7 +56112,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -53083,6 +56232,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -53241,6 +56391,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -53402,6 +56553,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -53569,6 +56721,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -53797,6 +56950,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -53869,7 +57023,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -53992,6 +57145,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.snapshot)
 	if err != nil {
@@ -54154,6 +57308,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/disks/{disk}")
@@ -54311,6 +57466,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -54470,6 +57626,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.disk)
 	if err != nil {
@@ -54698,6 +57855,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -54770,7 +57928,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -54887,6 +58044,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regiondisksresizerequest)
 	if err != nil {
@@ -55044,6 +58202,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regionsetlabelsrequest)
 	if err != nil {
@@ -55202,6 +58361,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -55368,6 +58528,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersabandoninstancesrequest)
 	if err != nil {
@@ -55522,6 +58683,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}")
@@ -55676,6 +58838,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersdeleteinstancesrequest)
 	if err != nil {
@@ -55841,6 +59004,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -55996,6 +59160,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -56218,6 +59383,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -56290,7 +59456,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -56431,6 +59596,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances")
@@ -56508,7 +59674,6 @@
 	//       "default": "500",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -56547,6 +59712,27 @@
 
 }
 
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *RegionInstanceGroupManagersListManagedInstancesCall) Pages(ctx context.Context, f func(*RegionInstanceGroupManagersListInstancesResponse) error) error {
+	c.ctx_ = ctx
+	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.PageToken(x.NextPageToken)
+	}
+}
+
 // method id "compute.regionInstanceGroupManagers.patch":
 
 type RegionInstanceGroupManagersPatchCall struct {
@@ -56606,6 +59792,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -56767,6 +59954,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersrecreaterequest)
 	if err != nil {
@@ -56928,6 +60116,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize")
@@ -57085,6 +60274,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerssetautohealingrequest)
 	if err != nil {
@@ -57242,6 +60432,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerssettemplaterequest)
 	if err != nil {
@@ -57399,6 +60590,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerssettargetpoolsrequest)
 	if err != nil {
@@ -57555,6 +60747,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -57717,6 +60910,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -57881,6 +61075,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -58107,6 +61302,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -58179,7 +61375,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -58365,6 +61560,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupslistinstancesrequest)
 	if err != nil {
@@ -58448,7 +61644,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -58568,6 +61763,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupssetnamedportsrequest)
 	if err != nil {
@@ -58724,6 +61920,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -58881,6 +62078,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/operations/{operation}")
@@ -59012,6 +62210,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -59241,6 +62440,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -59313,7 +62513,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -59439,6 +62638,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -59657,6 +62857,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -59727,7 +62928,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -59909,6 +63109,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -59979,7 +63180,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -60087,6 +63287,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}")
@@ -60246,6 +63447,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -60409,6 +63611,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -60561,6 +63764,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.router)
 	if err != nil {
@@ -60784,6 +63988,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -60856,7 +64061,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -60974,6 +64178,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2)
 	if err != nil {
@@ -61133,6 +64338,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2)
 	if err != nil {
@@ -61292,6 +64498,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -61451,6 +64658,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2)
 	if err != nil {
@@ -61605,6 +64813,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes/{route}")
@@ -61754,6 +64963,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -61896,6 +65106,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.route)
 	if err != nil {
@@ -62109,6 +65320,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -62179,7 +65391,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -62288,6 +65499,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -62440,6 +65652,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots/{snapshot}")
@@ -62589,6 +65802,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -62807,6 +66021,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -62877,7 +66092,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -62986,6 +66200,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetlabelsrequest)
 	if err != nil {
@@ -63133,6 +66348,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -63278,6 +66494,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/sslCertificates/{sslCertificate}")
@@ -63426,6 +66643,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -63567,6 +66785,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.sslcertificate)
 	if err != nil {
@@ -63779,6 +66998,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -63849,7 +67069,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -63958,6 +67177,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -64179,6 +67399,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -64249,7 +67470,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -64357,6 +67577,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks/{subnetwork}")
@@ -64507,6 +67728,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetworksexpandipcidrrangerequest)
 	if err != nil {
@@ -64674,6 +67896,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -64837,6 +68060,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -64989,6 +68213,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetwork)
 	if err != nil {
@@ -65212,6 +68437,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -65284,7 +68510,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -65402,6 +68627,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
 	if err != nil {
@@ -65562,6 +68788,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetworkssetprivateipgoogleaccessrequest)
 	if err != nil {
@@ -65720,6 +68947,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -65875,6 +69103,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies/{targetHttpProxy}")
@@ -66024,6 +69253,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -66166,6 +69396,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpproxy)
 	if err != nil {
@@ -66379,6 +69610,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -66449,7 +69681,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -66558,6 +69789,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapreference)
 	if err != nil {
@@ -66705,6 +69937,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -66850,6 +70083,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpsProxies/{targetHttpsProxy}")
@@ -66998,6 +70232,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -67139,6 +70374,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpsproxy)
 	if err != nil {
@@ -67351,6 +70587,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -67421,7 +70658,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -67529,6 +70765,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpsproxiessetsslcertificatesrequest)
 	if err != nil {
@@ -67675,6 +70912,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapreference)
 	if err != nil {
@@ -67822,6 +71060,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -68044,6 +71283,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -68114,7 +71354,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -68223,6 +71462,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances/{targetInstance}")
@@ -68383,6 +71623,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -68536,6 +71777,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetinstance)
 	if err != nil {
@@ -68760,6 +72002,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -68832,7 +72075,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -68950,6 +72192,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -69109,6 +72352,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsaddhealthcheckrequest)
 	if err != nil {
@@ -69267,6 +72511,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsaddinstancerequest)
 	if err != nil {
@@ -69497,6 +72742,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -69567,7 +72813,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -69676,6 +72921,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}")
@@ -69836,6 +73082,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -69991,6 +73238,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancereference)
 	if err != nil {
@@ -70149,6 +73397,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpool)
 	if err != nil {
@@ -70373,6 +73622,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -70445,7 +73695,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -70563,6 +73812,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremovehealthcheckrequest)
 	if err != nil {
@@ -70721,6 +73971,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremoveinstancerequest)
 	if err != nil {
@@ -70886,6 +74137,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
 	if err != nil {
@@ -71050,6 +74302,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -71204,6 +74457,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}")
@@ -71352,6 +74606,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -71493,6 +74748,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxy)
 	if err != nil {
@@ -71705,6 +74961,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -71775,7 +75032,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -71883,6 +75139,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetbackendservicerequest)
 	if err != nil {
@@ -72029,6 +75286,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetproxyheaderrequest)
 	if err != nil {
@@ -72175,6 +75433,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetsslcertificatesrequest)
 	if err != nil {
@@ -72322,6 +75581,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -72467,6 +75727,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetTcpProxies/{targetTcpProxy}")
@@ -72615,6 +75876,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -72756,6 +76018,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targettcpproxy)
 	if err != nil {
@@ -72968,6 +76231,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -73038,7 +76302,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -73146,6 +76409,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targettcpproxiessetbackendservicerequest)
 	if err != nil {
@@ -73292,6 +76556,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targettcpproxiessetproxyheaderrequest)
 	if err != nil {
@@ -73439,6 +76704,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -73660,6 +76926,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -73730,7 +76997,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -73838,6 +77104,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}")
@@ -73997,6 +77264,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -74149,6 +77417,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetvpngateway)
 	if err != nil {
@@ -74372,6 +77641,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -74444,7 +77714,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -74562,6 +77831,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -74717,6 +77987,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/urlMaps/{urlMap}")
@@ -74866,6 +78137,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -75008,6 +78280,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmap)
 	if err != nil {
@@ -75146,6 +78419,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cacheinvalidationrule)
 	if err != nil {
@@ -75368,6 +78642,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -75438,7 +78713,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -75548,6 +78822,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmap)
 	if err != nil {
@@ -75695,6 +78970,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -75844,6 +79120,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmap)
 	if err != nil {
@@ -75993,6 +79270,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapsvalidaterequest)
 	if err != nil {
@@ -76213,6 +79491,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -76283,7 +79562,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -76391,6 +79669,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/vpnTunnels/{vpnTunnel}")
@@ -76550,6 +79829,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -76702,6 +79982,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.vpntunnel)
 	if err != nil {
@@ -76925,6 +80206,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -76997,7 +80279,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -77060,6 +80341,165 @@
 	}
 }
 
+// method id "compute.vpnTunnels.setLabels":
+
+type VpnTunnelsSetLabelsCall struct {
+	s                      *Service
+	project                string
+	region                 string
+	resource               string
+	regionsetlabelsrequest *RegionSetLabelsRequest
+	urlParams_             gensupport.URLParams
+	ctx_                   context.Context
+	header_                http.Header
+}
+
+// SetLabels: Sets the labels on a VpnTunnel. To learn more about
+// labels, read the Labeling or Tagging Resources documentation.
+func (r *VpnTunnelsService) SetLabels(project string, region string, resource string, regionsetlabelsrequest *RegionSetLabelsRequest) *VpnTunnelsSetLabelsCall {
+	c := &VpnTunnelsSetLabelsCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.region = region
+	c.resource = resource
+	c.regionsetlabelsrequest = regionsetlabelsrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *VpnTunnelsSetLabelsCall) Fields(s ...googleapi.Field) *VpnTunnelsSetLabelsCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *VpnTunnelsSetLabelsCall) Context(ctx context.Context) *VpnTunnelsSetLabelsCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *VpnTunnelsSetLabelsCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *VpnTunnelsSetLabelsCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regionsetlabelsrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/vpnTunnels/{resource}/setLabels")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project":  c.project,
+		"region":   c.region,
+		"resource": c.resource,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.vpnTunnels.setLabels" call.
+// Exactly one of *Operation or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *Operation.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *VpnTunnelsSetLabelsCall) Do(opts ...googleapi.CallOption) (*Operation, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Operation{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Sets the labels on a VpnTunnel. To learn more about labels, read the Labeling or Tagging Resources documentation.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.vpnTunnels.setLabels",
+	//   "parameterOrder": [
+	//     "project",
+	//     "region",
+	//     "resource"
+	//   ],
+	//   "parameters": {
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "The region for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "resource": {
+	//       "description": "Name of the resource for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/regions/{region}/vpnTunnels/{resource}/setLabels",
+	//   "request": {
+	//     "$ref": "RegionSetLabelsRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
 // method id "compute.vpnTunnels.testIamPermissions":
 
 type VpnTunnelsTestIamPermissionsCall struct {
@@ -77115,6 +80555,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -77272,6 +80713,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/operations/{operation}")
@@ -77403,6 +80845,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -77632,6 +81075,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -77704,7 +81148,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -77830,6 +81273,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -78048,6 +81492,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -78118,7 +81563,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
diff --git a/compute/v0.beta/compute-api.json b/compute/v0.beta/compute-api.json
index a4b5c44..24f18e2 100644
--- a/compute/v0.beta/compute-api.json
+++ b/compute/v0.beta/compute-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/Nor0GoruLdltwJ56Dlyj7MfnWrg\"",
+ "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/ZWzxFNONK91xZCTJWdl-jDEEjJE\"",
  "discoveryVersion": "v1",
  "id": "compute:beta",
  "name": "compute",
  "version": "beta",
- "revision": "20170118",
+ "revision": "20170124",
  "title": "Compute Engine API",
  "description": "Creates and runs virtual machines on Google Cloud Platform.",
  "ownerDomain": "google.com",
@@ -91,6 +91,213 @@
   }
  },
  "schemas": {
+  "AcceleratorConfig": {
+   "id": "AcceleratorConfig",
+   "type": "object",
+   "description": "A specification of the type and number of accelerator cards attached to the instance.",
+   "properties": {
+    "acceleratorCount": {
+     "type": "integer",
+     "description": "The number of the guest accelerator cards exposed to this instance.",
+     "format": "int32"
+    },
+    "acceleratorType": {
+     "type": "string",
+     "description": "Full or partial URL of the accelerator type resource to expose to this instance."
+    }
+   }
+  },
+  "AcceleratorType": {
+   "id": "AcceleratorType",
+   "type": "object",
+   "description": "An Accelerator Type resource.",
+   "properties": {
+    "creationTimestamp": {
+     "type": "string",
+     "description": "[Output Only] Creation timestamp in RFC3339 text format."
+    },
+    "deprecated": {
+     "$ref": "DeprecationStatus",
+     "description": "[Output Only] The deprecation status associated with this accelerator type."
+    },
+    "description": {
+     "type": "string",
+     "description": "[Output Only] An optional textual description of the resource."
+    },
+    "id": {
+     "type": "string",
+     "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.",
+     "format": "uint64"
+    },
+    "kind": {
+     "type": "string",
+     "description": "[Output Only] The type of the resource. Always compute#acceleratorType for accelerator types.",
+     "default": "compute#acceleratorType"
+    },
+    "maximumCardsPerInstance": {
+     "type": "integer",
+     "description": "[Output Only] Maximum accelerator cards allowed per instance.",
+     "format": "int32"
+    },
+    "name": {
+     "type": "string",
+     "description": "[Output Only] Name of the resource.",
+     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?"
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "[Output Only] Server-defined fully-qualified URL for this resource."
+    },
+    "zone": {
+     "type": "string",
+     "description": "[Output Only] The name of the zone where the accelerator type resides, such as us-central1-a."
+    }
+   }
+  },
+  "AcceleratorTypeAggregatedList": {
+   "id": "AcceleratorTypeAggregatedList",
+   "type": "object",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server."
+    },
+    "items": {
+     "type": "object",
+     "description": "[Output Only] A map of scoped accelerator type lists.",
+     "additionalProperties": {
+      "$ref": "AcceleratorTypesScopedList",
+      "description": "[Output Only] Name of the scope containing this set of accelerator types."
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "[Output Only] Type of resource. Always compute#acceleratorTypeAggregatedList for aggregated lists of accelerator types.",
+     "default": "compute#acceleratorTypeAggregatedList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "[Output Only] Server-defined URL for this resource."
+    }
+   }
+  },
+  "AcceleratorTypeList": {
+   "id": "AcceleratorTypeList",
+   "type": "object",
+   "description": "Contains a list of accelerator types.",
+   "properties": {
+    "id": {
+     "type": "string",
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
+    },
+    "items": {
+     "type": "array",
+     "description": "A list of AcceleratorType resources.",
+     "items": {
+      "$ref": "AcceleratorType"
+     }
+    },
+    "kind": {
+     "type": "string",
+     "description": "[Output Only] Type of resource. Always compute#acceleratorTypeList for lists of accelerator types.",
+     "default": "compute#acceleratorTypeList"
+    },
+    "nextPageToken": {
+     "type": "string",
+     "description": "[Output Only] A token used to continue a truncated list request."
+    },
+    "selfLink": {
+     "type": "string",
+     "description": "[Output Only] Server-defined URL for this resource."
+    }
+   }
+  },
+  "AcceleratorTypesScopedList": {
+   "id": "AcceleratorTypesScopedList",
+   "type": "object",
+   "properties": {
+    "acceleratorTypes": {
+     "type": "array",
+     "description": "[Output Only] List of accelerator types contained in this scope.",
+     "items": {
+      "$ref": "AcceleratorType"
+     }
+    },
+    "warning": {
+     "type": "object",
+     "description": "[Output Only] An informational warning that appears when the accelerator types list is empty.",
+     "properties": {
+      "code": {
+       "type": "string",
+       "description": "[Output Only] A warning code, if applicable. For example, Compute Engine returns NO_RESULTS_ON_PAGE if there are no results in the response.",
+       "enum": [
+        "CLEANUP_FAILED",
+        "DEPRECATED_RESOURCE_USED",
+        "DISK_SIZE_LARGER_THAN_IMAGE_SIZE",
+        "FIELD_VALUE_OVERRIDEN",
+        "INJECTED_KERNELS_DEPRECATED",
+        "NEXT_HOP_ADDRESS_NOT_ASSIGNED",
+        "NEXT_HOP_CANNOT_IP_FORWARD",
+        "NEXT_HOP_INSTANCE_NOT_FOUND",
+        "NEXT_HOP_INSTANCE_NOT_ON_NETWORK",
+        "NEXT_HOP_NOT_RUNNING",
+        "NOT_CRITICAL_ERROR",
+        "NO_RESULTS_ON_PAGE",
+        "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
+        "RESOURCE_NOT_DELETED",
+        "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
+        "UNREACHABLE"
+       ],
+       "enumDescriptions": [
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        "",
+        ""
+       ]
+      },
+      "data": {
+       "type": "array",
+       "description": "[Output Only] Metadata about this warning in key: value format. For example:\n\"data\": [ { \"key\": \"scope\", \"value\": \"zones/us-east1-d\" }",
+       "items": {
+        "type": "object",
+        "properties": {
+         "key": {
+          "type": "string",
+          "description": "[Output Only] A key that provides more detail on the warning being returned. For example, for warnings where there are no results in a list request for a particular zone, this key might be scope and the key value might be the zone name. Other examples might be a key indicating a deprecated resource and a suggested replacement, or a warning about invalid network settings (for example, if an instance attempts to perform IP forwarding but is not enabled for IP forwarding)."
+         },
+         "value": {
+          "type": "string",
+          "description": "[Output Only] A warning data value corresponding to the key."
+         }
+        }
+       }
+      },
+      "message": {
+       "type": "string",
+       "description": "[Output Only] A human-readable description of the warning code."
+      }
+     }
+    }
+   }
+  },
   "AccessConfig": {
    "id": "AccessConfig",
    "type": "object",
@@ -282,6 +489,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -302,6 +510,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -462,18 +671,18 @@
   "AuditConfig": {
    "id": "AuditConfig",
    "type": "object",
-   "description": "Provides the configuration for non-admin_activity logging for a service. Controls exemptions and specific log sub-types.",
+   "description": "Specifies the audit configuration for a service. It consists of which permission types are logged, and what identities, if any, are exempted from logging. An AuditConifg must have one or more AuditLogConfigs.",
    "properties": {
     "auditLogConfigs": {
      "type": "array",
-     "description": "The configuration for each type of logging",
+     "description": "The configuration for logging of each type of permission.",
      "items": {
       "$ref": "AuditLogConfig"
      }
     },
     "exemptedMembers": {
      "type": "array",
-     "description": "Specifies the identities that are exempted from \"data access\" audit logging for the `service` specified above. Follows the same format of Binding.members.",
+     "description": "Specifies the identities that are exempted from \"data access\" audit logging for the `service` specified above. Follows the same format of Binding.members. This field is deprecated in favor of per-permission-type exemptions.",
      "items": {
       "type": "string"
      }
@@ -487,11 +696,11 @@
   "AuditLogConfig": {
    "id": "AuditLogConfig",
    "type": "object",
-   "description": "Provides the configuration for a sub-type of logging.",
+   "description": "Provides the configuration for logging a type of permissions. Example:\n\n{ \"audit_log_configs\": [ { \"log_type\": \"DATA_READ\", \"exempted_members\": [ \"user:foo@gmail.com\" ] }, { \"log_type\": \"DATA_WRITE\", } ] }\n\nThis enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting foo@gmail.com from DATA_READ logging.",
    "properties": {
     "exemptedMembers": {
      "type": "array",
-     "description": "Specifies the identities that are exempted from this type of logging Follows the same format of Binding.members.",
+     "description": "Specifies the identities that do not cause logging for this type of permission. Follows the same format of [Binding.members][].",
      "items": {
       "type": "string"
      }
@@ -730,6 +939,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -750,6 +960,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -1282,6 +1493,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -1302,6 +1514,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -1736,11 +1949,11 @@
    "properties": {
     "id": {
      "type": "string",
-     "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "array",
-     "description": "[Output Only] A list of persistent disks.",
+     "description": "A list of Disk resources.",
      "items": {
       "$ref": "Disk"
      }
@@ -1752,7 +1965,7 @@
     },
     "nextPageToken": {
      "type": "string",
-     "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
@@ -1919,6 +2132,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -1939,6 +2153,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -2010,6 +2225,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -2030,6 +2246,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -2181,11 +2398,11 @@
    "properties": {
     "IPAddress": {
      "type": "string",
-     "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP; for regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IP from the same scope (global or regional) will be assigned.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule. Only IPv4 is supported."
+     "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP. For regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IP from the same scope (global or regional) will be assigned.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule. Only IPv4 is supported."
     },
     "IPProtocol": {
      "type": "string",
-     "description": "The IP protocol to which this rule applies. Valid options are TCP, UDP, ESP, AH, SCTP or ICMP.\n\nWhen the load balancing scheme is INTERNAL\u003c/code, only TCP and UDP are valid.",
+     "description": "The IP protocol to which this rule applies. Valid options are TCP, UDP, ESP, AH, SCTP or ICMP.\n\nWhen the load balancing scheme is INTERNAL, only TCP and UDP are valid.",
      "enum": [
       "AH",
       "ESP",
@@ -2227,7 +2444,7 @@
     },
     "loadBalancingScheme": {
      "type": "string",
-     "description": "This signifies what the ForwardingRule will be used for and can only take the following values: INTERNAL EXTERNAL The value of INTERNAL means that this will be used for Internal Network Load Balancing (TCP, UDP). The value of EXTERNAL means that this will be used for External Load Balancing (HTTP(S) LB, External TCP/UDP LB, SSL Proxy)",
+     "description": "This signifies what the ForwardingRule will be used for and can only take the following values: INTERNAL, EXTERNAL The value of INTERNAL means that this will be used for Internal Network Load Balancing (TCP, UDP). The value of EXTERNAL means that this will be used for External Load Balancing (HTTP(S) LB, External TCP/UDP LB, SSL Proxy)",
      "enum": [
       "EXTERNAL",
       "INTERNAL",
@@ -2371,6 +2588,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -2391,6 +2609,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -2447,12 +2666,14 @@
      "description": "The type of supported feature. Currenty only VIRTIO_SCSI_MULTIQUEUE is supported. For newer Windows images, the server might also populate this property with the value WINDOWS to indicate that this is a Windows image. This value is purely informational and does not enable or disable any features.",
      "enum": [
       "FEATURE_TYPE_UNSPECIFIED",
+      "MULTI_IP_SUBNET",
       "VIRTIO_SCSI_MULTIQUEUE",
       "WINDOWS"
      ],
      "enumDescriptions": [
       "",
       "",
+      "",
       ""
      ]
     }
@@ -3120,6 +3341,12 @@
       "$ref": "AttachedDisk"
      }
     },
+    "guestAccelerators": {
+     "type": "array",
+     "items": {
+      "$ref": "AcceleratorConfig"
+     }
+    },
     "id": {
      "type": "string",
      "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.",
@@ -3726,6 +3953,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -3746,6 +3974,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -3920,6 +4149,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -3940,6 +4170,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -4252,6 +4483,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -4272,6 +4504,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -4318,6 +4551,18 @@
     }
    }
   },
+  "InstancesSetMachineResourcesRequest": {
+   "id": "InstancesSetMachineResourcesRequest",
+   "type": "object",
+   "properties": {
+    "guestAccelerators": {
+     "type": "array",
+     "items": {
+      "$ref": "AcceleratorConfig"
+     }
+    }
+   }
+  },
   "InstancesSetMachineTypeRequest": {
    "id": "InstancesSetMachineTypeRequest",
    "type": "object",
@@ -4574,6 +4819,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -4594,6 +4840,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -4832,6 +5079,13 @@
       ]
      }
     },
+    "peerings": {
+     "type": "array",
+     "description": "[Output Only] List of network peerings for the resource.",
+     "items": {
+      "$ref": "NetworkPeering"
+     }
+    },
     "selfLink": {
      "type": "string",
      "description": "[Output Only] Server-defined URL for the resource."
@@ -4868,12 +5122,7 @@
     },
     "network": {
      "type": "string",
-     "description": "URL of the network resource for this instance. This is required for creating an instance but optional when creating a firewall rule. If not specified when creating a firewall rule, the default network is used:\n\nglobal/networks/default \n\nIf you specify this property, you can specify the network as a full or partial URL. For example, the following are all valid URLs:  \n- https://www.googleapis.com/compute/v1/projects/project/global/networks/network \n- projects/project/global/networks/network \n- global/networks/default",
-     "annotations": {
-      "required": [
-       "compute.instances.insert"
-      ]
-     }
+     "description": "URL of the network resource for this instance. When creating an instance, if neither the network nor the subnetwork is specified, the default network global/networks/default is used; if the network is not specified but the subnetwork is specified, the network is inferred.\n\nThis field is optional when creating a firewall rule. If not specified when creating a firewall rule, the default network global/networks/default is used.\n\nIf you specify this property, you can specify the network as a full or partial URL. For example, the following are all valid URLs:  \n- https://www.googleapis.com/compute/v1/projects/project/global/networks/network \n- projects/project/global/networks/network \n- global/networks/default"
     },
     "networkIP": {
      "type": "string",
@@ -4916,6 +5165,41 @@
     }
    }
   },
+  "NetworkPeering": {
+   "id": "NetworkPeering",
+   "type": "object",
+   "description": "A network peering attached to a network resource. The message includes the peering name, peer network, peering state, and a flag indicating whether Google Compute Engine should automatically create routes for the peering.",
+   "properties": {
+    "autoCreateRoutes": {
+     "type": "boolean",
+     "description": "Whether full mesh connectivity is created and managed automatically. When it is set to true, Google Compute Engine will automatically create and manage the routes between two networks when the state is ACTIVE. Otherwise, user needs to create routes manually to route packets to peer network."
+    },
+    "name": {
+     "type": "string",
+     "description": "Name of this peering. Provided by the client when the peering is created. The name must comply with RFC1035. Specifically, the name must be 1-63 characters long and match regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all the following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash."
+    },
+    "network": {
+     "type": "string",
+     "description": "The URL of the peer network. It can be either full URL or partial URL. The peer network may belong to a different project. If the partial URL does not contain project, it is assumed that the peer network is in the same project as the current network."
+    },
+    "state": {
+     "type": "string",
+     "description": "[Output Only] State for the peering.",
+     "enum": [
+      "ACTIVE",
+      "INACTIVE"
+     ],
+     "enumDescriptions": [
+      "",
+      ""
+     ]
+    },
+    "stateDetails": {
+     "type": "string",
+     "description": "[Output Only] Details about the current state of the peering."
+    }
+   }
+  },
   "Operation": {
    "id": "Operation",
    "type": "object",
@@ -5066,6 +5350,7 @@
          "NOT_CRITICAL_ERROR",
          "NO_RESULTS_ON_PAGE",
          "REQUIRED_TOS_AGREEMENT",
+         "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
          "RESOURCE_NOT_DELETED",
          "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
          "UNREACHABLE"
@@ -5086,6 +5371,7 @@
          "",
          "",
          "",
+         "",
          ""
         ]
        },
@@ -5213,6 +5499,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -5233,6 +5520,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -5312,7 +5600,7 @@
    "properties": {
     "auditConfigs": {
      "type": "array",
-     "description": "Specifies audit logging configs for \"data access\". \"data access\": generally refers to data reads/writes and admin reads. \"admin activity\": generally refers to admin writes.\n\nNote: `AuditConfig` doesn't apply to \"admin activity\", which always enables audit logging.",
+     "description": "Specifies cloud audit logging configuration for this policy.",
      "items": {
       "$ref": "AuditConfig"
      }
@@ -5446,6 +5734,7 @@
       "BACKEND_BUCKETS",
       "BACKEND_SERVICES",
       "CPUS",
+      "CPUS_ALL_REGIONS",
       "DISKS_TOTAL_GB",
       "FIREWALLS",
       "FORWARDING_RULES",
@@ -5475,7 +5764,6 @@
       "TARGET_POOLS",
       "TARGET_SSL_PROXIES",
       "TARGET_VPN_GATEWAYS",
-      "TOTAL_CPUS",
       "URL_MAPS",
       "VPN_TUNNELS"
      ],
@@ -5888,7 +6176,7 @@
   "Route": {
    "id": "Route",
    "type": "object",
-   "description": "Represents a Route resource. A route specifies how certain packets should be handled by the network. Routes are associated with instances by tags and the set of routes for a particular instance is called its routing table.\n\nFor each packet leaving a instance, the system searches that instance's routing table for a single best matching route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching routes. The packet is then forwarded as specified by the nextHop field of the winning route - either to another instance destination, a instance gateway or a Google Compute Engine-operated gateway.\n\nPackets that do not match any route in the sending instance's routing table are dropped.",
+   "description": "Represents a Route resource. A route specifies how certain packets should be handled by the network. Routes are associated with instances by tags and the set of routes for a particular instance is called its routing table.\n\nFor each packet leaving a instance, the system searches that instance's routing table for a single best matching route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching routes. The packet is then forwarded as specified by the nextHop field of the winning route - either to another instance destination, an instance gateway, or a Google Compute Engine-operated gateway.\n\nPackets that do not match any route in the sending instance's routing table are dropped.",
    "properties": {
     "creationTimestamp": {
      "type": "string",
@@ -5952,6 +6240,10 @@
      "type": "string",
      "description": "The URL of the local network if it should handle matching packets."
     },
+    "nextHopPeering": {
+     "type": "string",
+     "description": "[Output Only] The network peering name that should handle matching packets, which should conform to RFC1035."
+    },
     "nextHopVpnTunnel": {
      "type": "string",
      "description": "The URL to a VpnTunnel that should handle matching packets."
@@ -6005,6 +6297,7 @@
          "NOT_CRITICAL_ERROR",
          "NO_RESULTS_ON_PAGE",
          "REQUIRED_TOS_AGREEMENT",
+         "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
          "RESOURCE_NOT_DELETED",
          "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
          "UNREACHABLE"
@@ -6025,6 +6318,7 @@
          "",
          "",
          "",
+         "",
          ""
         ]
        },
@@ -6420,6 +6714,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -6440,6 +6735,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -7011,6 +7307,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -7031,6 +7328,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -7417,6 +7715,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -7437,6 +7736,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -7707,6 +8007,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -7727,6 +8028,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -8069,6 +8371,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -8089,6 +8392,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -8588,6 +8892,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -8608,6 +8913,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -8770,6 +9076,158 @@
   }
  },
  "resources": {
+  "acceleratorTypes": {
+   "methods": {
+    "aggregatedList": {
+     "id": "compute.acceleratorTypes.aggregatedList",
+     "path": "{project}/aggregated/acceleratorTypes",
+     "httpMethod": "GET",
+     "description": "Retrieves an aggregated list of accelerator types.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+       "default": "500",
+       "format": "uint32",
+       "minimum": "0",
+       "location": "query"
+      },
+      "orderBy": {
+       "type": "string",
+       "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project"
+     ],
+     "response": {
+      "$ref": "AcceleratorTypeAggregatedList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "get": {
+     "id": "compute.acceleratorTypes.get",
+     "path": "{project}/zones/{zone}/acceleratorTypes/{acceleratorType}",
+     "httpMethod": "GET",
+     "description": "Returns the specified accelerator type. Get a list of available accelerator types by making a list() request.",
+     "parameters": {
+      "acceleratorType": {
+       "type": "string",
+       "description": "Name of the accelerator type to return.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "The name of the zone for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "acceleratorType"
+     ],
+     "response": {
+      "$ref": "AcceleratorType"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    },
+    "list": {
+     "id": "compute.acceleratorTypes.list",
+     "path": "{project}/zones/{zone}/acceleratorTypes",
+     "httpMethod": "GET",
+     "description": "Retrieves a list of accelerator types available to the specified project.",
+     "parameters": {
+      "filter": {
+       "type": "string",
+       "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+       "default": "500",
+       "format": "uint32",
+       "minimum": "0",
+       "location": "query"
+      },
+      "orderBy": {
+       "type": "string",
+       "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.",
+       "location": "query"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "The name of the zone for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone"
+     ],
+     "response": {
+      "$ref": "AcceleratorTypeList"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute",
+      "https://www.googleapis.com/auth/compute.readonly"
+     ]
+    }
+   }
+  },
   "addresses": {
    "methods": {
     "aggregatedList": {
@@ -8789,7 +9247,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -8958,7 +9415,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -9065,7 +9521,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -9234,7 +9689,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -9522,7 +9976,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -9648,7 +10101,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -9829,7 +10281,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -9992,7 +10443,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10084,7 +10534,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10146,7 +10595,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10367,7 +10815,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10657,7 +11104,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10820,7 +11266,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10989,7 +11434,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11235,7 +11679,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11421,7 +11864,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11548,7 +11990,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11662,7 +12103,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11811,7 +12251,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12069,7 +12508,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12327,7 +12765,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12658,7 +13095,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12827,7 +13263,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13033,7 +13468,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13094,7 +13528,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "order_by": {
@@ -13137,7 +13570,7 @@
      "id": "compute.instanceGroupManagers.patch",
      "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}",
      "httpMethod": "PATCH",
-     "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports patch semantics.",
+     "description": "Updates a managed instance group using the information that you specify in the request. The field statefulPolicy is updated using PATCH semantics. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports patch semantics.",
      "parameters": {
       "instanceGroupManager": {
        "type": "string",
@@ -13481,7 +13914,7 @@
      "id": "compute.instanceGroupManagers.update",
      "path": "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}",
      "httpMethod": "PUT",
-     "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method.",
+     "description": "Updates a managed instance group using the information that you specify in the request. The field statefulPolicy is updated using PATCH semantics. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method.",
      "parameters": {
       "instanceGroupManager": {
        "type": "string",
@@ -13582,7 +14015,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13746,7 +14178,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13809,7 +14240,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -14098,7 +14528,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -14240,7 +14669,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -14613,7 +15041,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -14795,6 +15222,50 @@
       "https://www.googleapis.com/auth/compute"
      ]
     },
+    "setMachineResources": {
+     "id": "compute.instances.setMachineResources",
+     "path": "{project}/zones/{zone}/instances/{instance}/setMachineResources",
+     "httpMethod": "POST",
+     "description": "Changes the number and/or type of accelerator for a stopped instance to the values specified in the request.",
+     "parameters": {
+      "instance": {
+       "type": "string",
+       "description": "Name of the instance scoping this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      },
+      "project": {
+       "type": "string",
+       "description": "Project ID for this request.",
+       "required": true,
+       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+       "location": "path"
+      },
+      "zone": {
+       "type": "string",
+       "description": "The name of the zone for this request.",
+       "required": true,
+       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+       "location": "path"
+      }
+     },
+     "parameterOrder": [
+      "project",
+      "zone",
+      "instance"
+     ],
+     "request": {
+      "$ref": "InstancesSetMachineResourcesRequest"
+     },
+     "response": {
+      "$ref": "Operation"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/cloud-platform",
+      "https://www.googleapis.com/auth/compute"
+     ]
+    },
     "setMachineType": {
      "id": "compute.instances.setMachineType",
      "path": "{project}/zones/{zone}/instances/{instance}/setMachineType",
@@ -15245,7 +15716,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15337,7 +15807,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15494,7 +15963,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15659,6 +16127,25 @@
      "httpMethod": "POST",
      "description": "List all XPN host projects visible to the user in an organization.",
      "parameters": {
+      "filter": {
+       "type": "string",
+       "location": "query"
+      },
+      "maxResults": {
+       "type": "integer",
+       "default": "500",
+       "format": "uint32",
+       "minimum": "0",
+       "location": "query"
+      },
+      "order_by": {
+       "type": "string",
+       "location": "query"
+      },
+      "pageToken": {
+       "type": "string",
+       "location": "query"
+      },
       "project": {
        "type": "string",
        "description": "Project ID for this request.",
@@ -15937,7 +16424,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16293,7 +16779,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16686,7 +17171,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16747,7 +17231,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "order_by": {
@@ -17192,7 +17675,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17255,7 +17737,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17487,7 +17968,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17583,7 +18063,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17637,7 +18116,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17848,7 +18326,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -18183,7 +18660,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -18341,7 +18817,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -18563,7 +19038,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -18654,7 +19128,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -18909,7 +19382,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -19156,7 +19628,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -19378,7 +19849,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -19541,7 +20011,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -19710,7 +20179,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -19905,7 +20373,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -20119,7 +20586,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -20459,7 +20925,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -20658,7 +21123,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -20827,7 +21291,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -21065,7 +21528,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -21264,7 +21726,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -21433,7 +21894,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -21620,7 +22080,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -21716,7 +22175,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
diff --git a/compute/v0.beta/compute-gen.go b/compute/v0.beta/compute-gen.go
index 32d6a68..2e2bd93 100644
--- a/compute/v0.beta/compute-gen.go
+++ b/compute/v0.beta/compute-gen.go
@@ -71,6 +71,7 @@
 		return nil, errors.New("client is nil")
 	}
 	s := &Service{client: client, BasePath: basePath}
+	s.AcceleratorTypes = NewAcceleratorTypesService(s)
 	s.Addresses = NewAddressesService(s)
 	s.Autoscalers = NewAutoscalersService(s)
 	s.BackendBuckets = NewBackendBucketsService(s)
@@ -119,9 +120,12 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
+
+	AcceleratorTypes *AcceleratorTypesService
 
 	Addresses *AddressesService
 
@@ -219,6 +223,19 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
+func NewAcceleratorTypesService(s *Service) *AcceleratorTypesService {
+	rs := &AcceleratorTypesService{s: s}
+	return rs
+}
+
+type AcceleratorTypesService struct {
+	s *Service
+}
+
 func NewAddressesService(s *Service) *AddressesService {
 	rs := &AddressesService{s: s}
 	return rs
@@ -615,6 +632,333 @@
 	s *Service
 }
 
+// AcceleratorConfig: A specification of the type and number of
+// accelerator cards attached to the instance.
+type AcceleratorConfig struct {
+	// AcceleratorCount: The number of the guest accelerator cards exposed
+	// to this instance.
+	AcceleratorCount int64 `json:"acceleratorCount,omitempty"`
+
+	// AcceleratorType: Full or partial URL of the accelerator type resource
+	// to expose to this instance.
+	AcceleratorType string `json:"acceleratorType,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "AcceleratorCount") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "AcceleratorCount") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorConfig) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorConfig
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// AcceleratorType: An Accelerator Type resource.
+type AcceleratorType struct {
+	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
+	// format.
+	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+
+	// Deprecated: [Output Only] The deprecation status associated with this
+	// accelerator type.
+	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
+
+	// Description: [Output Only] An optional textual description of the
+	// resource.
+	Description string `json:"description,omitempty"`
+
+	// Id: [Output Only] The unique identifier for the resource. This
+	// identifier is defined by the server.
+	Id uint64 `json:"id,omitempty,string"`
+
+	// Kind: [Output Only] The type of the resource. Always
+	// compute#acceleratorType for accelerator types.
+	Kind string `json:"kind,omitempty"`
+
+	// MaximumCardsPerInstance: [Output Only] Maximum accelerator cards
+	// allowed per instance.
+	MaximumCardsPerInstance int64 `json:"maximumCardsPerInstance,omitempty"`
+
+	// Name: [Output Only] Name of the resource.
+	Name string `json:"name,omitempty"`
+
+	// SelfLink: [Output Only] Server-defined fully-qualified URL for this
+	// resource.
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// Zone: [Output Only] The name of the zone where the accelerator type
+	// resides, such as us-central1-a.
+	Zone string `json:"zone,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "CreationTimestamp")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "CreationTimestamp") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorType) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorType
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type AcceleratorTypeAggregatedList struct {
+	// Id: [Output Only] The unique identifier for the resource. This
+	// identifier is defined by the server.
+	Id string `json:"id,omitempty"`
+
+	// Items: [Output Only] A map of scoped accelerator type lists.
+	Items map[string]AcceleratorTypesScopedList `json:"items,omitempty"`
+
+	// Kind: [Output Only] Type of resource. Always
+	// compute#acceleratorTypeAggregatedList for aggregated lists of
+	// accelerator types.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: [Output Only] This token allows you to get the next
+	// page of results for list requests. If the number of results is larger
+	// than maxResults, use the nextPageToken as a value for the query
+	// parameter pageToken in the next list request. Subsequent list
+	// requests will have their own nextPageToken to continue paging through
+	// the results.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: [Output Only] Server-defined URL for this resource.
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Id") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Id") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorTypeAggregatedList) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorTypeAggregatedList
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// AcceleratorTypeList: Contains a list of accelerator types.
+type AcceleratorTypeList struct {
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
+	Id string `json:"id,omitempty"`
+
+	// Items: A list of AcceleratorType resources.
+	Items []*AcceleratorType `json:"items,omitempty"`
+
+	// Kind: [Output Only] Type of resource. Always
+	// compute#acceleratorTypeList for lists of accelerator types.
+	Kind string `json:"kind,omitempty"`
+
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
+	NextPageToken string `json:"nextPageToken,omitempty"`
+
+	// SelfLink: [Output Only] Server-defined URL for this resource.
+	SelfLink string `json:"selfLink,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Id") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Id") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorTypeList) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorTypeList
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type AcceleratorTypesScopedList struct {
+	// AcceleratorTypes: [Output Only] List of accelerator types contained
+	// in this scope.
+	AcceleratorTypes []*AcceleratorType `json:"acceleratorTypes,omitempty"`
+
+	// Warning: [Output Only] An informational warning that appears when the
+	// accelerator types list is empty.
+	Warning *AcceleratorTypesScopedListWarning `json:"warning,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "AcceleratorTypes") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "AcceleratorTypes") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorTypesScopedList) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorTypesScopedList
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// AcceleratorTypesScopedListWarning: [Output Only] An informational
+// warning that appears when the accelerator types list is empty.
+type AcceleratorTypesScopedListWarning struct {
+	// Code: [Output Only] A warning code, if applicable. For example,
+	// Compute Engine returns NO_RESULTS_ON_PAGE if there are no results in
+	// the response.
+	//
+	// Possible values:
+	//   "CLEANUP_FAILED"
+	//   "DEPRECATED_RESOURCE_USED"
+	//   "DISK_SIZE_LARGER_THAN_IMAGE_SIZE"
+	//   "FIELD_VALUE_OVERRIDEN"
+	//   "INJECTED_KERNELS_DEPRECATED"
+	//   "NEXT_HOP_ADDRESS_NOT_ASSIGNED"
+	//   "NEXT_HOP_CANNOT_IP_FORWARD"
+	//   "NEXT_HOP_INSTANCE_NOT_FOUND"
+	//   "NEXT_HOP_INSTANCE_NOT_ON_NETWORK"
+	//   "NEXT_HOP_NOT_RUNNING"
+	//   "NOT_CRITICAL_ERROR"
+	//   "NO_RESULTS_ON_PAGE"
+	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
+	//   "RESOURCE_NOT_DELETED"
+	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
+	//   "UNREACHABLE"
+	Code string `json:"code,omitempty"`
+
+	// Data: [Output Only] Metadata about this warning in key: value format.
+	// For example:
+	// "data": [ { "key": "scope", "value": "zones/us-east1-d" }
+	Data []*AcceleratorTypesScopedListWarningData `json:"data,omitempty"`
+
+	// Message: [Output Only] A human-readable description of the warning
+	// code.
+	Message string `json:"message,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Code") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Code") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorTypesScopedListWarning) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorTypesScopedListWarning
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type AcceleratorTypesScopedListWarningData struct {
+	// Key: [Output Only] A key that provides more detail on the warning
+	// being returned. For example, for warnings where there are no results
+	// in a list request for a particular zone, this key might be scope and
+	// the key value might be the zone name. Other examples might be a key
+	// indicating a deprecated resource and a suggested replacement, or a
+	// warning about invalid network settings (for example, if an instance
+	// attempts to perform IP forwarding but is not enabled for IP
+	// forwarding).
+	Key string `json:"key,omitempty"`
+
+	// Value: [Output Only] A warning data value corresponding to the key.
+	Value string `json:"value,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Key") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Key") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AcceleratorTypesScopedListWarningData) MarshalJSON() ([]byte, error) {
+	type noMethod AcceleratorTypesScopedListWarningData
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // AccessConfig: An access configuration attached to an instance's
 // network interface. Only one access config per instance is supported.
 type AccessConfig struct {
@@ -894,6 +1238,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -1203,16 +1548,19 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// AuditConfig: Provides the configuration for non-admin_activity
-// logging for a service. Controls exemptions and specific log
-// sub-types.
+// AuditConfig: Specifies the audit configuration for a service. It
+// consists of which permission types are logged, and what identities,
+// if any, are exempted from logging. An AuditConifg must have one or
+// more AuditLogConfigs.
 type AuditConfig struct {
-	// AuditLogConfigs: The configuration for each type of logging
+	// AuditLogConfigs: The configuration for logging of each type of
+	// permission.
 	AuditLogConfigs []*AuditLogConfig `json:"auditLogConfigs,omitempty"`
 
 	// ExemptedMembers: Specifies the identities that are exempted from
 	// "data access" audit logging for the `service` specified above.
-	// Follows the same format of Binding.members.
+	// Follows the same format of Binding.members. This field is deprecated
+	// in favor of per-permission-type exemptions.
 	ExemptedMembers []string `json:"exemptedMembers,omitempty"`
 
 	// Service: Specifies a service that will be enabled for audit logging.
@@ -1244,10 +1592,19 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// AuditLogConfig: Provides the configuration for a sub-type of logging.
+// AuditLogConfig: Provides the configuration for logging a type of
+// permissions. Example:
+//
+// { "audit_log_configs": [ { "log_type": "DATA_READ",
+// "exempted_members": [ "user:foo@gmail.com" ] }, { "log_type":
+// "DATA_WRITE", } ] }
+//
+// This enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting
+// foo@gmail.com from DATA_READ logging.
 type AuditLogConfig struct {
-	// ExemptedMembers: Specifies the identities that are exempted from this
-	// type of logging Follows the same format of Binding.members.
+	// ExemptedMembers: Specifies the identities that do not cause logging
+	// for this type of permission. Follows the same format of
+	// [Binding.members][].
 	ExemptedMembers []string `json:"exemptedMembers,omitempty"`
 
 	// LogType: The log type that this config enables.
@@ -1578,6 +1935,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -2532,6 +2890,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -3242,23 +3601,19 @@
 
 // DiskList: A list of Disk resources.
 type DiskList struct {
-	// Id: [Output Only] The unique identifier for the resource. This
-	// identifier is defined by the server.
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: [Output Only] A list of persistent disks.
+	// Items: A list of Disk resources.
 	Items []*Disk `json:"items,omitempty"`
 
 	// Kind: [Output Only] Type of resource. Always compute#diskList for
 	// lists of disks.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: [Output Only] This token allows you to get the next
-	// page of results for list requests. If the number of results is larger
-	// than maxResults, use the nextPageToken as a value for the query
-	// parameter pageToken in the next list request. Subsequent list
-	// requests will have their own nextPageToken to continue paging through
-	// the results.
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
 	// SelfLink: [Output Only] Server-defined URL for this resource.
@@ -3553,6 +3908,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -3707,6 +4063,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -3979,7 +4336,7 @@
 	// IPAddress: The IP address that this forwarding rule is serving on
 	// behalf of.
 	//
-	// For global forwarding rules, the address must be a global IP; for
+	// For global forwarding rules, the address must be a global IP. For
 	// regional forwarding rules, the address must live in the same region
 	// as the forwarding rule. By default, this field is empty and an
 	// ephemeral IP from the same scope (global or regional) will be
@@ -3996,8 +4353,8 @@
 	// IPProtocol: The IP protocol to which this rule applies. Valid options
 	// are TCP, UDP, ESP, AH, SCTP or ICMP.
 	//
-	// When the load balancing scheme is INTERNAL</code, only TCP and UDP
-	// are valid.
+	// When the load balancing scheme is INTERNAL, only TCP and UDP are
+	// valid.
 	//
 	// Possible values:
 	//   "AH"
@@ -4032,7 +4389,7 @@
 	Kind string `json:"kind,omitempty"`
 
 	// LoadBalancingScheme: This signifies what the ForwardingRule will be
-	// used for and can only take the following values: INTERNAL EXTERNAL
+	// used for and can only take the following values: INTERNAL, EXTERNAL
 	// The value of INTERNAL means that this will be used for Internal
 	// Network Load Balancing (TCP, UDP). The value of EXTERNAL means that
 	// this will be used for External Load Balancing (HTTP(S) LB, External
@@ -4289,6 +4646,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -4416,6 +4774,7 @@
 	//
 	// Possible values:
 	//   "FEATURE_TYPE_UNSPECIFIED"
+	//   "MULTI_IP_SUBNET"
 	//   "VIRTIO_SCSI_MULTIQUEUE"
 	//   "WINDOWS"
 	Type string `json:"type,omitempty"`
@@ -5368,6 +5727,8 @@
 	// must be created before you can assign them.
 	Disks []*AttachedDisk `json:"disks,omitempty"`
 
+	GuestAccelerators []*AcceleratorConfig `json:"guestAccelerators,omitempty"`
+
 	// Id: [Output Only] The unique identifier for the resource. This
 	// identifier is defined by the server.
 	Id uint64 `json:"id,omitempty,string"`
@@ -6308,6 +6669,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -6674,6 +7036,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -7190,6 +7553,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -7306,6 +7670,33 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type InstancesSetMachineResourcesRequest struct {
+	GuestAccelerators []*AcceleratorConfig `json:"guestAccelerators,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "GuestAccelerators")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "GuestAccelerators") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *InstancesSetMachineResourcesRequest) MarshalJSON() ([]byte, error) {
+	type noMethod InstancesSetMachineResourcesRequest
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 type InstancesSetMachineTypeRequest struct {
 	// MachineType: Full or partial URL of the machine type resource. See
 	// Machine Types for a full list of machine types. For example:
@@ -7739,6 +8130,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -8148,6 +8540,9 @@
 	// last character, which cannot be a dash.
 	Name string `json:"name,omitempty"`
 
+	// Peerings: [Output Only] List of network peerings for the resource.
+	Peerings []*NetworkPeering `json:"peerings,omitempty"`
+
 	// SelfLink: [Output Only] Server-defined URL for the resource.
 	SelfLink string `json:"selfLink,omitempty"`
 
@@ -8199,12 +8594,15 @@
 	// the server. For network devices, these are eth0, eth1, etc.
 	Name string `json:"name,omitempty"`
 
-	// Network: URL of the network resource for this instance. This is
-	// required for creating an instance but optional when creating a
-	// firewall rule. If not specified when creating a firewall rule, the
-	// default network is used:
+	// Network: URL of the network resource for this instance. When creating
+	// an instance, if neither the network nor the subnetwork is specified,
+	// the default network global/networks/default is used; if the network
+	// is not specified but the subnetwork is specified, the network is
+	// inferred.
 	//
-	// global/networks/default
+	// This field is optional when creating a firewall rule. If not
+	// specified when creating a firewall rule, the default network
+	// global/networks/default is used.
 	//
 	// If you specify this property, you can specify the network as a full
 	// or partial URL. For example, the following are all valid URLs:
@@ -8305,6 +8703,68 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// NetworkPeering: A network peering attached to a network resource. The
+// message includes the peering name, peer network, peering state, and a
+// flag indicating whether Google Compute Engine should automatically
+// create routes for the peering.
+type NetworkPeering struct {
+	// AutoCreateRoutes: Whether full mesh connectivity is created and
+	// managed automatically. When it is set to true, Google Compute Engine
+	// will automatically create and manage the routes between two networks
+	// when the state is ACTIVE. Otherwise, user needs to create routes
+	// manually to route packets to peer network.
+	AutoCreateRoutes bool `json:"autoCreateRoutes,omitempty"`
+
+	// Name: Name of this peering. Provided by the client when the peering
+	// is created. The name must comply with RFC1035. Specifically, the name
+	// must be 1-63 characters long and match regular expression
+	// [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a
+	// lowercase letter, and all the following characters must be a dash,
+	// lowercase letter, or digit, except the last character, which cannot
+	// be a dash.
+	Name string `json:"name,omitempty"`
+
+	// Network: The URL of the peer network. It can be either full URL or
+	// partial URL. The peer network may belong to a different project. If
+	// the partial URL does not contain project, it is assumed that the peer
+	// network is in the same project as the current network.
+	Network string `json:"network,omitempty"`
+
+	// State: [Output Only] State for the peering.
+	//
+	// Possible values:
+	//   "ACTIVE"
+	//   "INACTIVE"
+	State string `json:"state,omitempty"`
+
+	// StateDetails: [Output Only] Details about the current state of the
+	// peering.
+	StateDetails string `json:"stateDetails,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "AutoCreateRoutes") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "AutoCreateRoutes") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *NetworkPeering) MarshalJSON() ([]byte, error) {
+	type noMethod NetworkPeering
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // Operation: An Operation resource, used to manage asynchronous API
 // requests.
 type Operation struct {
@@ -8518,6 +8978,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -8745,6 +9206,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -8927,12 +9389,8 @@
 // For a description of IAM and its features, see the [IAM developer's
 // guide](https://cloud.google.com/iam).
 type Policy struct {
-	// AuditConfigs: Specifies audit logging configs for "data access".
-	// "data access": generally refers to data reads/writes and admin reads.
-	// "admin activity": generally refers to admin writes.
-	//
-	// Note: `AuditConfig` doesn't apply to "admin activity", which always
-	// enables audit logging.
+	// AuditConfigs: Specifies cloud audit logging configuration for this
+	// policy.
 	AuditConfigs []*AuditConfig `json:"auditConfigs,omitempty"`
 
 	// Bindings: Associates a list of `members` to a `role`. Multiple
@@ -9120,6 +9578,7 @@
 	//   "BACKEND_BUCKETS"
 	//   "BACKEND_SERVICES"
 	//   "CPUS"
+	//   "CPUS_ALL_REGIONS"
 	//   "DISKS_TOTAL_GB"
 	//   "FIREWALLS"
 	//   "FORWARDING_RULES"
@@ -9149,7 +9608,6 @@
 	//   "TARGET_POOLS"
 	//   "TARGET_SSL_PROXIES"
 	//   "TARGET_VPN_GATEWAYS"
-	//   "TOTAL_CPUS"
 	//   "URL_MAPS"
 	//   "VPN_TUNNELS"
 	Metric string `json:"metric,omitempty"`
@@ -9830,8 +10288,8 @@
 // a tie, it uses the layer three and four packet headers to select just
 // one of the remaining matching routes. The packet is then forwarded as
 // specified by the nextHop field of the winning route - either to
-// another instance destination, a instance gateway or a Google Compute
-// Engine-operated gateway.
+// another instance destination, an instance gateway, or a Google
+// Compute Engine-operated gateway.
 //
 // Packets that do not match any route in the sending instance's routing
 // table are dropped.
@@ -9890,6 +10348,10 @@
 	// matching packets.
 	NextHopNetwork string `json:"nextHopNetwork,omitempty"`
 
+	// NextHopPeering: [Output Only] The network peering name that should
+	// handle matching packets, which should conform to RFC1035.
+	NextHopPeering string `json:"nextHopPeering,omitempty"`
+
 	// NextHopVpnTunnel: The URL to a VpnTunnel that should handle matching
 	// packets.
 	NextHopVpnTunnel string `json:"nextHopVpnTunnel,omitempty"`
@@ -9959,6 +10421,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -10589,6 +11052,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -11473,6 +11937,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -12138,6 +12603,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -12663,6 +13129,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -13219,6 +13686,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -14027,6 +14495,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -14303,6 +14772,686 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// method id "compute.acceleratorTypes.aggregatedList":
+
+type AcceleratorTypesAggregatedListCall struct {
+	s            *Service
+	project      string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// AggregatedList: Retrieves an aggregated list of accelerator types.
+func (r *AcceleratorTypesService) AggregatedList(project string) *AcceleratorTypesAggregatedListCall {
+	c := &AcceleratorTypesAggregatedListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	return c
+}
+
+// Filter sets the optional parameter "filter": Sets a filter expression
+// for filtering listed resources, in the form filter={expression}. Your
+// {expression} must be in the format: field_name comparison_string
+// literal_string.
+//
+// The field_name is the name of the field you want to compare. Only
+// atomic field types are supported (string, number, boolean). The
+// comparison_string must be either eq (equals) or ne (not equals). The
+// literal_string is the string value to filter to. The literal value
+// must be valid for the type of field you are filtering by (string,
+// number, boolean). For string fields, the literal value is interpreted
+// as a regular expression using RE2 syntax. The literal value must
+// match the entire field.
+//
+// For example, to filter for instances that do not have a name of
+// example-instance, you would use filter=name ne example-instance.
+//
+// You can filter on nested fields. For example, you could filter on
+// instances that have set the scheduling.automaticRestart field to
+// true. Use filtering on nested fields to take advantage of labels to
+// organize and search for results based on label values.
+//
+// To filter on multiple expressions, provide each separate expression
+// within parentheses. For example, (scheduling.automaticRestart eq
+// true) (zone eq us-central1-f). Multiple expressions are treated as
+// AND expressions, meaning that resources must match all expressions to
+// pass the filters.
+func (c *AcceleratorTypesAggregatedListCall) Filter(filter string) *AcceleratorTypesAggregatedListCall {
+	c.urlParams_.Set("filter", filter)
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of results per page that should be returned. If the number of
+// available results is larger than maxResults, Compute Engine returns a
+// nextPageToken that can be used to get the next page of results in
+// subsequent list requests.
+func (c *AcceleratorTypesAggregatedListCall) MaxResults(maxResults int64) *AcceleratorTypesAggregatedListCall {
+	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
+	return c
+}
+
+// OrderBy sets the optional parameter "orderBy": Sorts list results by
+// a certain order. By default, results are returned in alphanumerical
+// order based on the resource name.
+//
+// You can also sort results in descending order based on the creation
+// timestamp using orderBy="creationTimestamp desc". This sorts results
+// based on the creationTimestamp field in reverse chronological order
+// (newest result first). Use this to sort resources like operations so
+// that the newest operation is returned first.
+//
+// Currently, only sorting by name or creationTimestamp desc is
+// supported.
+func (c *AcceleratorTypesAggregatedListCall) OrderBy(orderBy string) *AcceleratorTypesAggregatedListCall {
+	c.urlParams_.Set("orderBy", orderBy)
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Specifies a page
+// token to use. Set pageToken to the nextPageToken returned by a
+// previous list request to get the next page of results.
+func (c *AcceleratorTypesAggregatedListCall) PageToken(pageToken string) *AcceleratorTypesAggregatedListCall {
+	c.urlParams_.Set("pageToken", pageToken)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AcceleratorTypesAggregatedListCall) Fields(s ...googleapi.Field) *AcceleratorTypesAggregatedListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *AcceleratorTypesAggregatedListCall) IfNoneMatch(entityTag string) *AcceleratorTypesAggregatedListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *AcceleratorTypesAggregatedListCall) Context(ctx context.Context) *AcceleratorTypesAggregatedListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *AcceleratorTypesAggregatedListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *AcceleratorTypesAggregatedListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/acceleratorTypes")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project": c.project,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.acceleratorTypes.aggregatedList" call.
+// Exactly one of *AcceleratorTypeAggregatedList or error will be
+// non-nil. Any non-2xx status code is an error. Response headers are in
+// either *AcceleratorTypeAggregatedList.ServerResponse.Header or (if a
+// response was returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *AcceleratorTypesAggregatedListCall) Do(opts ...googleapi.CallOption) (*AcceleratorTypeAggregatedList, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AcceleratorTypeAggregatedList{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves an aggregated list of accelerator types.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.acceleratorTypes.aggregatedList",
+	//   "parameterOrder": [
+	//     "project"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "500",
+	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "orderBy": {
+	//       "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/aggregated/acceleratorTypes",
+	//   "response": {
+	//     "$ref": "AcceleratorTypeAggregatedList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *AcceleratorTypesAggregatedListCall) Pages(ctx context.Context, f func(*AcceleratorTypeAggregatedList) error) error {
+	c.ctx_ = ctx
+	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.PageToken(x.NextPageToken)
+	}
+}
+
+// method id "compute.acceleratorTypes.get":
+
+type AcceleratorTypesGetCall struct {
+	s               *Service
+	project         string
+	zone            string
+	acceleratorType string
+	urlParams_      gensupport.URLParams
+	ifNoneMatch_    string
+	ctx_            context.Context
+	header_         http.Header
+}
+
+// Get: Returns the specified accelerator type. Get a list of available
+// accelerator types by making a list() request.
+func (r *AcceleratorTypesService) Get(project string, zone string, acceleratorType string) *AcceleratorTypesGetCall {
+	c := &AcceleratorTypesGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.zone = zone
+	c.acceleratorType = acceleratorType
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AcceleratorTypesGetCall) Fields(s ...googleapi.Field) *AcceleratorTypesGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *AcceleratorTypesGetCall) IfNoneMatch(entityTag string) *AcceleratorTypesGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *AcceleratorTypesGetCall) Context(ctx context.Context) *AcceleratorTypesGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *AcceleratorTypesGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *AcceleratorTypesGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/acceleratorTypes/{acceleratorType}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project":         c.project,
+		"zone":            c.zone,
+		"acceleratorType": c.acceleratorType,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.acceleratorTypes.get" call.
+// Exactly one of *AcceleratorType or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *AcceleratorType.ServerResponse.Header or (if a response was returned
+// at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *AcceleratorTypesGetCall) Do(opts ...googleapi.CallOption) (*AcceleratorType, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AcceleratorType{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Returns the specified accelerator type. Get a list of available accelerator types by making a list() request.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.acceleratorTypes.get",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "acceleratorType"
+	//   ],
+	//   "parameters": {
+	//     "acceleratorType": {
+	//       "description": "Name of the accelerator type to return.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "The name of the zone for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/acceleratorTypes/{acceleratorType}",
+	//   "response": {
+	//     "$ref": "AcceleratorType"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// method id "compute.acceleratorTypes.list":
+
+type AcceleratorTypesListCall struct {
+	s            *Service
+	project      string
+	zone         string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// List: Retrieves a list of accelerator types available to the
+// specified project.
+func (r *AcceleratorTypesService) List(project string, zone string) *AcceleratorTypesListCall {
+	c := &AcceleratorTypesListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.zone = zone
+	return c
+}
+
+// Filter sets the optional parameter "filter": Sets a filter expression
+// for filtering listed resources, in the form filter={expression}. Your
+// {expression} must be in the format: field_name comparison_string
+// literal_string.
+//
+// The field_name is the name of the field you want to compare. Only
+// atomic field types are supported (string, number, boolean). The
+// comparison_string must be either eq (equals) or ne (not equals). The
+// literal_string is the string value to filter to. The literal value
+// must be valid for the type of field you are filtering by (string,
+// number, boolean). For string fields, the literal value is interpreted
+// as a regular expression using RE2 syntax. The literal value must
+// match the entire field.
+//
+// For example, to filter for instances that do not have a name of
+// example-instance, you would use filter=name ne example-instance.
+//
+// You can filter on nested fields. For example, you could filter on
+// instances that have set the scheduling.automaticRestart field to
+// true. Use filtering on nested fields to take advantage of labels to
+// organize and search for results based on label values.
+//
+// To filter on multiple expressions, provide each separate expression
+// within parentheses. For example, (scheduling.automaticRestart eq
+// true) (zone eq us-central1-f). Multiple expressions are treated as
+// AND expressions, meaning that resources must match all expressions to
+// pass the filters.
+func (c *AcceleratorTypesListCall) Filter(filter string) *AcceleratorTypesListCall {
+	c.urlParams_.Set("filter", filter)
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults": The maximum
+// number of results per page that should be returned. If the number of
+// available results is larger than maxResults, Compute Engine returns a
+// nextPageToken that can be used to get the next page of results in
+// subsequent list requests.
+func (c *AcceleratorTypesListCall) MaxResults(maxResults int64) *AcceleratorTypesListCall {
+	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
+	return c
+}
+
+// OrderBy sets the optional parameter "orderBy": Sorts list results by
+// a certain order. By default, results are returned in alphanumerical
+// order based on the resource name.
+//
+// You can also sort results in descending order based on the creation
+// timestamp using orderBy="creationTimestamp desc". This sorts results
+// based on the creationTimestamp field in reverse chronological order
+// (newest result first). Use this to sort resources like operations so
+// that the newest operation is returned first.
+//
+// Currently, only sorting by name or creationTimestamp desc is
+// supported.
+func (c *AcceleratorTypesListCall) OrderBy(orderBy string) *AcceleratorTypesListCall {
+	c.urlParams_.Set("orderBy", orderBy)
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken": Specifies a page
+// token to use. Set pageToken to the nextPageToken returned by a
+// previous list request to get the next page of results.
+func (c *AcceleratorTypesListCall) PageToken(pageToken string) *AcceleratorTypesListCall {
+	c.urlParams_.Set("pageToken", pageToken)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *AcceleratorTypesListCall) Fields(s ...googleapi.Field) *AcceleratorTypesListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *AcceleratorTypesListCall) IfNoneMatch(entityTag string) *AcceleratorTypesListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *AcceleratorTypesListCall) Context(ctx context.Context) *AcceleratorTypesListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *AcceleratorTypesListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *AcceleratorTypesListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/acceleratorTypes")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project": c.project,
+		"zone":    c.zone,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.acceleratorTypes.list" call.
+// Exactly one of *AcceleratorTypeList or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *AcceleratorTypeList.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *AcceleratorTypesListCall) Do(opts ...googleapi.CallOption) (*AcceleratorTypeList, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AcceleratorTypeList{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Retrieves a list of accelerator types available to the specified project.",
+	//   "httpMethod": "GET",
+	//   "id": "compute.acceleratorTypes.list",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone"
+	//   ],
+	//   "parameters": {
+	//     "filter": {
+	//       "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "500",
+	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "orderBy": {
+	//       "description": "Sorts list results by a certain order. By default, results are returned in alphanumerical order based on the resource name.\n\nYou can also sort results in descending order based on the creation timestamp using orderBy=\"creationTimestamp desc\". This sorts results based on the creationTimestamp field in reverse chronological order (newest result first). Use this to sort resources like operations so that the newest operation is returned first.\n\nCurrently, only sorting by name or creationTimestamp desc is supported.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.",
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "The name of the zone for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/acceleratorTypes",
+	//   "response": {
+	//     "$ref": "AcceleratorTypeList"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute",
+	//     "https://www.googleapis.com/auth/compute.readonly"
+	//   ]
+	// }
+
+}
+
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *AcceleratorTypesListCall) Pages(ctx context.Context, f func(*AcceleratorTypeList) error) error {
+	c.ctx_ = ctx
+	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.PageToken(x.NextPageToken)
+	}
+}
+
 // method id "compute.addresses.aggregatedList":
 
 type AddressesAggregatedListCall struct {
@@ -14430,6 +15579,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14500,7 +15650,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -14609,6 +15758,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses/{address}")
@@ -14768,6 +15918,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14921,6 +16072,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.address)
 	if err != nil {
@@ -15145,6 +16297,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15217,7 +16370,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -15335,6 +16487,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -15565,6 +16718,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15635,7 +16789,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -15743,6 +16896,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers/{autoscaler}")
@@ -15902,6 +17056,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16054,6 +17209,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler)
 	if err != nil {
@@ -16277,6 +17433,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16349,7 +17506,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -16466,6 +17622,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler2)
 	if err != nil {
@@ -16623,6 +17780,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -16787,6 +17945,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler)
 	if err != nil {
@@ -16937,6 +18096,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendBuckets/{backendBucket}")
@@ -17085,6 +18245,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17226,6 +18387,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendbucket)
 	if err != nil {
@@ -17438,6 +18600,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17508,7 +18671,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -17617,6 +18779,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendbucket)
 	if err != nil {
@@ -17764,6 +18927,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendbucket)
 	if err != nil {
@@ -17985,6 +19149,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18055,7 +19220,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -18162,6 +19326,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}")
@@ -18311,6 +19476,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18455,6 +19621,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourcegroupreference)
 	if err != nil {
@@ -18603,6 +19770,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -18816,6 +19984,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18886,7 +20055,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -18999,6 +20167,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -19146,6 +20315,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -19297,6 +20467,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -19518,6 +20689,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19588,7 +20760,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -19709,6 +20880,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19938,6 +21110,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20010,7 +21183,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -20200,6 +21372,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20270,7 +21443,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -20387,6 +21559,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.snapshot)
 	if err != nil {
@@ -20550,6 +21723,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}")
@@ -20709,6 +21883,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20872,6 +22047,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.disk)
 	if err != nil {
@@ -21101,6 +22277,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21173,7 +22350,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -21290,6 +22466,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.disksresizerequest)
 	if err != nil {
@@ -21448,6 +22625,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.zonesetlabelsrequest)
 	if err != nil {
@@ -21606,6 +22784,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -21761,6 +22940,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}")
@@ -21909,6 +23089,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22051,6 +23232,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall)
 	if err != nil {
@@ -22264,6 +23446,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22334,7 +23517,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -22444,6 +23626,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2)
 	if err != nil {
@@ -22591,6 +23774,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -22740,6 +23924,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2)
 	if err != nil {
@@ -22961,6 +24146,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23031,7 +24217,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -23140,6 +24325,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{forwardingRule}")
@@ -23299,6 +24485,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23452,6 +24639,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.forwardingrule)
 	if err != nil {
@@ -23676,6 +24864,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23748,7 +24937,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -23867,6 +25055,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
 	if err != nil {
@@ -24025,6 +25214,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -24180,6 +25370,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses/{address}")
@@ -24329,6 +25520,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24471,6 +25663,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.address)
 	if err != nil {
@@ -24683,6 +25876,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24753,7 +25947,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -24862,6 +26055,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -25008,6 +26202,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{forwardingRule}")
@@ -25157,6 +26352,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25299,6 +26495,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.forwardingrule)
 	if err != nil {
@@ -25512,6 +26709,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25582,7 +26780,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -25692,6 +26889,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
 	if err != nil {
@@ -25839,6 +27037,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -26061,6 +27260,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26131,7 +27331,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -26238,6 +27437,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}")
@@ -26359,6 +27559,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26577,6 +27778,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26647,7 +27849,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -26753,6 +27954,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks/{healthCheck}")
@@ -26901,6 +28103,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27042,6 +28245,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck)
 	if err != nil {
@@ -27254,6 +28458,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27324,7 +28529,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -27434,6 +28638,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck)
 	if err != nil {
@@ -27581,6 +28786,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -27729,6 +28935,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck)
 	if err != nil {
@@ -27874,6 +29081,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}")
@@ -28023,6 +29231,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28165,6 +29374,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck)
 	if err != nil {
@@ -28378,6 +29588,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28448,7 +29659,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -28559,6 +29769,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck)
 	if err != nil {
@@ -28706,6 +29917,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -28855,6 +30067,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck)
 	if err != nil {
@@ -28999,6 +30212,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks/{httpsHealthCheck}")
@@ -29147,6 +30361,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -29288,6 +30503,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck)
 	if err != nil {
@@ -29500,6 +30716,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -29570,7 +30787,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -29680,6 +30896,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck)
 	if err != nil {
@@ -29827,6 +31044,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -29975,6 +31193,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck)
 	if err != nil {
@@ -30120,6 +31339,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{image}")
@@ -30262,6 +31482,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.deprecationstatus)
 	if err != nil {
@@ -30419,6 +31640,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30571,6 +31793,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30713,6 +31936,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.image)
 	if err != nil {
@@ -30934,6 +32158,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31004,7 +32229,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -31113,6 +32337,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetlabelsrequest)
 	if err != nil {
@@ -31260,6 +32485,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -31417,6 +32643,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersabandoninstancesrequest)
 	if err != nil {
@@ -31645,6 +32872,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31716,7 +32944,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -31827,6 +33054,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}")
@@ -31981,6 +33209,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersdeleteinstancesrequest)
 	if err != nil {
@@ -32147,6 +33376,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32302,6 +33532,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -32524,6 +33755,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32596,7 +33828,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -32739,6 +33970,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances")
@@ -32816,7 +34048,6 @@
 	//       "default": "500",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -32869,11 +34100,12 @@
 }
 
 // Patch: Updates a managed instance group using the information that
-// you specify in the request. This operation is marked as DONE when the
-// group is updated even if the instances in the group have not yet been
-// updated. You must separately verify the status of the individual
-// instances with the listmanagedinstances method. This method supports
-// patch semantics.
+// you specify in the request. The field statefulPolicy is updated using
+// PATCH semantics. This operation is marked as DONE when the group is
+// updated even if the instances in the group have not yet been updated.
+// You must separately verify the status of the individual instances
+// with the listmanagedinstances method. This method supports patch
+// semantics.
 func (r *InstanceGroupManagersService) Patch(project string, zone string, instanceGroupManager string, instancegroupmanager *InstanceGroupManager) *InstanceGroupManagersPatchCall {
 	c := &InstanceGroupManagersPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.project = project
@@ -32914,6 +34146,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -32971,7 +34204,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports patch semantics.",
+	//   "description": "Updates a managed instance group using the information that you specify in the request. The field statefulPolicy is updated using PATCH semantics. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method. This method supports patch semantics.",
 	//   "httpMethod": "PATCH",
 	//   "id": "compute.instanceGroupManagers.patch",
 	//   "parameterOrder": [
@@ -33075,6 +34308,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersrecreateinstancesrequest)
 	if err != nil {
@@ -33235,6 +34469,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize")
@@ -33400,6 +34635,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersresizeadvancedrequest)
 	if err != nil {
@@ -33555,6 +34791,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssetautohealingrequest)
 	if err != nil {
@@ -33712,6 +34949,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssetinstancetemplaterequest)
 	if err != nil {
@@ -33873,6 +35111,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssettargetpoolsrequest)
 	if err != nil {
@@ -34029,6 +35268,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -34147,10 +35387,11 @@
 }
 
 // Update: Updates a managed instance group using the information that
-// you specify in the request. This operation is marked as DONE when the
-// group is updated even if the instances in the group have not yet been
-// updated. You must separately verify the status of the individual
-// instances with the listmanagedinstances method.
+// you specify in the request. The field statefulPolicy is updated using
+// PATCH semantics. This operation is marked as DONE when the group is
+// updated even if the instances in the group have not yet been updated.
+// You must separately verify the status of the individual instances
+// with the listmanagedinstances method.
 func (r *InstanceGroupManagersService) Update(project string, zone string, instanceGroupManager string, instancegroupmanager *InstanceGroupManager) *InstanceGroupManagersUpdateCall {
 	c := &InstanceGroupManagersUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.project = project
@@ -34191,6 +35432,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -34248,7 +35490,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Updates a managed instance group using the information that you specify in the request. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method.",
+	//   "description": "Updates a managed instance group using the information that you specify in the request. The field statefulPolicy is updated using PATCH semantics. This operation is marked as DONE when the group is updated even if the instances in the group have not yet been updated. You must separately verify the status of the individual instances with the listmanagedinstances method.",
 	//   "httpMethod": "PUT",
 	//   "id": "compute.instanceGroupManagers.update",
 	//   "parameterOrder": [
@@ -34348,6 +35590,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupsaddinstancesrequest)
 	if err != nil {
@@ -34576,6 +35819,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34646,7 +35890,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -34757,6 +36000,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}")
@@ -34914,6 +36158,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35064,6 +36309,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroup)
 	if err != nil {
@@ -35286,6 +36532,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35358,7 +36605,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -35541,6 +36787,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupslistinstancesrequest)
 	if err != nil {
@@ -35623,7 +36870,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -35743,6 +36989,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupsremoveinstancesrequest)
 	if err != nil {
@@ -35898,6 +37145,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupssetnamedportsrequest)
 	if err != nil {
@@ -36054,6 +37302,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -36213,6 +37462,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates/{instanceTemplate}")
@@ -36362,6 +37612,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36507,6 +37758,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancetemplate)
 	if err != nil {
@@ -36720,6 +37972,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36790,7 +38043,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -36899,6 +38151,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -37051,6 +38304,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accessconfig)
 	if err != nil {
@@ -37288,6 +38542,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -37358,7 +38613,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -37469,6 +38723,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.attacheddisk)
 	if err != nil {
@@ -37626,6 +38881,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}")
@@ -37777,6 +39033,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/deleteAccessConfig")
@@ -37940,6 +39197,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/detachDisk")
@@ -38107,6 +39365,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -38286,6 +39545,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -38454,6 +39714,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instance)
 	if err != nil {
@@ -38678,6 +39939,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -38750,7 +40012,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -38866,6 +40127,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/reset")
@@ -39017,6 +40279,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete")
@@ -39182,6 +40445,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetlabelsrequest)
 	if err != nil {
@@ -39285,6 +40549,165 @@
 
 }
 
+// method id "compute.instances.setMachineResources":
+
+type InstancesSetMachineResourcesCall struct {
+	s                                   *Service
+	project                             string
+	zone                                string
+	instance                            string
+	instancessetmachineresourcesrequest *InstancesSetMachineResourcesRequest
+	urlParams_                          gensupport.URLParams
+	ctx_                                context.Context
+	header_                             http.Header
+}
+
+// SetMachineResources: Changes the number and/or type of accelerator
+// for a stopped instance to the values specified in the request.
+func (r *InstancesService) SetMachineResources(project string, zone string, instance string, instancessetmachineresourcesrequest *InstancesSetMachineResourcesRequest) *InstancesSetMachineResourcesCall {
+	c := &InstancesSetMachineResourcesCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.project = project
+	c.zone = zone
+	c.instance = instance
+	c.instancessetmachineresourcesrequest = instancessetmachineresourcesrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *InstancesSetMachineResourcesCall) Fields(s ...googleapi.Field) *InstancesSetMachineResourcesCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *InstancesSetMachineResourcesCall) Context(ctx context.Context) *InstancesSetMachineResourcesCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *InstancesSetMachineResourcesCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *InstancesSetMachineResourcesCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetmachineresourcesrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setMachineResources")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"project":  c.project,
+		"zone":     c.zone,
+		"instance": c.instance,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "compute.instances.setMachineResources" call.
+// Exactly one of *Operation or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *Operation.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *InstancesSetMachineResourcesCall) Do(opts ...googleapi.CallOption) (*Operation, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Operation{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Changes the number and/or type of accelerator for a stopped instance to the values specified in the request.",
+	//   "httpMethod": "POST",
+	//   "id": "compute.instances.setMachineResources",
+	//   "parameterOrder": [
+	//     "project",
+	//     "zone",
+	//     "instance"
+	//   ],
+	//   "parameters": {
+	//     "instance": {
+	//       "description": "Name of the instance scoping this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "project": {
+	//       "description": "Project ID for this request.",
+	//       "location": "path",
+	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "zone": {
+	//       "description": "The name of the zone for this request.",
+	//       "location": "path",
+	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{project}/zones/{zone}/instances/{instance}/setMachineResources",
+	//   "request": {
+	//     "$ref": "InstancesSetMachineResourcesRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "Operation"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/compute"
+	//   ]
+	// }
+
+}
+
 // method id "compute.instances.setMachineType":
 
 type InstancesSetMachineTypeCall struct {
@@ -39340,6 +40763,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetmachinetyperequest)
 	if err != nil {
@@ -39499,6 +40923,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata)
 	if err != nil {
@@ -39657,6 +41082,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.scheduling)
 	if err != nil {
@@ -39814,6 +41240,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetserviceaccountrequest)
 	if err != nil {
@@ -39973,6 +41400,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.tags)
 	if err != nil {
@@ -40131,6 +41559,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/start")
@@ -40282,6 +41711,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesstartwithencryptionkeyrequest)
 	if err != nil {
@@ -40444,6 +41874,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/stop")
@@ -40594,6 +42025,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -40761,6 +42193,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40978,6 +42411,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41048,7 +42482,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -41169,6 +42602,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41398,6 +42832,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41470,7 +42905,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -41584,6 +43018,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}")
@@ -41733,6 +43168,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41875,6 +43311,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.network)
 	if err != nil {
@@ -42088,6 +43525,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42158,7 +43596,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -42265,6 +43702,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}/switchToCustomMode")
@@ -42404,6 +43842,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -42559,6 +43998,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42700,6 +44140,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42801,6 +44242,30 @@
 	return c
 }
 
+// Filter sets the optional parameter "filter":
+func (c *ProjectsListXpnHostsCall) Filter(filter string) *ProjectsListXpnHostsCall {
+	c.urlParams_.Set("filter", filter)
+	return c
+}
+
+// MaxResults sets the optional parameter "maxResults":
+func (c *ProjectsListXpnHostsCall) MaxResults(maxResults int64) *ProjectsListXpnHostsCall {
+	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
+	return c
+}
+
+// OrderBy sets the optional parameter "order_by":
+func (c *ProjectsListXpnHostsCall) OrderBy(orderBy string) *ProjectsListXpnHostsCall {
+	c.urlParams_.Set("order_by", orderBy)
+	return c
+}
+
+// PageToken sets the optional parameter "pageToken":
+func (c *ProjectsListXpnHostsCall) PageToken(pageToken string) *ProjectsListXpnHostsCall {
+	c.urlParams_.Set("pageToken", pageToken)
+	return c
+}
+
 // Fields allows partial responses to be retrieved. See
 // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
 // for more information.
@@ -42832,6 +44297,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.projectslistxpnhostsrequest)
 	if err != nil {
@@ -42894,6 +44360,25 @@
 	//     "project"
 	//   ],
 	//   "parameters": {
+	//     "filter": {
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "maxResults": {
+	//       "default": "500",
+	//       "format": "uint32",
+	//       "location": "query",
+	//       "minimum": "0",
+	//       "type": "integer"
+	//     },
+	//     "order_by": {
+	//       "location": "query",
+	//       "type": "string"
+	//     },
+	//     "pageToken": {
+	//       "location": "query",
+	//       "type": "string"
+	//     },
 	//     "project": {
 	//       "description": "Project ID for this request.",
 	//       "location": "path",
@@ -42918,6 +44403,27 @@
 
 }
 
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *ProjectsListXpnHostsCall) Pages(ctx context.Context, f func(*XpnHostList) error) error {
+	c.ctx_ = ctx
+	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.PageToken(x.NextPageToken)
+	}
+}
+
 // method id "compute.projects.moveDisk":
 
 type ProjectsMoveDiskCall struct {
@@ -42968,6 +44474,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.diskmoverequest)
 	if err != nil {
@@ -43104,6 +44611,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancemoverequest)
 	if err != nil {
@@ -43241,6 +44749,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata)
 	if err != nil {
@@ -43380,6 +44889,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.usageexportlocation)
 	if err != nil {
@@ -43520,6 +45030,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers/{autoscaler}")
@@ -43678,6 +45189,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43830,6 +45342,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler)
 	if err != nil {
@@ -44053,6 +45566,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44125,7 +45639,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -44242,6 +45755,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler2)
 	if err != nil {
@@ -44399,6 +45913,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -44563,6 +46078,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler)
 	if err != nil {
@@ -44715,6 +46231,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}")
@@ -44873,6 +46390,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45027,6 +46545,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourcegroupreference)
 	if err != nil {
@@ -45186,6 +46705,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -45409,6 +46929,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45481,7 +47002,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -45602,6 +47122,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -45760,6 +47281,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -45921,6 +47443,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -46086,6 +47609,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersabandoninstancesrequest)
 	if err != nil {
@@ -46240,6 +47764,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}")
@@ -46394,6 +47919,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersdeleteinstancesrequest)
 	if err != nil {
@@ -46559,6 +48085,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46714,6 +48241,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -46936,6 +48464,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47008,7 +48537,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -47149,6 +48677,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances")
@@ -47226,7 +48755,6 @@
 	//       "default": "500",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -47324,6 +48852,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -47485,6 +49014,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersrecreaterequest)
 	if err != nil {
@@ -47646,6 +49176,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize")
@@ -47803,6 +49334,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerssetautohealingrequest)
 	if err != nil {
@@ -47960,6 +49492,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerssettemplaterequest)
 	if err != nil {
@@ -48117,6 +49650,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerssettargetpoolsrequest)
 	if err != nil {
@@ -48273,6 +49807,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -48435,6 +49970,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -48599,6 +50135,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -48825,6 +50362,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -48897,7 +50435,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -49083,6 +50620,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupslistinstancesrequest)
 	if err != nil {
@@ -49166,7 +50704,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -49286,6 +50823,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupssetnamedportsrequest)
 	if err != nil {
@@ -49442,6 +50980,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -49599,6 +51138,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/operations/{operation}")
@@ -49730,6 +51270,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -49959,6 +51500,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -50031,7 +51573,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -50157,6 +51698,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -50375,6 +51917,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -50445,7 +51988,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -50627,6 +52169,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -50697,7 +52240,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -50805,6 +52347,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}")
@@ -50964,6 +52507,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -51127,6 +52671,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -51279,6 +52824,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.router)
 	if err != nil {
@@ -51502,6 +53048,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -51574,7 +53121,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -51692,6 +53238,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2)
 	if err != nil {
@@ -51851,6 +53398,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2)
 	if err != nil {
@@ -52010,6 +53558,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -52169,6 +53718,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2)
 	if err != nil {
@@ -52323,6 +53873,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes/{route}")
@@ -52472,6 +54023,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -52614,6 +54166,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.route)
 	if err != nil {
@@ -52827,6 +54380,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -52897,7 +54451,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -53006,6 +54559,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -53158,6 +54712,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots/{snapshot}")
@@ -53307,6 +54862,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -53525,6 +55081,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -53595,7 +55152,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -53704,6 +55260,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.globalsetlabelsrequest)
 	if err != nil {
@@ -53851,6 +55408,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -53996,6 +55554,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/sslCertificates/{sslCertificate}")
@@ -54144,6 +55703,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -54285,6 +55845,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.sslcertificate)
 	if err != nil {
@@ -54497,6 +56058,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -54567,7 +56129,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -54676,6 +56237,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -54897,6 +56459,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -54967,7 +56530,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -55075,6 +56637,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks/{subnetwork}")
@@ -55225,6 +56788,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetworksexpandipcidrrangerequest)
 	if err != nil {
@@ -55392,6 +56956,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -55555,6 +57120,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -55707,6 +57273,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetwork)
 	if err != nil {
@@ -55930,6 +57497,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -56002,7 +57570,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -56120,6 +57687,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
 	if err != nil {
@@ -56279,6 +57847,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -56434,6 +58003,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies/{targetHttpProxy}")
@@ -56583,6 +58153,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -56725,6 +58296,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpproxy)
 	if err != nil {
@@ -56938,6 +58510,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -57008,7 +58581,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -57117,6 +58689,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapreference)
 	if err != nil {
@@ -57264,6 +58837,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -57409,6 +58983,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpsProxies/{targetHttpsProxy}")
@@ -57557,6 +59132,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -57698,6 +59274,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpsproxy)
 	if err != nil {
@@ -57910,6 +59487,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -57980,7 +59558,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -58088,6 +59665,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpsproxiessetsslcertificatesrequest)
 	if err != nil {
@@ -58234,6 +59812,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapreference)
 	if err != nil {
@@ -58381,6 +59960,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -58603,6 +60183,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -58673,7 +60254,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -58782,6 +60362,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances/{targetInstance}")
@@ -58942,6 +60523,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -59095,6 +60677,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetinstance)
 	if err != nil {
@@ -59319,6 +60902,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -59391,7 +60975,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -59509,6 +61092,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -59668,6 +61252,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsaddhealthcheckrequest)
 	if err != nil {
@@ -59826,6 +61411,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsaddinstancerequest)
 	if err != nil {
@@ -60056,6 +61642,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -60126,7 +61713,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -60235,6 +61821,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}")
@@ -60395,6 +61982,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -60550,6 +62138,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancereference)
 	if err != nil {
@@ -60708,6 +62297,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpool)
 	if err != nil {
@@ -60932,6 +62522,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -61004,7 +62595,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -61122,6 +62712,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremovehealthcheckrequest)
 	if err != nil {
@@ -61280,6 +62871,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremoveinstancerequest)
 	if err != nil {
@@ -61445,6 +63037,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
 	if err != nil {
@@ -61609,6 +63202,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -61763,6 +63357,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}")
@@ -61911,6 +63506,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -62052,6 +63648,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxy)
 	if err != nil {
@@ -62264,6 +63861,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -62334,7 +63932,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -62442,6 +64039,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetbackendservicerequest)
 	if err != nil {
@@ -62588,6 +64186,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetproxyheaderrequest)
 	if err != nil {
@@ -62734,6 +64333,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetsslcertificatesrequest)
 	if err != nil {
@@ -62881,6 +64481,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -63102,6 +64703,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -63172,7 +64774,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -63280,6 +64881,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}")
@@ -63439,6 +65041,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -63591,6 +65194,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetvpngateway)
 	if err != nil {
@@ -63814,6 +65418,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -63886,7 +65491,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -64004,6 +65608,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -64159,6 +65764,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/urlMaps/{urlMap}")
@@ -64308,6 +65914,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -64450,6 +66057,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmap)
 	if err != nil {
@@ -64588,6 +66196,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cacheinvalidationrule)
 	if err != nil {
@@ -64810,6 +66419,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -64880,7 +66490,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -64990,6 +66599,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmap)
 	if err != nil {
@@ -65137,6 +66747,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -65286,6 +66897,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmap)
 	if err != nil {
@@ -65435,6 +67047,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapsvalidaterequest)
 	if err != nil {
@@ -65655,6 +67268,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -65725,7 +67339,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -65833,6 +67446,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/vpnTunnels/{vpnTunnel}")
@@ -65992,6 +67606,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -66144,6 +67759,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.vpntunnel)
 	if err != nil {
@@ -66367,6 +67983,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -66439,7 +68056,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -66557,6 +68173,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -66714,6 +68331,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/operations/{operation}")
@@ -66845,6 +68463,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -67074,6 +68693,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -67146,7 +68766,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -67272,6 +68891,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -67490,6 +69110,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -67560,7 +69181,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
diff --git a/compute/v1/compute-api.json b/compute/v1/compute-api.json
index b95bbcc..e14772a 100644
--- a/compute/v1/compute-api.json
+++ b/compute/v1/compute-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/nfOITDD1b2lniiEWhy64AR2b2c4\"",
+ "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/5AwInpkmvaWqk3FwZwzD5RhJCXo\"",
  "discoveryVersion": "v1",
  "id": "compute:v1",
  "name": "compute",
  "version": "v1",
- "revision": "20170118",
+ "revision": "20170124",
  "title": "Compute Engine API",
  "description": "Creates and runs virtual machines on Google Cloud Platform.",
  "ownerDomain": "google.com",
@@ -282,6 +282,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -302,6 +303,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -596,6 +598,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -616,6 +619,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -1038,6 +1042,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -1058,6 +1063,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -1337,11 +1343,11 @@
    "properties": {
     "id": {
      "type": "string",
-     "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server."
+     "description": "[Output Only] Unique identifier for the resource; defined by the server."
     },
     "items": {
      "type": "array",
-     "description": "[Output Only] A list of persistent disks.",
+     "description": "A list of Disk resources.",
      "items": {
       "$ref": "Disk"
      }
@@ -1353,7 +1359,7 @@
     },
     "nextPageToken": {
      "type": "string",
-     "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results."
+     "description": "[Output Only] A token used to continue a truncated list request."
     },
     "selfLink": {
      "type": "string",
@@ -1520,6 +1526,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -1540,6 +1547,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -1611,6 +1619,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -1631,6 +1640,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -1782,14 +1792,15 @@
    "properties": {
     "IPAddress": {
      "type": "string",
-     "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP; for regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IP from the same scope (global or regional) will be assigned.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule. Only IPv4 is supported."
+     "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP. For regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IP from the same scope (global or regional) will be assigned.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule. Only IPv4 is supported."
     },
     "IPProtocol": {
      "type": "string",
-     "description": "The IP protocol to which this rule applies. Valid options are TCP, UDP, ESP, AH, SCTP or ICMP.\n\nWhen the load balancing scheme is INTERNAL\u003c/code, only TCP and UDP are valid.",
+     "description": "The IP protocol to which this rule applies. Valid options are TCP, UDP, ESP, AH, SCTP or ICMP.\n\nWhen the load balancing scheme is INTERNAL, only TCP and UDP are valid.",
      "enum": [
       "AH",
       "ESP",
+      "ICMP",
       "SCTP",
       "TCP",
       "UDP"
@@ -1799,6 +1810,7 @@
       "",
       "",
       "",
+      "",
       ""
      ]
     },
@@ -1826,7 +1838,7 @@
     },
     "loadBalancingScheme": {
      "type": "string",
-     "description": "This signifies what the ForwardingRule will be used for and can only take the following values: INTERNAL EXTERNAL The value of INTERNAL means that this will be used for Internal Network Load Balancing (TCP, UDP). The value of EXTERNAL means that this will be used for External Load Balancing (HTTP(S) LB, External TCP/UDP LB, SSL Proxy)",
+     "description": "This signifies what the ForwardingRule will be used for and can only take the following values: INTERNAL, EXTERNAL The value of INTERNAL means that this will be used for Internal Network Load Balancing (TCP, UDP). The value of EXTERNAL means that this will be used for External Load Balancing (HTTP(S) LB, External TCP/UDP LB, SSL Proxy)",
      "enum": [
       "EXTERNAL",
       "INTERNAL",
@@ -1970,6 +1982,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -1990,6 +2003,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -3225,6 +3239,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -3245,6 +3260,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -3407,6 +3423,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -3427,6 +3444,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -3732,6 +3750,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -3752,6 +3771,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -4029,6 +4049,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -4049,6 +4070,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -4323,12 +4345,7 @@
     },
     "network": {
      "type": "string",
-     "description": "URL of the network resource for this instance. This is required for creating an instance but optional when creating a firewall rule. If not specified when creating a firewall rule, the default network is used:\n\nglobal/networks/default \n\nIf you specify this property, you can specify the network as a full or partial URL. For example, the following are all valid URLs:  \n- https://www.googleapis.com/compute/v1/projects/project/global/networks/network \n- projects/project/global/networks/network \n- global/networks/default",
-     "annotations": {
-      "required": [
-       "compute.instances.insert"
-      ]
-     }
+     "description": "URL of the network resource for this instance. When creating an instance, if neither the network nor the subnetwork is specified, the default network global/networks/default is used; if the network is not specified but the subnetwork is specified, the network is inferred.\n\nThis field is optional when creating a firewall rule. If not specified when creating a firewall rule, the default network global/networks/default is used.\n\nIf you specify this property, you can specify the network as a full or partial URL. For example, the following are all valid URLs:  \n- https://www.googleapis.com/compute/v1/projects/project/global/networks/network \n- projects/project/global/networks/network \n- global/networks/default"
     },
     "networkIP": {
      "type": "string",
@@ -4521,6 +4538,7 @@
          "NOT_CRITICAL_ERROR",
          "NO_RESULTS_ON_PAGE",
          "REQUIRED_TOS_AGREEMENT",
+         "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
          "RESOURCE_NOT_DELETED",
          "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
          "UNREACHABLE"
@@ -4541,6 +4559,7 @@
          "",
          "",
          "",
+         "",
          ""
         ]
        },
@@ -4668,6 +4687,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -4688,6 +4708,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -4836,6 +4857,7 @@
       "AUTOSCALERS",
       "BACKEND_SERVICES",
       "CPUS",
+      "CPUS_ALL_REGIONS",
       "DISKS_TOTAL_GB",
       "FIREWALLS",
       "FORWARDING_RULES",
@@ -4864,7 +4886,6 @@
       "TARGET_POOLS",
       "TARGET_SSL_PROXIES",
       "TARGET_VPN_GATEWAYS",
-      "TOTAL_CPUS",
       "URL_MAPS",
       "VPN_TUNNELS"
      ],
@@ -5263,7 +5284,7 @@
   "Route": {
    "id": "Route",
    "type": "object",
-   "description": "Represents a Route resource. A route specifies how certain packets should be handled by the network. Routes are associated with instances by tags and the set of routes for a particular instance is called its routing table.\n\nFor each packet leaving a instance, the system searches that instance's routing table for a single best matching route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching routes. The packet is then forwarded as specified by the nextHop field of the winning route - either to another instance destination, a instance gateway or a Google Compute Engine-operated gateway.\n\nPackets that do not match any route in the sending instance's routing table are dropped.",
+   "description": "Represents a Route resource. A route specifies how certain packets should be handled by the network. Routes are associated with instances by tags and the set of routes for a particular instance is called its routing table.\n\nFor each packet leaving a instance, the system searches that instance's routing table for a single best matching route. Routes match packets by destination IP address, preferring smaller or more specific ranges over larger ones. If there is a tie, the system selects the route with the smallest priority value. If there is still a tie, it uses the layer three and four packet headers to select just one of the remaining matching routes. The packet is then forwarded as specified by the nextHop field of the winning route - either to another instance destination, an instance gateway, or a Google Compute Engine-operated gateway.\n\nPackets that do not match any route in the sending instance's routing table are dropped.",
    "properties": {
     "creationTimestamp": {
      "type": "string",
@@ -5380,6 +5401,7 @@
          "NOT_CRITICAL_ERROR",
          "NO_RESULTS_ON_PAGE",
          "REQUIRED_TOS_AGREEMENT",
+         "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
          "RESOURCE_NOT_DELETED",
          "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
          "UNREACHABLE"
@@ -5400,6 +5422,7 @@
          "",
          "",
          "",
+         "",
          ""
         ]
        },
@@ -5795,6 +5818,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -5815,6 +5839,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -6308,6 +6333,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -6328,6 +6354,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -6714,6 +6741,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -6734,6 +6762,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -7004,6 +7033,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -7024,6 +7054,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -7366,6 +7397,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -7386,6 +7418,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -7836,6 +7869,7 @@
         "NOT_CRITICAL_ERROR",
         "NO_RESULTS_ON_PAGE",
         "REQUIRED_TOS_AGREEMENT",
+        "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING",
         "RESOURCE_NOT_DELETED",
         "SINGLE_INSTANCE_PROPERTY_TEMPLATE",
         "UNREACHABLE"
@@ -7856,6 +7890,7 @@
         "",
         "",
         "",
+        "",
         ""
        ]
       },
@@ -7989,7 +8024,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -8158,7 +8192,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -8220,7 +8253,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -8389,7 +8421,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -8537,7 +8568,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -8718,7 +8748,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -8844,7 +8873,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -8936,7 +8964,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -8998,7 +9025,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -9215,7 +9241,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -9416,7 +9441,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -9542,7 +9566,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -9711,7 +9734,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -9912,7 +9934,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10061,7 +10082,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10151,7 +10171,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10265,7 +10284,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10414,7 +10432,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10635,7 +10652,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -10856,7 +10872,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11150,7 +11165,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11246,7 +11260,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11452,7 +11465,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11513,7 +11525,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "order_by": {
@@ -11788,7 +11799,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -11952,7 +11962,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12015,7 +12024,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12259,7 +12267,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12364,7 +12371,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -12737,7 +12743,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13280,7 +13285,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13372,7 +13376,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13529,7 +13532,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -13880,7 +13882,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -14191,7 +14192,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -14539,7 +14539,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -14600,7 +14599,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "order_by": {
@@ -14874,7 +14872,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -14937,7 +14934,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15124,7 +15120,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15220,7 +15215,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15274,7 +15268,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15485,7 +15478,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15775,7 +15767,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -15896,7 +15887,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16045,7 +16035,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16099,7 +16088,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16312,7 +16300,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16469,7 +16456,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16654,7 +16640,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16780,7 +16765,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -16949,7 +16933,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17099,7 +17082,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17313,7 +17295,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17608,7 +17589,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17770,7 +17750,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -17939,7 +17918,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -18132,7 +18110,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -18294,7 +18271,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -18463,7 +18439,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -18605,7 +18580,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -18701,7 +18675,6 @@
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
diff --git a/compute/v1/compute-gen.go b/compute/v1/compute-gen.go
index 3c33ffb..b6db7f2 100644
--- a/compute/v1/compute-gen.go
+++ b/compute/v1/compute-gen.go
@@ -118,9 +118,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Addresses *AddressesService
 
@@ -216,6 +217,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAddressesService(s *Service) *AddressesService {
 	rs := &AddressesService{s: s}
 	return rs
@@ -882,6 +887,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -1420,6 +1426,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -2197,6 +2204,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -2694,23 +2702,19 @@
 
 // DiskList: A list of Disk resources.
 type DiskList struct {
-	// Id: [Output Only] The unique identifier for the resource. This
-	// identifier is defined by the server.
+	// Id: [Output Only] Unique identifier for the resource; defined by the
+	// server.
 	Id string `json:"id,omitempty"`
 
-	// Items: [Output Only] A list of persistent disks.
+	// Items: A list of Disk resources.
 	Items []*Disk `json:"items,omitempty"`
 
 	// Kind: [Output Only] Type of resource. Always compute#diskList for
 	// lists of disks.
 	Kind string `json:"kind,omitempty"`
 
-	// NextPageToken: [Output Only] This token allows you to get the next
-	// page of results for list requests. If the number of results is larger
-	// than maxResults, use the nextPageToken as a value for the query
-	// parameter pageToken in the next list request. Subsequent list
-	// requests will have their own nextPageToken to continue paging through
-	// the results.
+	// NextPageToken: [Output Only] A token used to continue a truncated
+	// list request.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
 	// SelfLink: [Output Only] Server-defined URL for this resource.
@@ -3005,6 +3009,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -3159,6 +3164,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -3431,7 +3437,7 @@
 	// IPAddress: The IP address that this forwarding rule is serving on
 	// behalf of.
 	//
-	// For global forwarding rules, the address must be a global IP; for
+	// For global forwarding rules, the address must be a global IP. For
 	// regional forwarding rules, the address must live in the same region
 	// as the forwarding rule. By default, this field is empty and an
 	// ephemeral IP from the same scope (global or regional) will be
@@ -3448,12 +3454,13 @@
 	// IPProtocol: The IP protocol to which this rule applies. Valid options
 	// are TCP, UDP, ESP, AH, SCTP or ICMP.
 	//
-	// When the load balancing scheme is INTERNAL</code, only TCP and UDP
-	// are valid.
+	// When the load balancing scheme is INTERNAL, only TCP and UDP are
+	// valid.
 	//
 	// Possible values:
 	//   "AH"
 	//   "ESP"
+	//   "ICMP"
 	//   "SCTP"
 	//   "TCP"
 	//   "UDP"
@@ -3483,7 +3490,7 @@
 	Kind string `json:"kind,omitempty"`
 
 	// LoadBalancingScheme: This signifies what the ForwardingRule will be
-	// used for and can only take the following values: INTERNAL EXTERNAL
+	// used for and can only take the following values: INTERNAL, EXTERNAL
 	// The value of INTERNAL means that this will be used for Internal
 	// Network Load Balancing (TCP, UDP). The value of EXTERNAL means that
 	// this will be used for External Load Balancing (HTTP(S) LB, External
@@ -3740,6 +3747,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -5573,6 +5581,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -5912,6 +5921,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -6423,6 +6433,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -6906,6 +6917,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -7366,12 +7378,15 @@
 	// the server. For network devices, these are eth0, eth1, etc.
 	Name string `json:"name,omitempty"`
 
-	// Network: URL of the network resource for this instance. This is
-	// required for creating an instance but optional when creating a
-	// firewall rule. If not specified when creating a firewall rule, the
-	// default network is used:
+	// Network: URL of the network resource for this instance. When creating
+	// an instance, if neither the network nor the subnetwork is specified,
+	// the default network global/networks/default is used; if the network
+	// is not specified but the subnetwork is specified, the network is
+	// inferred.
 	//
-	// global/networks/default
+	// This field is optional when creating a firewall rule. If not
+	// specified when creating a firewall rule, the default network
+	// global/networks/default is used.
 	//
 	// If you specify this property, you can specify the network as a full
 	// or partial URL. For example, the following are all valid URLs:
@@ -7685,6 +7700,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -7912,6 +7928,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -8157,6 +8174,7 @@
 	//   "AUTOSCALERS"
 	//   "BACKEND_SERVICES"
 	//   "CPUS"
+	//   "CPUS_ALL_REGIONS"
 	//   "DISKS_TOTAL_GB"
 	//   "FIREWALLS"
 	//   "FORWARDING_RULES"
@@ -8185,7 +8203,6 @@
 	//   "TARGET_POOLS"
 	//   "TARGET_SSL_PROXIES"
 	//   "TARGET_VPN_GATEWAYS"
-	//   "TOTAL_CPUS"
 	//   "URL_MAPS"
 	//   "VPN_TUNNELS"
 	Metric string `json:"metric,omitempty"`
@@ -8839,8 +8856,8 @@
 // a tie, it uses the layer three and four packet headers to select just
 // one of the remaining matching routes. The packet is then forwarded as
 // specified by the nextHop field of the winning route - either to
-// another instance destination, a instance gateway or a Google Compute
-// Engine-operated gateway.
+// another instance destination, an instance gateway, or a Google
+// Compute Engine-operated gateway.
 //
 // Packets that do not match any route in the sending instance's routing
 // table are dropped.
@@ -8968,6 +8985,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -9598,6 +9616,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -10406,6 +10425,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -11071,6 +11091,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -11596,6 +11617,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -12152,6 +12174,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -12859,6 +12882,7 @@
 	//   "NOT_CRITICAL_ERROR"
 	//   "NO_RESULTS_ON_PAGE"
 	//   "REQUIRED_TOS_AGREEMENT"
+	//   "RESOURCE_IN_USE_BY_OTHER_RESOURCE_WARNING"
 	//   "RESOURCE_NOT_DELETED"
 	//   "SINGLE_INSTANCE_PROPERTY_TEMPLATE"
 	//   "UNREACHABLE"
@@ -13176,6 +13200,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13246,7 +13271,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -13355,6 +13379,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses/{address}")
@@ -13514,6 +13539,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13667,6 +13693,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.address)
 	if err != nil {
@@ -13891,6 +13918,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13963,7 +13991,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -14152,6 +14179,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14222,7 +14250,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -14330,6 +14357,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/autoscalers/{autoscaler}")
@@ -14489,6 +14517,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14641,6 +14670,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler)
 	if err != nil {
@@ -14864,6 +14894,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14936,7 +14967,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -15053,6 +15083,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler2)
 	if err != nil {
@@ -15215,6 +15246,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler)
 	if err != nil {
@@ -15442,6 +15474,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15512,7 +15545,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -15619,6 +15651,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}")
@@ -15768,6 +15801,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15912,6 +15946,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourcegroupreference)
 	if err != nil {
@@ -16060,6 +16095,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -16273,6 +16309,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16343,7 +16380,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -16456,6 +16492,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -16606,6 +16643,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -16827,6 +16865,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16897,7 +16936,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -17018,6 +17056,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17247,6 +17286,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17319,7 +17359,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -17509,6 +17548,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17579,7 +17619,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -17690,6 +17729,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.snapshot)
 	if err != nil {
@@ -17849,6 +17889,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}")
@@ -18008,6 +18049,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18171,6 +18213,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.disk)
 	if err != nil {
@@ -18400,6 +18443,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18472,7 +18516,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -18589,6 +18632,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.disksresizerequest)
 	if err != nil {
@@ -18743,6 +18787,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}")
@@ -18891,6 +18936,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19033,6 +19079,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall)
 	if err != nil {
@@ -19246,6 +19293,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19316,7 +19364,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -19426,6 +19473,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2)
 	if err != nil {
@@ -19574,6 +19622,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2)
 	if err != nil {
@@ -19795,6 +19844,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19865,7 +19915,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -19974,6 +20023,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{forwardingRule}")
@@ -20133,6 +20183,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20286,6 +20337,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.forwardingrule)
 	if err != nil {
@@ -20510,6 +20562,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20582,7 +20635,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -20701,6 +20753,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
 	if err != nil {
@@ -20855,6 +20908,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses/{address}")
@@ -21004,6 +21058,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21146,6 +21201,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.address)
 	if err != nil {
@@ -21358,6 +21414,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21428,7 +21485,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -21535,6 +21591,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{forwardingRule}")
@@ -21684,6 +21741,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21826,6 +21884,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.forwardingrule)
 	if err != nil {
@@ -22039,6 +22098,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22109,7 +22169,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -22219,6 +22278,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
 	if err != nil {
@@ -22440,6 +22500,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22510,7 +22571,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -22617,6 +22677,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}")
@@ -22738,6 +22799,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22956,6 +23018,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23026,7 +23089,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -23132,6 +23194,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/healthChecks/{healthCheck}")
@@ -23280,6 +23343,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23421,6 +23485,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck)
 	if err != nil {
@@ -23633,6 +23698,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23703,7 +23769,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -23813,6 +23878,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck)
 	if err != nil {
@@ -23960,6 +24026,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.healthcheck)
 	if err != nil {
@@ -24105,6 +24172,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}")
@@ -24254,6 +24322,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24396,6 +24465,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck)
 	if err != nil {
@@ -24609,6 +24679,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24679,7 +24750,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -24790,6 +24860,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck)
 	if err != nil {
@@ -24938,6 +25009,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck)
 	if err != nil {
@@ -25082,6 +25154,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpsHealthChecks/{httpsHealthCheck}")
@@ -25230,6 +25303,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25371,6 +25445,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck)
 	if err != nil {
@@ -25583,6 +25658,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25653,7 +25729,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -25763,6 +25838,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck)
 	if err != nil {
@@ -25910,6 +25986,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httpshealthcheck)
 	if err != nil {
@@ -26055,6 +26132,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{image}")
@@ -26197,6 +26275,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.deprecationstatus)
 	if err != nil {
@@ -26354,6 +26433,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26506,6 +26586,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26648,6 +26729,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.image)
 	if err != nil {
@@ -26869,6 +26951,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26939,7 +27022,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -27057,6 +27139,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersabandoninstancesrequest)
 	if err != nil {
@@ -27285,6 +27368,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27356,7 +27440,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -27467,6 +27550,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}")
@@ -27621,6 +27705,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersdeleteinstancesrequest)
 	if err != nil {
@@ -27787,6 +27872,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27942,6 +28028,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -28164,6 +28251,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28236,7 +28324,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -28379,6 +28466,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances")
@@ -28456,7 +28544,6 @@
 	//       "default": "500",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -28555,6 +28642,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersrecreateinstancesrequest)
 	if err != nil {
@@ -28715,6 +28803,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize")
@@ -28872,6 +28961,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssetinstancetemplaterequest)
 	if err != nil {
@@ -29033,6 +29123,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssettargetpoolsrequest)
 	if err != nil {
@@ -29190,6 +29281,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupsaddinstancesrequest)
 	if err != nil {
@@ -29418,6 +29510,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -29488,7 +29581,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -29599,6 +29691,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroups/{instanceGroup}")
@@ -29756,6 +29849,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -29906,6 +30000,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroup)
 	if err != nil {
@@ -30128,6 +30223,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30200,7 +30296,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -30383,6 +30478,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupslistinstancesrequest)
 	if err != nil {
@@ -30465,7 +30561,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -30585,6 +30680,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupsremoveinstancesrequest)
 	if err != nil {
@@ -30740,6 +30836,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupssetnamedportsrequest)
 	if err != nil {
@@ -30896,6 +30993,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates/{instanceTemplate}")
@@ -31045,6 +31143,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31190,6 +31289,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancetemplate)
 	if err != nil {
@@ -31403,6 +31503,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31473,7 +31574,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -31586,6 +31686,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accessconfig)
 	if err != nil {
@@ -31823,6 +31924,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31893,7 +31995,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -32004,6 +32105,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.attacheddisk)
 	if err != nil {
@@ -32161,6 +32263,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}")
@@ -32312,6 +32415,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/deleteAccessConfig")
@@ -32475,6 +32579,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/detachDisk")
@@ -32642,6 +32747,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32821,6 +32927,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32989,6 +33096,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instance)
 	if err != nil {
@@ -33213,6 +33321,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33285,7 +33394,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -33401,6 +33509,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/reset")
@@ -33552,6 +33661,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete")
@@ -33717,6 +33827,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetmachinetyperequest)
 	if err != nil {
@@ -33876,6 +33987,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata)
 	if err != nil {
@@ -34034,6 +34146,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.scheduling)
 	if err != nil {
@@ -34191,6 +34304,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancessetserviceaccountrequest)
 	if err != nil {
@@ -34350,6 +34464,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.tags)
 	if err != nil {
@@ -34508,6 +34623,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/start")
@@ -34659,6 +34775,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesstartwithencryptionkeyrequest)
 	if err != nil {
@@ -34821,6 +34938,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/stop")
@@ -34979,6 +35097,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35196,6 +35315,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35266,7 +35386,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -35387,6 +35506,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35616,6 +35736,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35688,7 +35809,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -35802,6 +35922,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}")
@@ -35951,6 +36072,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36093,6 +36215,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.network)
 	if err != nil {
@@ -36306,6 +36429,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36376,7 +36500,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -36483,6 +36606,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}/switchToCustomMode")
@@ -36629,6 +36753,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36760,6 +36885,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.diskmoverequest)
 	if err != nil {
@@ -36896,6 +37022,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancemoverequest)
 	if err != nil {
@@ -37033,6 +37160,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata)
 	if err != nil {
@@ -37172,6 +37300,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.usageexportlocation)
 	if err != nil {
@@ -37312,6 +37441,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/autoscalers/{autoscaler}")
@@ -37470,6 +37600,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -37622,6 +37753,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler)
 	if err != nil {
@@ -37845,6 +37977,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -37917,7 +38050,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -38034,6 +38166,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler2)
 	if err != nil {
@@ -38196,6 +38329,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoscaler)
 	if err != nil {
@@ -38348,6 +38482,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/backendServices/{backendService}")
@@ -38506,6 +38641,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -38660,6 +38796,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourcegroupreference)
 	if err != nil {
@@ -38819,6 +38956,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -39042,6 +39180,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39114,7 +39253,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -39235,6 +39373,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -39395,6 +39534,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
 	if err != nil {
@@ -39560,6 +39700,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersabandoninstancesrequest)
 	if err != nil {
@@ -39714,6 +39855,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}")
@@ -39868,6 +40010,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersdeleteinstancesrequest)
 	if err != nil {
@@ -40033,6 +40176,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40188,6 +40332,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -40410,6 +40555,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40482,7 +40628,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -40623,6 +40768,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances")
@@ -40700,7 +40846,6 @@
 	//       "default": "500",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -40799,6 +40944,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagersrecreaterequest)
 	if err != nil {
@@ -40960,6 +41106,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize")
@@ -41118,6 +41265,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerssettemplaterequest)
 	if err != nil {
@@ -41275,6 +41423,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupmanagerssettargetpoolsrequest)
 	if err != nil {
@@ -41439,6 +41588,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41665,6 +41815,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41737,7 +41888,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -41923,6 +42073,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupslistinstancesrequest)
 	if err != nil {
@@ -42006,7 +42157,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -42126,6 +42276,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regioninstancegroupssetnamedportsrequest)
 	if err != nil {
@@ -42280,6 +42431,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/operations/{operation}")
@@ -42411,6 +42563,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42640,6 +42793,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42712,7 +42866,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -42838,6 +42991,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43056,6 +43210,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43126,7 +43281,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -43308,6 +43462,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43378,7 +43533,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -43486,6 +43640,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/routers/{router}")
@@ -43645,6 +43800,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43808,6 +43964,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43960,6 +44117,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.router)
 	if err != nil {
@@ -44183,6 +44341,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44255,7 +44414,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -44373,6 +44531,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2)
 	if err != nil {
@@ -44532,6 +44691,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2)
 	if err != nil {
@@ -44691,6 +44851,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.router2)
 	if err != nil {
@@ -44845,6 +45006,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes/{route}")
@@ -44994,6 +45156,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45136,6 +45299,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.route)
 	if err != nil {
@@ -45349,6 +45513,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45419,7 +45584,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -45532,6 +45696,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots/{snapshot}")
@@ -45681,6 +45846,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45899,6 +46065,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45969,7 +46136,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -46075,6 +46241,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/sslCertificates/{sslCertificate}")
@@ -46223,6 +46390,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46364,6 +46532,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.sslcertificate)
 	if err != nil {
@@ -46576,6 +46745,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46646,7 +46816,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -46828,6 +46997,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46898,7 +47068,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -47006,6 +47175,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/subnetworks/{subnetwork}")
@@ -47156,6 +47326,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetworksexpandipcidrrangerequest)
 	if err != nil {
@@ -47323,6 +47494,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47475,6 +47647,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subnetwork)
 	if err != nil {
@@ -47698,6 +47871,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47770,7 +47944,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -47884,6 +48057,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies/{targetHttpProxy}")
@@ -48033,6 +48207,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -48175,6 +48350,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpproxy)
 	if err != nil {
@@ -48388,6 +48564,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -48458,7 +48635,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -48567,6 +48743,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapreference)
 	if err != nil {
@@ -48711,6 +48888,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpsProxies/{targetHttpsProxy}")
@@ -48859,6 +49037,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -49000,6 +49179,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpsproxy)
 	if err != nil {
@@ -49212,6 +49392,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -49282,7 +49463,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -49390,6 +49570,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpsproxiessetsslcertificatesrequest)
 	if err != nil {
@@ -49536,6 +49717,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapreference)
 	if err != nil {
@@ -49757,6 +49939,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -49827,7 +50010,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -49936,6 +50118,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances/{targetInstance}")
@@ -50096,6 +50279,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -50249,6 +50433,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetinstance)
 	if err != nil {
@@ -50473,6 +50658,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -50545,7 +50731,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -50663,6 +50848,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsaddhealthcheckrequest)
 	if err != nil {
@@ -50821,6 +51007,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsaddinstancerequest)
 	if err != nil {
@@ -51051,6 +51238,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -51121,7 +51309,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -51230,6 +51417,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}")
@@ -51390,6 +51578,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -51545,6 +51734,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancereference)
 	if err != nil {
@@ -51703,6 +51893,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpool)
 	if err != nil {
@@ -51927,6 +52118,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -51999,7 +52191,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -52117,6 +52308,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremovehealthcheckrequest)
 	if err != nil {
@@ -52275,6 +52467,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremoveinstancerequest)
 	if err != nil {
@@ -52440,6 +52633,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
 	if err != nil {
@@ -52599,6 +52793,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetSslProxies/{targetSslProxy}")
@@ -52747,6 +52942,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -52888,6 +53084,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxy)
 	if err != nil {
@@ -53100,6 +53297,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -53170,7 +53368,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -53278,6 +53475,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetbackendservicerequest)
 	if err != nil {
@@ -53424,6 +53622,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetproxyheaderrequest)
 	if err != nil {
@@ -53570,6 +53769,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetsslproxiessetsslcertificatesrequest)
 	if err != nil {
@@ -53790,6 +53990,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -53860,7 +54061,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -53968,6 +54168,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}")
@@ -54127,6 +54328,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -54279,6 +54481,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetvpngateway)
 	if err != nil {
@@ -54502,6 +54705,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -54574,7 +54778,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -54688,6 +54891,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/urlMaps/{urlMap}")
@@ -54837,6 +55041,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -54979,6 +55184,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmap)
 	if err != nil {
@@ -55117,6 +55323,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cacheinvalidationrule)
 	if err != nil {
@@ -55339,6 +55546,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -55409,7 +55617,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -55519,6 +55726,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmap)
 	if err != nil {
@@ -55667,6 +55875,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmap)
 	if err != nil {
@@ -55816,6 +56025,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapsvalidaterequest)
 	if err != nil {
@@ -56036,6 +56246,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -56106,7 +56317,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -56214,6 +56424,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/vpnTunnels/{vpnTunnel}")
@@ -56373,6 +56584,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -56525,6 +56737,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.vpntunnel)
 	if err != nil {
@@ -56748,6 +56961,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -56820,7 +57034,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -56936,6 +57149,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/operations/{operation}")
@@ -57067,6 +57281,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -57296,6 +57511,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -57368,7 +57584,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -57494,6 +57709,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -57712,6 +57928,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -57782,7 +57999,6 @@
 	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
diff --git a/consumersurveys/v2/consumersurveys-gen.go b/consumersurveys/v2/consumersurveys-gen.go
index 591b31e..20b987a 100644
--- a/consumersurveys/v2/consumersurveys-gen.go
+++ b/consumersurveys/v2/consumersurveys-gen.go
@@ -67,9 +67,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Mobileapppanels *MobileapppanelsService
 
@@ -85,6 +86,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewMobileapppanelsService(s *Service) *MobileapppanelsService {
 	rs := &MobileapppanelsService{s: s}
 	return rs
@@ -838,6 +843,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -993,6 +999,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1126,6 +1133,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.mobileapppanel)
 	if err != nil {
@@ -1273,6 +1281,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1421,6 +1430,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "surveys/{surveyUrlId}")
@@ -1556,6 +1566,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1684,6 +1695,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.survey)
 	if err != nil {
@@ -1829,6 +1841,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1961,6 +1974,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.surveysstartrequest)
 	if err != nil {
@@ -2092,6 +2106,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "surveys/{resourceId}/stop")
@@ -2218,6 +2233,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.survey)
 	if err != nil {
diff --git a/container/v1/container-gen.go b/container/v1/container-gen.go
index a46475e..c6e0835 100644
--- a/container/v1/container-gen.go
+++ b/container/v1/container-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Zones = NewProjectsZonesService(s)
@@ -1265,6 +1270,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1411,6 +1417,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.createclusterrequest)
 	if err != nil {
@@ -1559,6 +1566,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}")
@@ -1713,6 +1721,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1869,6 +1878,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2009,6 +2019,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.updateclusterrequest)
 	if err != nil {
@@ -2162,6 +2173,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.createnodepoolrequest)
 	if err != nil {
@@ -2315,6 +2327,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}")
@@ -2479,6 +2492,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2644,6 +2658,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2796,6 +2811,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.rollbacknodepoolupgraderequest)
 	if err != nil {
@@ -2959,6 +2975,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setnodepoolmanagementrequest)
 	if err != nil {
@@ -3120,6 +3137,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.canceloperationrequest)
 	if err != nil {
@@ -3282,6 +3300,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3438,6 +3457,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/content/v2/content-api.json b/content/v2/content-api.json
index 7c19e18..89441d4 100644
--- a/content/v2/content-api.json
+++ b/content/v2/content-api.json
@@ -1,12 +1,12 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/MJiuoRsHT46yY3IV3KcnT4EHa4c\"",
+ "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/Q7x7O16Jjj1JyAS5e5qN_sA0jCo\"",
  "discoveryVersion": "v1",
  "id": "content:v2",
  "name": "content",
  "canonicalName": "Shopping Content",
  "version": "v2",
- "revision": "20170111",
+ "revision": "20170207",
  "title": "Content API for Shopping",
  "description": "Manages product items, inventory, and Merchant Center accounts for Google Shopping.",
  "ownerDomain": "google.com",
@@ -565,6 +565,10 @@
      "type": "string",
      "description": "Country for which this issue is reported."
     },
+    "detail": {
+     "type": "string",
+     "description": "A more detailed description of the issue."
+    },
     "displayedValue": {
      "type": "string",
      "description": "Actual value displayed on the landing page."
@@ -584,6 +588,10 @@
      "type": "string",
      "description": "Last time the account was checked for this issue."
     },
+    "location": {
+     "type": "string",
+     "description": "The attribute name that is relevant for the issue."
+    },
     "numItems": {
      "type": "integer",
      "description": "Number of items in the account found to have the said issue.",
diff --git a/content/v2/content-gen.go b/content/v2/content-gen.go
index e9e6d49..510ee5d 100644
--- a/content/v2/content-gen.go
+++ b/content/v2/content-gen.go
@@ -71,9 +71,10 @@
 }
 
 type APIService struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 
@@ -105,6 +106,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *APIService) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *APIService) *AccountsService {
 	rs := &AccountsService{s: s}
 	return rs
@@ -842,6 +847,9 @@
 	// Country: Country for which this issue is reported.
 	Country string `json:"country,omitempty"`
 
+	// Detail: A more detailed description of the issue.
+	Detail string `json:"detail,omitempty"`
+
 	// DisplayedValue: Actual value displayed on the landing page.
 	DisplayedValue string `json:"displayedValue,omitempty"`
 
@@ -854,6 +862,9 @@
 	// LastChecked: Last time the account was checked for this issue.
 	LastChecked string `json:"lastChecked,omitempty"`
 
+	// Location: The attribute name that is relevant for the issue.
+	Location string `json:"location,omitempty"`
+
 	// NumItems: Number of items in the account found to have the said
 	// issue.
 	NumItems int64 `json:"numItems,omitempty"`
@@ -7277,6 +7288,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7397,6 +7409,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountscustombatchrequest)
 	if err != nil {
@@ -7531,6 +7544,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{merchantId}/accounts/{accountId}")
@@ -7657,6 +7671,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7803,6 +7818,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -7966,6 +7982,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8139,6 +8156,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -8299,6 +8317,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -8453,6 +8472,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountshippingcustombatchrequest)
 	if err != nil {
@@ -8594,6 +8614,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8758,6 +8779,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8932,6 +8954,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountshipping)
 	if err != nil {
@@ -9092,6 +9115,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountshipping)
 	if err != nil {
@@ -9238,6 +9262,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountstatusescustombatchrequest)
 	if err != nil {
@@ -9371,6 +9396,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9534,6 +9560,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9701,6 +9728,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accounttaxcustombatchrequest)
 	if err != nil {
@@ -9841,6 +9869,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10004,6 +10033,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10178,6 +10208,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accounttax)
 	if err != nil {
@@ -10338,6 +10369,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accounttax)
 	if err != nil {
@@ -10491,6 +10523,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.datafeedscustombatchrequest)
 	if err != nil {
@@ -10624,6 +10657,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{merchantId}/datafeeds/{datafeedId}")
@@ -10746,6 +10780,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10890,6 +10925,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.datafeed)
 	if err != nil {
@@ -11052,6 +11088,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11224,6 +11261,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.datafeed)
 	if err != nil {
@@ -11380,6 +11418,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.datafeed)
 	if err != nil {
@@ -11524,6 +11563,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.datafeedstatusescustombatchrequest)
 	if err != nil {
@@ -11656,6 +11696,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11817,6 +11858,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11986,6 +12028,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.inventorycustombatchrequest)
 	if err != nil {
@@ -12126,6 +12169,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.inventorysetrequest)
 	if err != nil {
@@ -12284,6 +12328,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ordersacknowledgerequest)
 	if err != nil {
@@ -12428,6 +12473,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{merchantId}/testorders/{orderId}/advance")
@@ -12565,6 +12611,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orderscancelrequest)
 	if err != nil {
@@ -12710,6 +12757,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orderscancellineitemrequest)
 	if err != nil {
@@ -12853,6 +12901,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orderscreatetestorderrequest)
 	if err != nil {
@@ -12987,6 +13036,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orderscustombatchrequest)
 	if err != nil {
@@ -13118,6 +13168,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13267,6 +13318,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13418,6 +13470,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13662,6 +13715,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13886,6 +13940,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ordersrefundrequest)
 	if err != nil {
@@ -14031,6 +14086,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ordersreturnlineitemrequest)
 	if err != nil {
@@ -14176,6 +14232,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ordersshiplineitemsrequest)
 	if err != nil {
@@ -14321,6 +14378,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ordersupdatemerchantorderidrequest)
 	if err != nil {
@@ -14467,6 +14525,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ordersupdateshipmentrequest)
 	if err != nil {
@@ -14616,6 +14675,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.productscustombatchrequest)
 	if err != nil {
@@ -14750,6 +14810,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{merchantId}/products/{productId}")
@@ -14873,6 +14934,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15020,6 +15082,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.product)
 	if err != nil {
@@ -15192,6 +15255,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15358,6 +15422,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.productstatusescustombatchrequest)
 	if err != nil {
@@ -15490,6 +15555,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15662,6 +15728,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15834,6 +15901,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.shippingsettingscustombatchrequest)
 	if err != nil {
@@ -15975,6 +16043,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16123,6 +16192,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16280,6 +16350,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16454,6 +16525,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.shippingsettings)
 	if err != nil {
@@ -16614,6 +16686,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.shippingsettings)
 	if err != nil {
diff --git a/content/v2sandbox/content-gen.go b/content/v2sandbox/content-gen.go
index 5c3ffa2..751a4f4 100644
--- a/content/v2sandbox/content-gen.go
+++ b/content/v2sandbox/content-gen.go
@@ -61,9 +61,10 @@
 }
 
 type APIService struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Orders *OrdersService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *APIService) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewOrdersService(s *APIService) *OrdersService {
 	rs := &OrdersService{s: s}
 	return rs
@@ -2478,6 +2483,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ordersacknowledgerequest)
 	if err != nil {
@@ -2622,6 +2628,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{merchantId}/testorders/{orderId}/advance")
@@ -2759,6 +2766,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orderscancelrequest)
 	if err != nil {
@@ -2904,6 +2912,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orderscancellineitemrequest)
 	if err != nil {
@@ -3047,6 +3056,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orderscreatetestorderrequest)
 	if err != nil {
@@ -3181,6 +3191,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.orderscustombatchrequest)
 	if err != nil {
@@ -3312,6 +3323,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3461,6 +3473,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3612,6 +3625,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3856,6 +3870,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4080,6 +4095,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ordersrefundrequest)
 	if err != nil {
@@ -4225,6 +4241,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ordersreturnlineitemrequest)
 	if err != nil {
@@ -4370,6 +4387,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ordersshiplineitemsrequest)
 	if err != nil {
@@ -4515,6 +4533,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ordersupdatemerchantorderidrequest)
 	if err != nil {
@@ -4661,6 +4680,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ordersupdateshipmentrequest)
 	if err != nil {
diff --git a/customsearch/v1/customsearch-gen.go b/customsearch/v1/customsearch-gen.go
index 8fb29d4..9c75267 100644
--- a/customsearch/v1/customsearch-gen.go
+++ b/customsearch/v1/customsearch-gen.go
@@ -55,9 +55,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Cse *CseService
 }
@@ -69,6 +70,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewCseService(s *Service) *CseService {
 	rs := &CseService{s: s}
 	return rs
@@ -971,6 +976,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/dataflow/v1b3/dataflow-api.json b/dataflow/v1b3/dataflow-api.json
index 9118492..f085686 100644
--- a/dataflow/v1b3/dataflow-api.json
+++ b/dataflow/v1b3/dataflow-api.json
@@ -1,3803 +1,3995 @@
 {
- "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/8IKdD_GkxmHITZPPBvAy8YZADEQ\"",
- "discoveryVersion": "v1",
- "id": "dataflow:v1b3",
- "name": "dataflow",
- "version": "v1b3",
- "revision": "20161004",
- "title": "Google Dataflow API",
- "description": "Manages Google Cloud Dataflow projects on Google Cloud Platform.",
- "ownerDomain": "google.com",
- "ownerName": "Google",
- "icons": {
-  "x16": "http://www.google.com/images/icons/product/search-16.gif",
-  "x32": "http://www.google.com/images/icons/product/search-32.gif"
- },
- "documentationLink": "https://cloud.google.com/dataflow",
- "protocol": "rest",
- "baseUrl": "https://dataflow.googleapis.com/",
- "basePath": "",
- "rootUrl": "https://dataflow.googleapis.com/",
- "servicePath": "",
- "batchPath": "batch",
- "parameters": {
-  "access_token": {
-   "type": "string",
-   "description": "OAuth access token.",
-   "location": "query"
-  },
-  "alt": {
-   "type": "string",
-   "description": "Data format for response.",
-   "default": "json",
-   "enumDescriptions": [
-    "Responses with Content-Type of application/json",
-    "Media download with context-dependent Content-Type",
-    "Responses with Content-Type of application/x-protobuf"
-   ],
-   "location": "query"
-  },
-  "bearer_token": {
-   "type": "string",
-   "description": "OAuth bearer token.",
-   "location": "query"
-  },
-  "callback": {
-   "type": "string",
-   "description": "JSONP",
-   "location": "query"
-  },
-  "fields": {
-   "type": "string",
-   "description": "Selector specifying which fields to include in a partial response.",
-   "location": "query"
-  },
-  "key": {
-   "type": "string",
-   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-   "location": "query"
-  },
-  "oauth_token": {
-   "type": "string",
-   "description": "OAuth 2.0 token for the current user.",
-   "location": "query"
-  },
-  "pp": {
-   "type": "boolean",
-   "description": "Pretty-print response.",
-   "default": "true",
-   "location": "query"
-  },
-  "prettyPrint": {
-   "type": "boolean",
-   "description": "Returns response with indentations and line breaks.",
-   "default": "true",
-   "location": "query"
-  },
-  "quotaUser": {
-   "type": "string",
-   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-   "location": "query"
-  },
-  "upload_protocol": {
-   "type": "string",
-   "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-   "location": "query"
-  },
-  "uploadType": {
-   "type": "string",
-   "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-   "location": "query"
-  },
-  "$.xgafv": {
-   "type": "string",
-   "description": "V1 error format.",
-   "enumDescriptions": [
-    "v1 error format",
-    "v2 error format"
-   ],
-   "location": "query"
-  }
- },
- "auth": {
-  "oauth2": {
-   "scopes": {
-    "https://www.googleapis.com/auth/cloud-platform": {
-     "description": "View and manage your data across Google Cloud Platform services"
-    },
-    "https://www.googleapis.com/auth/userinfo.email": {
-     "description": "View your email address"
-    }
-   }
-  }
- },
- "schemas": {
-  "GetDebugConfigRequest": {
-   "id": "GetDebugConfigRequest",
-   "type": "object",
-   "description": "Request to get updated debug configuration for component.",
-   "properties": {
-    "workerId": {
-     "type": "string",
-     "description": "The worker id, i.e., VM hostname."
-    },
-    "componentId": {
-     "type": "string",
-     "description": "The internal component id for which debug configuration is requested."
-    }
-   }
-  },
-  "GetDebugConfigResponse": {
-   "id": "GetDebugConfigResponse",
-   "type": "object",
-   "description": "Response to a get debug configuration request.",
-   "properties": {
-    "config": {
-     "type": "string",
-     "description": "The encoded debug configuration for the requested component."
-    }
-   }
-  },
-  "SendDebugCaptureRequest": {
-   "id": "SendDebugCaptureRequest",
-   "type": "object",
-   "description": "Request to send encoded debug information.",
-   "properties": {
-    "workerId": {
-     "type": "string",
-     "description": "The worker id, i.e., VM hostname."
-    },
-    "componentId": {
-     "type": "string",
-     "description": "The internal component id for which debug information is sent."
-    },
-    "data": {
-     "type": "string",
-     "description": "The encoded debug information."
-    }
-   }
-  },
-  "SendDebugCaptureResponse": {
-   "id": "SendDebugCaptureResponse",
-   "type": "object",
-   "description": "Response to a send capture request. nothing"
-  },
-  "Job": {
-   "id": "Job",
-   "type": "object",
-   "description": "Defines a job to be run by the Cloud Dataflow service.",
-   "properties": {
-    "id": {
-     "type": "string",
-     "description": "The unique ID of this job. This field is set by the Cloud Dataflow service when the Job is created, and is immutable for the life of the job."
-    },
-    "projectId": {
-     "type": "string",
-     "description": "The ID of the Cloud Platform project that the job belongs to."
-    },
-    "name": {
-     "type": "string",
-     "description": "The user-specified Cloud Dataflow job name. Only one Job with a given name may exist in a project at any given time. If a caller attempts to create a Job with the same name as an already-existing Job, the attempt returns the existing Job. The name must match the regular expression `[a-z]([-a-z0-9]{0,38}[a-z0-9])?`"
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of Cloud Dataflow job.",
-     "enum": [
-      "JOB_TYPE_UNKNOWN",
-      "JOB_TYPE_BATCH",
-      "JOB_TYPE_STREAMING"
-     ]
-    },
-    "environment": {
-     "$ref": "Environment",
-     "description": "The environment for the job."
-    },
-    "steps": {
-     "type": "array",
-     "description": "The top-level steps that constitute the entire job.",
-     "items": {
-      "$ref": "Step"
-     }
-    },
-    "currentState": {
-     "type": "string",
-     "description": "The current state of the job. Jobs are created in the `JOB_STATE_STOPPED` state unless otherwise specified. A job in the `JOB_STATE_RUNNING` state may asynchronously enter a terminal state. After a job has reached a terminal state, no further state updates may be made. This field may be mutated by the Cloud Dataflow service; callers cannot mutate it.",
-     "enum": [
-      "JOB_STATE_UNKNOWN",
-      "JOB_STATE_STOPPED",
-      "JOB_STATE_RUNNING",
-      "JOB_STATE_DONE",
-      "JOB_STATE_FAILED",
-      "JOB_STATE_CANCELLED",
-      "JOB_STATE_UPDATED",
-      "JOB_STATE_DRAINING",
-      "JOB_STATE_DRAINED"
-     ]
-    },
-    "currentStateTime": {
-     "type": "string",
-     "description": "The timestamp associated with the current state."
-    },
-    "requestedState": {
-     "type": "string",
-     "description": "The job's requested state. `UpdateJob` may be used to switch between the `JOB_STATE_STOPPED` and `JOB_STATE_RUNNING` states, by setting requested_state. `UpdateJob` may also be used to directly set a job's requested state to `JOB_STATE_CANCELLED` or `JOB_STATE_DONE`, irrevocably terminating the job if it has not already reached a terminal state.",
-     "enum": [
-      "JOB_STATE_UNKNOWN",
-      "JOB_STATE_STOPPED",
-      "JOB_STATE_RUNNING",
-      "JOB_STATE_DONE",
-      "JOB_STATE_FAILED",
-      "JOB_STATE_CANCELLED",
-      "JOB_STATE_UPDATED",
-      "JOB_STATE_DRAINING",
-      "JOB_STATE_DRAINED"
-     ]
-    },
-    "executionInfo": {
-     "$ref": "JobExecutionInfo",
-     "description": "Information about how the Cloud Dataflow service will run the job."
-    },
-    "createTime": {
-     "type": "string",
-     "description": "The timestamp when the job was initially created. Immutable and set by the Cloud Dataflow service."
-    },
-    "replaceJobId": {
-     "type": "string",
-     "description": "If this job is an update of an existing job, this field is the job ID of the job it replaced. When sending a `CreateJobRequest`, you can update a job by specifying it here. The job named here is stopped, and its intermediate state is transferred to this job."
-    },
-    "transformNameMapping": {
-     "type": "object",
-     "description": "The map of transform name prefixes of the job to be replaced to the corresponding name prefixes of the new job.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "clientRequestId": {
-     "type": "string",
-     "description": "The client's unique identifier of the job, re-used across retried attempts. If this field is set, the service will ensure its uniqueness. The request to create a job will fail if the service has knowledge of a previously submitted job with the same client's ID and job name. The caller may use this field to ensure idempotence of job creation across retried attempts to create a job. By default, the field is empty and, in that case, the service ignores it."
-    },
-    "replacedByJobId": {
-     "type": "string",
-     "description": "If another job is an update of this job (and thus, this job is in `JOB_STATE_UPDATED`), this field contains the ID of that job."
-    },
-    "tempFiles": {
-     "type": "array",
-     "description": "A set of files the system should be aware of that are used for temporary storage. These temporary files will be removed on job completion. No duplicates are allowed. No file patterns are supported. The supported files are: Google Cloud Storage: storage.googleapis.com/{bucket}/{object} bucket.storage.googleapis.com/{object}",
-     "items": {
-      "type": "string"
-     }
-    },
-    "labels": {
-     "type": "object",
-     "description": "User-defined labels for this job. The labels map can contain no more than 64 entries. Entries of the labels map are UTF8 strings that comply with the following restrictions: * Keys must conform to regexp: \\p{Ll}\\p{Lo}{0,62} * Values must conform to regexp: [\\p{Ll}\\p{Lo}\\p{N}_-]{0,63} * Both keys and values are additionally constrained to be \u003c= 128 bytes in size.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "location": {
-     "type": "string",
-     "description": "The location that contains this job."
-    }
-   }
-  },
-  "Environment": {
-   "id": "Environment",
-   "type": "object",
-   "description": "Describes the environment in which a Dataflow Job runs.",
-   "properties": {
-    "tempStoragePrefix": {
-     "type": "string",
-     "description": "The prefix of the resources the system should use for temporary storage. The system will append the suffix \"/temp-{JOBNAME} to this resource prefix, where {JOBNAME} is the value of the job_name field. The resulting bucket and object prefix is used as the prefix of the resources used to store temporary data needed during the job execution. NOTE: This will override the value in taskrunner_settings. The supported resource type is: Google Cloud Storage: storage.googleapis.com/{bucket}/{object} bucket.storage.googleapis.com/{object}"
-    },
-    "clusterManagerApiService": {
-     "type": "string",
-     "description": "The type of cluster manager API to use. If unknown or unspecified, the service will attempt to choose a reasonable default. This should be in the form of the API service name, e.g. \"compute.googleapis.com\"."
-    },
-    "experiments": {
-     "type": "array",
-     "description": "The list of experiments to enable.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "workerPools": {
-     "type": "array",
-     "description": "The worker pools. At least one \"harness\" worker pool must be specified in order for the job to have workers.",
-     "items": {
-      "$ref": "WorkerPool"
-     }
-    },
-    "userAgent": {
-     "type": "object",
-     "description": "A description of the process that generated the request.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "version": {
-     "type": "object",
-     "description": "A structure describing which components and their versions of the service are required in order to run the job.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "dataset": {
-     "type": "string",
-     "description": "The dataset for the current project where various workflow related tables are stored. The supported resource type is: Google BigQuery: bigquery.googleapis.com/{dataset}"
-    },
-    "sdkPipelineOptions": {
-     "type": "object",
-     "description": "The Cloud Dataflow SDK pipeline options specified by the user. These options are passed through the service and are used to recreate the SDK pipeline options on the worker in a language agnostic and platform independent way.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "internalExperiments": {
-     "type": "object",
-     "description": "Experimental settings.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object. Contains field @type with type URL."
-     }
-    },
-    "serviceAccountEmail": {
-     "type": "string",
-     "description": "Identity to run virtual machines as. Defaults to the default account."
-    }
-   }
-  },
-  "WorkerPool": {
-   "id": "WorkerPool",
-   "type": "object",
-   "description": "Describes one particular pool of Cloud Dataflow workers to be instantiated by the Cloud Dataflow service in order to perform the computations required by a job. Note that a workflow job may use multiple pools, in order to match the various computational requirements of the various stages of the job.",
-   "properties": {
-    "kind": {
-     "type": "string",
-     "description": "The kind of the worker pool; currently only `harness` and `shuffle` are supported."
-    },
-    "numWorkers": {
-     "type": "integer",
-     "description": "Number of Google Compute Engine workers in this pool needed to execute the job. If zero or unspecified, the service will attempt to choose a reasonable default.",
-     "format": "int32"
-    },
-    "packages": {
-     "type": "array",
-     "description": "Packages to be installed on workers.",
-     "items": {
-      "$ref": "Package"
-     }
-    },
-    "defaultPackageSet": {
-     "type": "string",
-     "description": "The default package set to install. This allows the service to select a default set of packages which are useful to worker harnesses written in a particular language.",
-     "enum": [
-      "DEFAULT_PACKAGE_SET_UNKNOWN",
-      "DEFAULT_PACKAGE_SET_NONE",
-      "DEFAULT_PACKAGE_SET_JAVA",
-      "DEFAULT_PACKAGE_SET_PYTHON"
-     ]
-    },
-    "machineType": {
-     "type": "string",
-     "description": "Machine type (e.g. \"n1-standard-1\"). If empty or unspecified, the service will attempt to choose a reasonable default."
-    },
-    "teardownPolicy": {
-     "type": "string",
-     "description": "Sets the policy for determining when to turndown worker pool. Allowed values are: `TEARDOWN_ALWAYS`, `TEARDOWN_ON_SUCCESS`, and `TEARDOWN_NEVER`. `TEARDOWN_ALWAYS` means workers are always torn down regardless of whether the job succeeds. `TEARDOWN_ON_SUCCESS` means workers are torn down if the job succeeds. `TEARDOWN_NEVER` means the workers are never torn down. If the workers are not torn down by the service, they will continue to run and use Google Compute Engine VM resources in the user's project until they are explicitly terminated by the user. Because of this, Google recommends using the `TEARDOWN_ALWAYS` policy except for small, manually supervised test jobs. If unknown or unspecified, the service will attempt to choose a reasonable default.",
-     "enum": [
-      "TEARDOWN_POLICY_UNKNOWN",
-      "TEARDOWN_ALWAYS",
-      "TEARDOWN_ON_SUCCESS",
-      "TEARDOWN_NEVER"
-     ]
-    },
-    "diskSizeGb": {
-     "type": "integer",
-     "description": "Size of root disk for VMs, in GB. If zero or unspecified, the service will attempt to choose a reasonable default.",
-     "format": "int32"
-    },
-    "diskType": {
-     "type": "string",
-     "description": "Type of root disk for VMs. If empty or unspecified, the service will attempt to choose a reasonable default."
-    },
-    "diskSourceImage": {
-     "type": "string",
-     "description": "Fully qualified source image for disks."
-    },
-    "zone": {
-     "type": "string",
-     "description": "Zone to run the worker pools in. If empty or unspecified, the service will attempt to choose a reasonable default."
-    },
-    "taskrunnerSettings": {
-     "$ref": "TaskRunnerSettings",
-     "description": "Settings passed through to Google Compute Engine workers when using the standard Dataflow task runner. Users should ignore this field."
-    },
-    "onHostMaintenance": {
-     "type": "string",
-     "description": "The action to take on host maintenance, as defined by the Google Compute Engine API."
-    },
-    "dataDisks": {
-     "type": "array",
-     "description": "Data disks that are used by a VM in this workflow.",
-     "items": {
-      "$ref": "Disk"
-     }
-    },
-    "metadata": {
-     "type": "object",
-     "description": "Metadata to set on the Google Compute Engine VMs.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "autoscalingSettings": {
-     "$ref": "AutoscalingSettings",
-     "description": "Settings for autoscaling of this WorkerPool."
-    },
-    "poolArgs": {
-     "type": "object",
-     "description": "Extra arguments for this worker pool.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object. Contains field @type with type URL."
-     }
-    },
-    "network": {
-     "type": "string",
-     "description": "Network to which VMs will be assigned. If empty or unspecified, the service will use the network \"default\"."
-    },
-    "subnetwork": {
-     "type": "string",
-     "description": "Subnetwork to which VMs will be assigned, if desired. Expected to be of the form \"regions/REGION/subnetworks/SUBNETWORK\"."
-    },
-    "workerHarnessContainerImage": {
-     "type": "string",
-     "description": "Required. Docker container image that executes the Cloud Dataflow worker harness, residing in Google Container Registry."
-    },
-    "numThreadsPerWorker": {
-     "type": "integer",
-     "description": "The number of threads per worker harness. If empty or unspecified, the service will choose a number of threads (according to the number of cores on the selected machine type for batch, or 1 by convention for streaming).",
-     "format": "int32"
-    },
-    "ipConfiguration": {
-     "type": "string",
-     "description": "Configuration for VM IPs.",
-     "enum": [
-      "WORKER_IP_UNSPECIFIED",
-      "WORKER_IP_PUBLIC",
-      "WORKER_IP_PRIVATE"
-     ]
-    }
-   }
-  },
-  "Package": {
-   "id": "Package",
-   "type": "object",
-   "description": "The packages that must be installed in order for a worker to run the steps of the Cloud Dataflow job that will be assigned to its worker pool. This is the mechanism by which the Cloud Dataflow SDK causes code to be loaded onto the workers. For example, the Cloud Dataflow Java SDK might use this to install jars containing the user's code and all of the various dependencies (libraries, data files, etc.) required in order for that code to run.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "The name of the package."
-    },
-    "location": {
-     "type": "string",
-     "description": "The resource to read the package from. The supported resource type is: Google Cloud Storage: storage.googleapis.com/{bucket} bucket.storage.googleapis.com/"
-    }
-   }
-  },
-  "TaskRunnerSettings": {
-   "id": "TaskRunnerSettings",
-   "type": "object",
-   "description": "Taskrunner configuration settings.",
-   "properties": {
-    "taskUser": {
-     "type": "string",
-     "description": "The UNIX user ID on the worker VM to use for tasks launched by taskrunner; e.g. \"root\"."
-    },
-    "taskGroup": {
-     "type": "string",
-     "description": "The UNIX group ID on the worker VM to use for tasks launched by taskrunner; e.g. \"wheel\"."
-    },
-    "oauthScopes": {
-     "type": "array",
-     "description": "The OAuth2 scopes to be requested by the taskrunner in order to access the Cloud Dataflow API.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "baseUrl": {
-     "type": "string",
-     "description": "The base URL for the taskrunner to use when accessing Google Cloud APIs. When workers access Google Cloud APIs, they logically do so via relative URLs. If this field is specified, it supplies the base URL to use for resolving these relative URLs. The normative algorithm used is defined by RFC 1808, \"Relative Uniform Resource Locators\". If not specified, the default value is \"http://www.googleapis.com/\""
-    },
-    "dataflowApiVersion": {
-     "type": "string",
-     "description": "The API version of endpoint, e.g. \"v1b3\""
-    },
-    "parallelWorkerSettings": {
-     "$ref": "WorkerSettings",
-     "description": "The settings to pass to the parallel worker harness."
-    },
-    "baseTaskDir": {
-     "type": "string",
-     "description": "The location on the worker for task-specific subdirectories."
-    },
-    "continueOnException": {
-     "type": "boolean",
-     "description": "Whether to continue taskrunner if an exception is hit."
-    },
-    "logToSerialconsole": {
-     "type": "boolean",
-     "description": "Whether to send taskrunner log info to Google Compute Engine VM serial console."
-    },
-    "alsologtostderr": {
-     "type": "boolean",
-     "description": "Whether to also send taskrunner log info to stderr."
-    },
-    "logUploadLocation": {
-     "type": "string",
-     "description": "Indicates where to put logs. If this is not specified, the logs will not be uploaded. The supported resource type is: Google Cloud Storage: storage.googleapis.com/{bucket}/{object} bucket.storage.googleapis.com/{object}"
-    },
-    "logDir": {
-     "type": "string",
-     "description": "The directory on the VM to store logs."
-    },
-    "tempStoragePrefix": {
-     "type": "string",
-     "description": "The prefix of the resources the taskrunner should use for temporary storage. The supported resource type is: Google Cloud Storage: storage.googleapis.com/{bucket}/{object} bucket.storage.googleapis.com/{object}"
-    },
-    "harnessCommand": {
-     "type": "string",
-     "description": "The command to launch the worker harness."
-    },
-    "workflowFileName": {
-     "type": "string",
-     "description": "The file to store the workflow in."
-    },
-    "commandlinesFileName": {
-     "type": "string",
-     "description": "The file to store preprocessing commands in."
-    },
-    "vmId": {
-     "type": "string",
-     "description": "The ID string of the VM."
-    },
-    "languageHint": {
-     "type": "string",
-     "description": "The suggested backend language."
-    },
-    "streamingWorkerMainClass": {
-     "type": "string",
-     "description": "The streaming worker main class name."
-    }
-   }
-  },
-  "WorkerSettings": {
-   "id": "WorkerSettings",
-   "type": "object",
-   "description": "Provides data to pass through to the worker harness.",
-   "properties": {
-    "baseUrl": {
-     "type": "string",
-     "description": "The base URL for accessing Google Cloud APIs. When workers access Google Cloud APIs, they logically do so via relative URLs. If this field is specified, it supplies the base URL to use for resolving these relative URLs. The normative algorithm used is defined by RFC 1808, \"Relative Uniform Resource Locators\". If not specified, the default value is \"http://www.googleapis.com/\""
-    },
-    "reportingEnabled": {
-     "type": "boolean",
-     "description": "Whether to send work progress updates to the service."
-    },
-    "servicePath": {
-     "type": "string",
-     "description": "The Cloud Dataflow service path relative to the root URL, for example, \"dataflow/v1b3/projects\"."
-    },
-    "shuffleServicePath": {
-     "type": "string",
-     "description": "The Shuffle service path relative to the root URL, for example, \"shuffle/v1beta1\"."
-    },
-    "workerId": {
-     "type": "string",
-     "description": "The ID of the worker running this pipeline."
-    },
-    "tempStoragePrefix": {
-     "type": "string",
-     "description": "The prefix of the resources the system should use for temporary storage. The supported resource type is: Google Cloud Storage: storage.googleapis.com/{bucket}/{object} bucket.storage.googleapis.com/{object}"
-    }
-   }
-  },
-  "Disk": {
-   "id": "Disk",
-   "type": "object",
-   "description": "Describes the data disk used by a workflow job.",
-   "properties": {
-    "sizeGb": {
-     "type": "integer",
-     "description": "Size of disk in GB. If zero or unspecified, the service will attempt to choose a reasonable default.",
-     "format": "int32"
-    },
-    "diskType": {
-     "type": "string",
-     "description": "Disk storage type, as defined by Google Compute Engine. This must be a disk type appropriate to the project and zone in which the workers will run. If unknown or unspecified, the service will attempt to choose a reasonable default. For example, the standard persistent disk type is a resource name typically ending in \"pd-standard\". If SSD persistent disks are available, the resource name typically ends with \"pd-ssd\". The actual valid values are defined the Google Compute Engine API, not by the Cloud Dataflow API; consult the Google Compute Engine documentation for more information about determining the set of available disk types for a particular project and zone. Google Compute Engine Disk types are local to a particular project in a particular zone, and so the resource name will typically look something like this: compute.googleapis.com/projects/project-id/zones/zone/diskTypes/pd-standard"
-    },
-    "mountPoint": {
-     "type": "string",
-     "description": "Directory in a VM where disk is mounted."
-    }
-   }
-  },
-  "AutoscalingSettings": {
-   "id": "AutoscalingSettings",
-   "type": "object",
-   "description": "Settings for WorkerPool autoscaling.",
-   "properties": {
-    "algorithm": {
-     "type": "string",
-     "description": "The algorithm to use for autoscaling.",
-     "enum": [
-      "AUTOSCALING_ALGORITHM_UNKNOWN",
-      "AUTOSCALING_ALGORITHM_NONE",
-      "AUTOSCALING_ALGORITHM_BASIC"
-     ]
-    },
-    "maxNumWorkers": {
-     "type": "integer",
-     "description": "The maximum number of workers to cap scaling at.",
-     "format": "int32"
-    }
-   }
-  },
-  "Step": {
-   "id": "Step",
-   "type": "object",
-   "description": "Defines a particular step within a Cloud Dataflow job. A job consists of multiple steps, each of which performs some specific operation as part of the overall job. Data is typically passed from one step to another as part of the job. Here's an example of a sequence of steps which together implement a Map-Reduce job: * Read a collection of data from some source, parsing the collection's elements. * Validate the elements. * Apply a user-defined function to map each element to some value and extract an element-specific key value. * Group elements with the same key into a single element with that key, transforming a multiply-keyed collection into a uniquely-keyed collection. * Write the elements out to some data sink. Note that the Cloud Dataflow service may be used to run many different types of jobs, not just Map-Reduce.",
-   "properties": {
-    "kind": {
-     "type": "string",
-     "description": "The kind of step in the Cloud Dataflow job."
-    },
-    "name": {
-     "type": "string",
-     "description": "The name that identifies the step. This must be unique for each step with respect to all other steps in the Cloud Dataflow job."
-    },
-    "properties": {
-     "type": "object",
-     "description": "Named properties associated with the step. Each kind of predefined step has its own required set of properties.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    }
-   }
-  },
-  "JobExecutionInfo": {
-   "id": "JobExecutionInfo",
-   "type": "object",
-   "description": "Additional information about how a Cloud Dataflow job will be executed that isn't contained in the submitted job.",
-   "properties": {
-    "stages": {
-     "type": "object",
-     "description": "A mapping from each stage to the information about that stage.",
-     "additionalProperties": {
-      "$ref": "JobExecutionStageInfo"
-     }
-    }
-   }
-  },
-  "JobExecutionStageInfo": {
-   "id": "JobExecutionStageInfo",
-   "type": "object",
-   "description": "Contains information about how a particular google.dataflow.v1beta3.Step will be executed.",
-   "properties": {
-    "stepName": {
-     "type": "array",
-     "description": "The steps associated with the execution stage. Note that stages may have several steps, and that a given step might be run by more than one stage.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "ListJobsResponse": {
-   "id": "ListJobsResponse",
-   "type": "object",
-   "description": "Response to a request to list Cloud Dataflow jobs. This may be a partial response, depending on the page size in the ListJobsRequest.",
-   "properties": {
-    "jobs": {
-     "type": "array",
-     "description": "A subset of the requested job information.",
-     "items": {
-      "$ref": "Job"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "Set if there may be more results than fit in this response."
-    },
-    "failedLocation": {
-     "type": "array",
-     "description": "Zero or more messages describing locations that failed to respond.",
-     "items": {
-      "$ref": "FailedLocation"
-     }
-    }
-   }
-  },
-  "FailedLocation": {
-   "id": "FailedLocation",
-   "type": "object",
-   "description": "Indicates which location failed to respond to a request for data.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "The name of the failed location."
-    }
-   }
-  },
-  "ListJobMessagesResponse": {
-   "id": "ListJobMessagesResponse",
-   "type": "object",
-   "description": "Response to a request to list job messages.",
-   "properties": {
-    "jobMessages": {
-     "type": "array",
-     "description": "Messages in ascending timestamp order.",
-     "items": {
-      "$ref": "JobMessage"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The token to obtain the next page of results if there are more."
-    }
-   }
-  },
-  "JobMessage": {
-   "id": "JobMessage",
-   "type": "object",
-   "description": "A particular message pertaining to a Dataflow job.",
-   "properties": {
-    "id": {
-     "type": "string",
-     "description": "Identifies the message. This is automatically generated by the service; the caller should treat it as an opaque string."
-    },
-    "time": {
-     "type": "string",
-     "description": "The timestamp of the message."
-    },
-    "messageText": {
-     "type": "string",
-     "description": "The text of the message."
-    },
-    "messageImportance": {
-     "type": "string",
-     "description": "Importance level of the message.",
-     "enum": [
-      "JOB_MESSAGE_IMPORTANCE_UNKNOWN",
-      "JOB_MESSAGE_DEBUG",
-      "JOB_MESSAGE_DETAILED",
-      "JOB_MESSAGE_BASIC",
-      "JOB_MESSAGE_WARNING",
-      "JOB_MESSAGE_ERROR"
-     ]
-    }
-   }
-  },
-  "JobMetrics": {
-   "id": "JobMetrics",
-   "type": "object",
-   "description": "JobMetrics contains a collection of metrics descibing the detailed progress of a Dataflow job. Metrics correspond to user-defined and system-defined metrics in the job. This resource captures only the most recent values of each metric; time-series data can be queried for them (under the same metric names) from Cloud Monitoring.",
-   "properties": {
-    "metricTime": {
-     "type": "string",
-     "description": "Timestamp as of which metric values are current."
-    },
-    "metrics": {
-     "type": "array",
-     "description": "All metrics for this job.",
-     "items": {
-      "$ref": "MetricUpdate"
-     }
-    }
-   }
-  },
-  "MetricUpdate": {
-   "id": "MetricUpdate",
-   "type": "object",
-   "description": "Describes the state of a metric.",
-   "properties": {
-    "name": {
-     "$ref": "MetricStructuredName",
-     "description": "Name of the metric."
-    },
-    "kind": {
-     "type": "string",
-     "description": "Metric aggregation kind. The possible metric aggregation kinds are \"Sum\", \"Max\", \"Min\", \"Mean\", \"Set\", \"And\", and \"Or\". The specified aggregation kind is case-insensitive. If omitted, this is not an aggregated value but instead a single metric sample value."
-    },
-    "cumulative": {
-     "type": "boolean",
-     "description": "True if this metric is reported as the total cumulative aggregate value accumulated since the worker started working on this WorkItem. By default this is false, indicating that this metric is reported as a delta that is not associated with any WorkItem."
-    },
-    "scalar": {
-     "type": "any",
-     "description": "Worker-computed aggregate value for aggregation kinds \"Sum\", \"Max\", \"Min\", \"And\", and \"Or\". The possible value types are Long, Double, and Boolean."
-    },
-    "meanSum": {
-     "type": "any",
-     "description": "Worker-computed aggregate value for the \"Mean\" aggregation kind. This holds the sum of the aggregated values and is used in combination with mean_count below to obtain the actual mean aggregate value. The only possible value types are Long and Double."
-    },
-    "meanCount": {
-     "type": "any",
-     "description": "Worker-computed aggregate value for the \"Mean\" aggregation kind. This holds the count of the aggregated values and is used in combination with mean_sum above to obtain the actual mean aggregate value. The only possible value type is Long."
-    },
-    "set": {
-     "type": "any",
-     "description": "Worker-computed aggregate value for the \"Set\" aggregation kind. The only possible value type is a list of Values whose type can be Long, Double, or String, according to the metric's type. All Values in the list must be of the same type."
-    },
-    "internal": {
-     "type": "any",
-     "description": "Worker-computed aggregate value for internal use by the Dataflow service."
-    },
-    "updateTime": {
-     "type": "string",
-     "description": "Timestamp associated with the metric value. Optional when workers are reporting work progress; it will be filled in responses from the metrics API."
-    }
-   }
-  },
-  "MetricStructuredName": {
-   "id": "MetricStructuredName",
-   "type": "object",
-   "description": "Identifies a metric, by describing the source which generated the metric.",
-   "properties": {
-    "origin": {
-     "type": "string",
-     "description": "Origin (namespace) of metric name. May be blank for user-define metrics; will be \"dataflow\" for metrics defined by the Dataflow service or SDK."
-    },
-    "name": {
-     "type": "string",
-     "description": "Worker-defined metric name."
-    },
-    "context": {
-     "type": "object",
-     "description": "Zero or more labeled fields which identify the part of the job this metric is associated with, such as the name of a step or collection. For example, built-in counters associated with steps will have context['step'] = . Counters associated with PCollections in the SDK will have context['pcollection'] =\n.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "CreateJobFromTemplateRequest": {
-   "id": "CreateJobFromTemplateRequest",
-   "type": "object",
-   "description": "A request to create a Cloud Dataflow job from a template.",
-   "properties": {
-    "jobName": {
-     "type": "string",
-     "description": "Required. The job name to use for the created job."
-    },
-    "gcsPath": {
-     "type": "string",
-     "description": "Required. A Cloud Storage path to the template from which to create the job. Must be a valid Cloud Storage URL, beginning with `gs://`."
-    },
-    "parameters": {
-     "type": "object",
-     "description": "The runtime parameters to pass to the job.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "environment": {
-     "$ref": "RuntimeEnvironment",
-     "description": "The runtime environment for the job."
-    }
-   }
-  },
-  "RuntimeEnvironment": {
-   "id": "RuntimeEnvironment",
-   "type": "object",
-   "description": "The environment values to set at runtime.",
-   "properties": {
-    "maxWorkers": {
-     "type": "integer",
-     "description": "The maximum number of Google Compute Engine instances to be made available to your pipeline during execution, from 1 to 1000.",
-     "format": "int32"
-    },
-    "zone": {
-     "type": "string",
-     "description": "The Compute Engine [availability zone](https://cloud.google.com/compute/docs/regions-zones/regions-zones) for launching worker instances to run your pipeline."
-    },
-    "serviceAccountEmail": {
-     "type": "string",
-     "description": "The email address of the service account to run the job as."
-    },
-    "tempLocation": {
-     "type": "string",
-     "description": "The Cloud Storage path to use for temporary files. Must be a valid Cloud Storage URL, beginning with `gs://`."
-    },
-    "bypassTempDirValidation": {
-     "type": "boolean",
-     "description": "Whether to bypass the safety checks for the job's temporary directory. Use with caution."
-    }
-   }
-  },
-  "ReportWorkItemStatusRequest": {
-   "id": "ReportWorkItemStatusRequest",
-   "type": "object",
-   "description": "Request to report the status of WorkItems.",
-   "properties": {
-    "workerId": {
-     "type": "string",
-     "description": "The ID of the worker reporting the WorkItem status. If this does not match the ID of the worker which the Dataflow service believes currently has the lease on the WorkItem, the report will be dropped (with an error response)."
-    },
-    "workItemStatuses": {
-     "type": "array",
-     "description": "The order is unimportant, except that the order of the WorkItemServiceState messages in the ReportWorkItemStatusResponse corresponds to the order of WorkItemStatus messages here.",
-     "items": {
-      "$ref": "WorkItemStatus"
-     }
-    },
-    "currentWorkerTime": {
-     "type": "string",
-     "description": "The current timestamp at the worker."
-    },
-    "location": {
-     "type": "string",
-     "description": "The location which contains the WorkItem's job."
-    }
-   }
-  },
-  "WorkItemStatus": {
-   "id": "WorkItemStatus",
-   "type": "object",
-   "description": "Conveys a worker's progress through the work described by a WorkItem.",
-   "properties": {
-    "workItemId": {
-     "type": "string",
-     "description": "Identifies the WorkItem."
-    },
-    "reportIndex": {
-     "type": "string",
-     "description": "The report index. When a WorkItem is leased, the lease will contain an initial report index. When a WorkItem's status is reported to the system, the report should be sent with that report index, and the response will contain the index the worker should use for the next report. Reports received with unexpected index values will be rejected by the service. In order to preserve idempotency, the worker should not alter the contents of a report, even if the worker must submit the same report multiple times before getting back a response. The worker should not submit a subsequent report until the response for the previous report had been received from the service.",
-     "format": "int64"
-    },
-    "requestedLeaseDuration": {
-     "type": "string",
-     "description": "Amount of time the worker requests for its lease."
-    },
-    "completed": {
-     "type": "boolean",
-     "description": "True if the WorkItem was completed (successfully or unsuccessfully)."
-    },
-    "errors": {
-     "type": "array",
-     "description": "Specifies errors which occurred during processing. If errors are provided, and completed = true, then the WorkItem is considered to have failed.",
-     "items": {
-      "$ref": "Status"
-     }
-    },
-    "counterUpdates": {
-     "type": "array",
-     "description": "Worker output counters for this WorkItem.",
-     "items": {
-      "$ref": "CounterUpdate"
-     }
-    },
-    "metricUpdates": {
-     "type": "array",
-     "description": "DEPRECATED in favor of counter_updates.",
-     "items": {
-      "$ref": "MetricUpdate"
-     }
-    },
-    "reportedProgress": {
-     "$ref": "ApproximateReportedProgress",
-     "description": "The worker's progress through this WorkItem."
-    },
-    "stopPosition": {
-     "$ref": "Position",
-     "description": "A worker may split an active map task in two parts, \"primary\" and \"residual\", continuing to process the primary part and returning the residual part into the pool of available work. This event is called a \"dynamic split\" and is critical to the dynamic work rebalancing feature. The two obtained sub-tasks are called \"parts\" of the split. The parts, if concatenated, must represent the same input as would be read by the current task if the split did not happen. The exact way in which the original task is decomposed into the two parts is specified either as a position demarcating them (stop_position), or explicitly as two DerivedSources, if this task consumes a user-defined source type (dynamic_source_split). The \"current\" task is adjusted as a result of the split: after a task with range [A, B) sends a stop_position update at C, its range is considered to be [A, C), e.g.: * Progress should be interpreted relative to the new range, e.g. \"75% completed\" means \"75% of [A, C) completed\" * The worker should interpret proposed_stop_position relative to the new range, e.g. \"split at 68%\" should be interpreted as \"split at 68% of [A, C)\". * If the worker chooses to split again using stop_position, only stop_positions in [A, C) will be accepted. * Etc. dynamic_source_split has similar semantics: e.g., if a task with source S splits using dynamic_source_split into {P, R} (where P and R must be together equivalent to S), then subsequent progress and proposed_stop_position should be interpreted relative to P, and in a potential subsequent dynamic_source_split into {P', R'}, P' and R' must be together equivalent to P, etc."
-    },
-    "dynamicSourceSplit": {
-     "$ref": "DynamicSourceSplit",
-     "description": "See documentation of stop_position."
-    },
-    "sourceOperationResponse": {
-     "$ref": "SourceOperationResponse",
-     "description": "If the work item represented a SourceOperationRequest, and the work is completed, contains the result of the operation."
-    },
-    "sourceFork": {
-     "$ref": "SourceFork",
-     "description": "DEPRECATED in favor of dynamic_source_split."
-    },
-    "progress": {
-     "$ref": "ApproximateProgress",
-     "description": "DEPRECATED in favor of reported_progress."
-    }
-   }
-  },
-  "Status": {
-   "id": "Status",
-   "type": "object",
-   "description": "The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). The error model is designed to be: - Simple to use and understand for most users - Flexible enough to meet unexpected needs # Overview The `Status` message contains three pieces of data: error code, error message, and error details. The error code should be an enum value of google.rpc.Code, but it may accept additional error codes if needed. The error message should be a developer-facing English message that helps developers *understand* and *resolve* the error. If a localized user-facing error message is needed, put the localized message in the error details or localize it in the client. The optional error details may contain arbitrary information about the error. There is a predefined set of error detail types in the package `google.rpc` which can be used for common error conditions. # Language mapping The `Status` message is the logical representation of the error model, but it is not necessarily the actual wire format. When the `Status` message is exposed in different client libraries and different wire protocols, it can be mapped differently. For example, it will likely be mapped to some exceptions in Java, but more likely mapped to some error codes in C. # Other uses The error model and the `Status` message can be used in a variety of environments, either with or without APIs, to provide a consistent developer experience across different environments. Example uses of this error model include: - Partial errors. If a service needs to return partial errors to the client, it may embed the `Status` in the normal response to indicate the partial errors. - Workflow errors. A typical workflow has multiple steps. Each step may have a `Status` message for error reporting purpose. - Batch operations. If a client uses batch request and batch response, the `Status` message should be used directly inside batch response, one for each error sub-response. - Asynchronous operations. If an API call embeds asynchronous operation results in its response, the status of those operations should be represented directly using the `Status` message. - Logging. If some API errors are stored in logs, the message `Status` could be used directly after any stripping needed for security/privacy reasons.",
-   "properties": {
-    "code": {
-     "type": "integer",
-     "description": "The status code, which should be an enum value of google.rpc.Code.",
-     "format": "int32"
-    },
-    "message": {
-     "type": "string",
-     "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client."
-    },
-    "details": {
-     "type": "array",
-     "description": "A list of messages that carry the error details. There will be a common set of message types for APIs to use.",
-     "items": {
-      "type": "object",
-      "additionalProperties": {
-       "type": "any",
-       "description": "Properties of the object. Contains field @type with type URL."
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        },
+        "https://www.googleapis.com/auth/userinfo.email": {
+          "description": "View your email address"
+        }
       }
-     }
     }
-   }
   },
-  "CounterUpdate": {
-   "id": "CounterUpdate",
-   "type": "object",
-   "description": "An update to a Counter sent from a worker.",
-   "properties": {
-    "nameAndKind": {
-     "$ref": "NameAndKind",
-     "description": "Counter name and aggregation type."
-    },
-    "shortId": {
-     "type": "string",
-     "description": "The service-generated short identifier for this counter. The short_id -\u003e (name, metadata) mapping is constant for the lifetime of a job.",
-     "format": "int64"
-    },
-    "structuredNameAndMetadata": {
-     "$ref": "CounterStructuredNameAndMetadata",
-     "description": "Counter structured name and metadata."
-    },
-    "cumulative": {
-     "type": "boolean",
-     "description": "True if this counter is reported as the total cumulative aggregate value accumulated since the worker started working on this WorkItem. By default this is false, indicating that this counter is reported as a delta."
-    },
-    "integer": {
-     "$ref": "SplitInt64",
-     "description": "Integer value for Sum, Max, Min."
-    },
-    "floatingPoint": {
-     "type": "number",
-     "description": "Floating point value for Sum, Max, Min.",
-     "format": "double"
-    },
-    "boolean": {
-     "type": "boolean",
-     "description": "Boolean value for And, Or."
-    },
-    "integerMean": {
-     "$ref": "IntegerMean",
-     "description": "Integer mean aggregation value for Mean."
-    },
-    "floatingPointMean": {
-     "$ref": "FloatingPointMean",
-     "description": "Floating point mean aggregation value for Mean."
-    },
-    "integerList": {
-     "$ref": "IntegerList",
-     "description": "List of integers, for Set."
-    },
-    "floatingPointList": {
-     "$ref": "FloatingPointList",
-     "description": "List of floating point numbers, for Set."
-    },
-    "stringList": {
-     "$ref": "StringList",
-     "description": "List of strings, for Set."
-    },
-    "distribution": {
-     "$ref": "DistributionUpdate",
-     "description": "Distribution data"
-    },
-    "internal": {
-     "type": "any",
-     "description": "Value for internally-defined counters used by the Dataflow service."
+  "kind": "discovery#restDescription",
+  "description": "Manages Google Cloud Dataflow projects on Google Cloud Platform.",
+  "servicePath": "",
+  "rootUrl": "https://dataflow.googleapis.com/",
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "dataflow",
+  "batchPath": "batch",
+  "revision": "20170201",
+  "documentationLink": "https://cloud.google.com/dataflow",
+  "id": "dataflow:v1b3",
+  "title": "Google Dataflow API",
+  "discoveryVersion": "v1",
+  "ownerName": "Google",
+  "resources": {
+    "projects": {
+      "methods": {
+        "workerMessages": {
+          "description": "Send a worker_message to the service.",
+          "request": {
+            "$ref": "SendWorkerMessagesRequest"
+          },
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "projectId"
+          ],
+          "response": {
+            "$ref": "SendWorkerMessagesResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/userinfo.email"
+          ],
+          "parameters": {
+            "projectId": {
+              "location": "path",
+              "description": "The project to send the WorkerMessages to.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1b3/projects/{projectId}/WorkerMessages",
+          "id": "dataflow.projects.workerMessages",
+          "path": "v1b3/projects/{projectId}/WorkerMessages"
+        }
+      },
+      "resources": {
+        "locations": {
+          "resources": {
+            "jobs": {
+              "methods": {
+                "getMetrics": {
+                  "httpMethod": "GET",
+                  "response": {
+                    "$ref": "JobMetrics"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "location",
+                    "jobId"
+                  ],
+                  "parameters": {
+                    "startTime": {
+                      "location": "query",
+                      "description": "Return only metric data that has changed since this time.\nDefault is to return all information about all metrics for the job.",
+                      "format": "google-datetime",
+                      "type": "string"
+                    },
+                    "projectId": {
+                      "location": "path",
+                      "description": "A project id.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "jobId": {
+                      "required": true,
+                      "type": "string",
+                      "location": "path",
+                      "description": "The job to get messages for."
+                    },
+                    "location": {
+                      "location": "path",
+                      "description": "The location which contains the job specified by job_id.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/userinfo.email"
+                  ],
+                  "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/metrics",
+                  "id": "dataflow.projects.locations.jobs.getMetrics",
+                  "path": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/metrics",
+                  "description": "Request the job status."
+                },
+                "get": {
+                  "description": "Gets the state of the specified Cloud Dataflow job.",
+                  "httpMethod": "GET",
+                  "parameterOrder": [
+                    "projectId",
+                    "location",
+                    "jobId"
+                  ],
+                  "response": {
+                    "$ref": "Job"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/userinfo.email"
+                  ],
+                  "parameters": {
+                    "projectId": {
+                      "description": "The ID of the Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "jobId": {
+                      "description": "The job ID.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "view": {
+                      "location": "query",
+                      "enum": [
+                        "JOB_VIEW_UNKNOWN",
+                        "JOB_VIEW_SUMMARY",
+                        "JOB_VIEW_ALL"
+                      ],
+                      "description": "The level of information requested in response.",
+                      "type": "string"
+                    },
+                    "location": {
+                      "description": "The location that contains this job.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}",
+                  "id": "dataflow.projects.locations.jobs.get",
+                  "path": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}"
+                },
+                "list": {
+                  "response": {
+                    "$ref": "ListJobsResponse"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "location"
+                  ],
+                  "httpMethod": "GET",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/userinfo.email"
+                  ],
+                  "parameters": {
+                    "filter": {
+                      "location": "query",
+                      "enum": [
+                        "UNKNOWN",
+                        "ALL",
+                        "TERMINATED",
+                        "ACTIVE"
+                      ],
+                      "description": "The kind of filter to use.",
+                      "type": "string"
+                    },
+                    "location": {
+                      "location": "path",
+                      "description": "The location that contains this job.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "pageToken": {
+                      "location": "query",
+                      "description": "Set this to the 'next_page_token' field of a previous response\nto request additional results in a long list.",
+                      "type": "string"
+                    },
+                    "pageSize": {
+                      "description": "If there are many jobs, limit response to at most this many.\nThe actual number of jobs returned will be the lesser of max_responses\nand an unspecified server-defined limit.",
+                      "format": "int32",
+                      "type": "integer",
+                      "location": "query"
+                    },
+                    "view": {
+                      "location": "query",
+                      "enum": [
+                        "JOB_VIEW_UNKNOWN",
+                        "JOB_VIEW_SUMMARY",
+                        "JOB_VIEW_ALL"
+                      ],
+                      "description": "Level of information requested in response. Default is `JOB_VIEW_SUMMARY`.",
+                      "type": "string"
+                    },
+                    "projectId": {
+                      "required": true,
+                      "type": "string",
+                      "location": "path",
+                      "description": "The project which owns the jobs."
+                    }
+                  },
+                  "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs",
+                  "path": "v1b3/projects/{projectId}/locations/{location}/jobs",
+                  "id": "dataflow.projects.locations.jobs.list",
+                  "description": "List the jobs of a project."
+                },
+                "update": {
+                  "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}",
+                  "path": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}",
+                  "id": "dataflow.projects.locations.jobs.update",
+                  "request": {
+                    "$ref": "Job"
+                  },
+                  "description": "Updates the state of an existing Cloud Dataflow job.",
+                  "response": {
+                    "$ref": "Job"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "location",
+                    "jobId"
+                  ],
+                  "httpMethod": "PUT",
+                  "parameters": {
+                    "projectId": {
+                      "description": "The ID of the Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "jobId": {
+                      "required": true,
+                      "type": "string",
+                      "location": "path",
+                      "description": "The job ID."
+                    },
+                    "location": {
+                      "location": "path",
+                      "description": "The location that contains this job.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/userinfo.email"
+                  ]
+                },
+                "create": {
+                  "request": {
+                    "$ref": "Job"
+                  },
+                  "description": "Creates a Cloud Dataflow job.",
+                  "response": {
+                    "$ref": "Job"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "location"
+                  ],
+                  "httpMethod": "POST",
+                  "parameters": {
+                    "projectId": {
+                      "description": "The ID of the Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "view": {
+                      "enum": [
+                        "JOB_VIEW_UNKNOWN",
+                        "JOB_VIEW_SUMMARY",
+                        "JOB_VIEW_ALL"
+                      ],
+                      "description": "The level of information requested in response.",
+                      "type": "string",
+                      "location": "query"
+                    },
+                    "location": {
+                      "location": "path",
+                      "description": "The location that contains this job.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "replaceJobId": {
+                      "type": "string",
+                      "location": "query",
+                      "description": "Deprecated. This field is now in the Job message."
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/userinfo.email"
+                  ],
+                  "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs",
+                  "path": "v1b3/projects/{projectId}/locations/{location}/jobs",
+                  "id": "dataflow.projects.locations.jobs.create"
+                }
+              },
+              "resources": {
+                "workItems": {
+                  "methods": {
+                    "lease": {
+                      "response": {
+                        "$ref": "LeaseWorkItemResponse"
+                      },
+                      "parameterOrder": [
+                        "projectId",
+                        "location",
+                        "jobId"
+                      ],
+                      "httpMethod": "POST",
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/userinfo.email"
+                      ],
+                      "parameters": {
+                        "location": {
+                          "description": "The location which contains the WorkItem's job.",
+                          "required": true,
+                          "type": "string",
+                          "location": "path"
+                        },
+                        "projectId": {
+                          "required": true,
+                          "type": "string",
+                          "location": "path",
+                          "description": "Identifies the project this worker belongs to."
+                        },
+                        "jobId": {
+                          "location": "path",
+                          "description": "Identifies the workflow job this worker belongs to.",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/workItems:lease",
+                      "path": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/workItems:lease",
+                      "id": "dataflow.projects.locations.jobs.workItems.lease",
+                      "description": "Leases a dataflow WorkItem to run.",
+                      "request": {
+                        "$ref": "LeaseWorkItemRequest"
+                      }
+                    },
+                    "reportStatus": {
+                      "httpMethod": "POST",
+                      "parameterOrder": [
+                        "projectId",
+                        "location",
+                        "jobId"
+                      ],
+                      "response": {
+                        "$ref": "ReportWorkItemStatusResponse"
+                      },
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/userinfo.email"
+                      ],
+                      "parameters": {
+                        "location": {
+                          "description": "The location which contains the WorkItem's job.",
+                          "required": true,
+                          "type": "string",
+                          "location": "path"
+                        },
+                        "projectId": {
+                          "location": "path",
+                          "description": "The project which owns the WorkItem's job.",
+                          "required": true,
+                          "type": "string"
+                        },
+                        "jobId": {
+                          "required": true,
+                          "type": "string",
+                          "location": "path",
+                          "description": "The job which the WorkItem is part of."
+                        }
+                      },
+                      "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/workItems:reportStatus",
+                      "id": "dataflow.projects.locations.jobs.workItems.reportStatus",
+                      "path": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/workItems:reportStatus",
+                      "description": "Reports the status of dataflow WorkItems leased by a worker.",
+                      "request": {
+                        "$ref": "ReportWorkItemStatusRequest"
+                      }
+                    }
+                  }
+                },
+                "messages": {
+                  "methods": {
+                    "list": {
+                      "response": {
+                        "$ref": "ListJobMessagesResponse"
+                      },
+                      "httpMethod": "GET",
+                      "parameterOrder": [
+                        "projectId",
+                        "location",
+                        "jobId"
+                      ],
+                      "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
+                        "https://www.googleapis.com/auth/userinfo.email"
+                      ],
+                      "parameters": {
+                        "location": {
+                          "location": "path",
+                          "description": "The location which contains the job specified by job_id.",
+                          "required": true,
+                          "type": "string"
+                        },
+                        "endTime": {
+                          "location": "query",
+                          "description": "Return only messages with timestamps \u003c end_time. The default is now\n(i.e. return up to the latest messages available).",
+                          "format": "google-datetime",
+                          "type": "string"
+                        },
+                        "startTime": {
+                          "description": "If specified, return only messages with timestamps \u003e= start_time.\nThe default is the job creation time (i.e. beginning of messages).",
+                          "format": "google-datetime",
+                          "type": "string",
+                          "location": "query"
+                        },
+                        "pageToken": {
+                          "type": "string",
+                          "location": "query",
+                          "description": "If supplied, this should be the value of next_page_token returned\nby an earlier call. This will cause the next page of results to\nbe returned."
+                        },
+                        "pageSize": {
+                          "type": "integer",
+                          "location": "query",
+                          "description": "If specified, determines the maximum number of messages to\nreturn.  If unspecified, the service may choose an appropriate\ndefault, or may return an arbitrarily large number of results.",
+                          "format": "int32"
+                        },
+                        "minimumImportance": {
+                          "enum": [
+                            "JOB_MESSAGE_IMPORTANCE_UNKNOWN",
+                            "JOB_MESSAGE_DEBUG",
+                            "JOB_MESSAGE_DETAILED",
+                            "JOB_MESSAGE_BASIC",
+                            "JOB_MESSAGE_WARNING",
+                            "JOB_MESSAGE_ERROR"
+                          ],
+                          "description": "Filter to only get messages with importance \u003e= level",
+                          "type": "string",
+                          "location": "query"
+                        },
+                        "jobId": {
+                          "location": "path",
+                          "description": "The job to get messages about.",
+                          "required": true,
+                          "type": "string"
+                        },
+                        "projectId": {
+                          "location": "path",
+                          "description": "A project id.",
+                          "required": true,
+                          "type": "string"
+                        }
+                      },
+                      "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/messages",
+                      "path": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/messages",
+                      "id": "dataflow.projects.locations.jobs.messages.list",
+                      "description": "Request the job status."
+                    }
+                  }
+                }
+              }
+            }
+          }
+        },
+        "templates": {
+          "methods": {
+            "create": {
+              "id": "dataflow.projects.templates.create",
+              "path": "v1b3/projects/{projectId}/templates",
+              "description": "Creates a Cloud Dataflow job from a template.",
+              "request": {
+                "$ref": "CreateJobFromTemplateRequest"
+              },
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "projectId"
+              ],
+              "response": {
+                "$ref": "Job"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/userinfo.email"
+              ],
+              "parameters": {
+                "projectId": {
+                  "required": true,
+                  "type": "string",
+                  "location": "path",
+                  "description": "Required. The ID of the Cloud Platform project that the job belongs to."
+                }
+              },
+              "flatPath": "v1b3/projects/{projectId}/templates"
+            }
+          }
+        },
+        "jobs": {
+          "methods": {
+            "getMetrics": {
+              "description": "Request the job status.",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "projectId",
+                "jobId"
+              ],
+              "response": {
+                "$ref": "JobMetrics"
+              },
+              "parameters": {
+                "startTime": {
+                  "location": "query",
+                  "description": "Return only metric data that has changed since this time.\nDefault is to return all information about all metrics for the job.",
+                  "format": "google-datetime",
+                  "type": "string"
+                },
+                "projectId": {
+                  "description": "A project id.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                },
+                "jobId": {
+                  "location": "path",
+                  "description": "The job to get messages for.",
+                  "required": true,
+                  "type": "string"
+                },
+                "location": {
+                  "type": "string",
+                  "location": "query",
+                  "description": "The location which contains the job specified by job_id."
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/userinfo.email"
+              ],
+              "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}/metrics",
+              "id": "dataflow.projects.jobs.getMetrics",
+              "path": "v1b3/projects/{projectId}/jobs/{jobId}/metrics"
+            },
+            "get": {
+              "path": "v1b3/projects/{projectId}/jobs/{jobId}",
+              "id": "dataflow.projects.jobs.get",
+              "description": "Gets the state of the specified Cloud Dataflow job.",
+              "parameterOrder": [
+                "projectId",
+                "jobId"
+              ],
+              "response": {
+                "$ref": "Job"
+              },
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/userinfo.email"
+              ],
+              "parameters": {
+                "location": {
+                  "location": "query",
+                  "description": "The location that contains this job.",
+                  "type": "string"
+                },
+                "projectId": {
+                  "description": "The ID of the Cloud Platform project that the job belongs to.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                },
+                "jobId": {
+                  "location": "path",
+                  "description": "The job ID.",
+                  "required": true,
+                  "type": "string"
+                },
+                "view": {
+                  "description": "The level of information requested in response.",
+                  "type": "string",
+                  "location": "query",
+                  "enum": [
+                    "JOB_VIEW_UNKNOWN",
+                    "JOB_VIEW_SUMMARY",
+                    "JOB_VIEW_ALL"
+                  ]
+                }
+              },
+              "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}"
+            },
+            "list": {
+              "description": "List the jobs of a project.",
+              "response": {
+                "$ref": "ListJobsResponse"
+              },
+              "parameterOrder": [
+                "projectId"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/userinfo.email"
+              ],
+              "parameters": {
+                "projectId": {
+                  "description": "The project which owns the jobs.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                },
+                "filter": {
+                  "type": "string",
+                  "location": "query",
+                  "enum": [
+                    "UNKNOWN",
+                    "ALL",
+                    "TERMINATED",
+                    "ACTIVE"
+                  ],
+                  "description": "The kind of filter to use."
+                },
+                "location": {
+                  "description": "The location that contains this job.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageToken": {
+                  "description": "Set this to the 'next_page_token' field of a previous response\nto request additional results in a long list.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "type": "integer",
+                  "location": "query",
+                  "description": "If there are many jobs, limit response to at most this many.\nThe actual number of jobs returned will be the lesser of max_responses\nand an unspecified server-defined limit.",
+                  "format": "int32"
+                },
+                "view": {
+                  "description": "Level of information requested in response. Default is `JOB_VIEW_SUMMARY`.",
+                  "type": "string",
+                  "location": "query",
+                  "enum": [
+                    "JOB_VIEW_UNKNOWN",
+                    "JOB_VIEW_SUMMARY",
+                    "JOB_VIEW_ALL"
+                  ]
+                }
+              },
+              "flatPath": "v1b3/projects/{projectId}/jobs",
+              "path": "v1b3/projects/{projectId}/jobs",
+              "id": "dataflow.projects.jobs.list"
+            },
+            "update": {
+              "httpMethod": "PUT",
+              "parameterOrder": [
+                "projectId",
+                "jobId"
+              ],
+              "response": {
+                "$ref": "Job"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/userinfo.email"
+              ],
+              "parameters": {
+                "location": {
+                  "location": "query",
+                  "description": "The location that contains this job.",
+                  "type": "string"
+                },
+                "projectId": {
+                  "location": "path",
+                  "description": "The ID of the Cloud Platform project that the job belongs to.",
+                  "required": true,
+                  "type": "string"
+                },
+                "jobId": {
+                  "location": "path",
+                  "description": "The job ID.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}",
+              "id": "dataflow.projects.jobs.update",
+              "path": "v1b3/projects/{projectId}/jobs/{jobId}",
+              "description": "Updates the state of an existing Cloud Dataflow job.",
+              "request": {
+                "$ref": "Job"
+              }
+            },
+            "create": {
+              "path": "v1b3/projects/{projectId}/jobs",
+              "id": "dataflow.projects.jobs.create",
+              "description": "Creates a Cloud Dataflow job.",
+              "request": {
+                "$ref": "Job"
+              },
+              "response": {
+                "$ref": "Job"
+              },
+              "parameterOrder": [
+                "projectId"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/userinfo.email"
+              ],
+              "parameters": {
+                "projectId": {
+                  "description": "The ID of the Cloud Platform project that the job belongs to.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                },
+                "view": {
+                  "type": "string",
+                  "location": "query",
+                  "enum": [
+                    "JOB_VIEW_UNKNOWN",
+                    "JOB_VIEW_SUMMARY",
+                    "JOB_VIEW_ALL"
+                  ],
+                  "description": "The level of information requested in response."
+                },
+                "location": {
+                  "location": "query",
+                  "description": "The location that contains this job.",
+                  "type": "string"
+                },
+                "replaceJobId": {
+                  "location": "query",
+                  "description": "Deprecated. This field is now in the Job message.",
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1b3/projects/{projectId}/jobs"
+            }
+          },
+          "resources": {
+            "messages": {
+              "methods": {
+                "list": {
+                  "description": "Request the job status.",
+                  "parameterOrder": [
+                    "projectId",
+                    "jobId"
+                  ],
+                  "response": {
+                    "$ref": "ListJobMessagesResponse"
+                  },
+                  "httpMethod": "GET",
+                  "parameters": {
+                    "jobId": {
+                      "location": "path",
+                      "description": "The job to get messages about.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "projectId": {
+                      "location": "path",
+                      "description": "A project id.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "location": {
+                      "description": "The location which contains the job specified by job_id.",
+                      "type": "string",
+                      "location": "query"
+                    },
+                    "endTime": {
+                      "description": "Return only messages with timestamps \u003c end_time. The default is now\n(i.e. return up to the latest messages available).",
+                      "format": "google-datetime",
+                      "type": "string",
+                      "location": "query"
+                    },
+                    "startTime": {
+                      "description": "If specified, return only messages with timestamps \u003e= start_time.\nThe default is the job creation time (i.e. beginning of messages).",
+                      "format": "google-datetime",
+                      "type": "string",
+                      "location": "query"
+                    },
+                    "pageToken": {
+                      "location": "query",
+                      "description": "If supplied, this should be the value of next_page_token returned\nby an earlier call. This will cause the next page of results to\nbe returned.",
+                      "type": "string"
+                    },
+                    "pageSize": {
+                      "description": "If specified, determines the maximum number of messages to\nreturn.  If unspecified, the service may choose an appropriate\ndefault, or may return an arbitrarily large number of results.",
+                      "format": "int32",
+                      "type": "integer",
+                      "location": "query"
+                    },
+                    "minimumImportance": {
+                      "description": "Filter to only get messages with importance \u003e= level",
+                      "type": "string",
+                      "location": "query",
+                      "enum": [
+                        "JOB_MESSAGE_IMPORTANCE_UNKNOWN",
+                        "JOB_MESSAGE_DEBUG",
+                        "JOB_MESSAGE_DETAILED",
+                        "JOB_MESSAGE_BASIC",
+                        "JOB_MESSAGE_WARNING",
+                        "JOB_MESSAGE_ERROR"
+                      ]
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/userinfo.email"
+                  ],
+                  "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}/messages",
+                  "path": "v1b3/projects/{projectId}/jobs/{jobId}/messages",
+                  "id": "dataflow.projects.jobs.messages.list"
+                }
+              }
+            },
+            "debug": {
+              "methods": {
+                "getConfig": {
+                  "description": "Get encoded debug configuration for component. Not cacheable.",
+                  "request": {
+                    "$ref": "GetDebugConfigRequest"
+                  },
+                  "httpMethod": "POST",
+                  "parameterOrder": [
+                    "projectId",
+                    "jobId"
+                  ],
+                  "response": {
+                    "$ref": "GetDebugConfigResponse"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/userinfo.email"
+                  ],
+                  "parameters": {
+                    "projectId": {
+                      "location": "path",
+                      "description": "The project id.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "jobId": {
+                      "location": "path",
+                      "description": "The job id.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}/debug/getConfig",
+                  "id": "dataflow.projects.jobs.debug.getConfig",
+                  "path": "v1b3/projects/{projectId}/jobs/{jobId}/debug/getConfig"
+                },
+                "sendCapture": {
+                  "response": {
+                    "$ref": "SendDebugCaptureResponse"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "jobId"
+                  ],
+                  "httpMethod": "POST",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/userinfo.email"
+                  ],
+                  "parameters": {
+                    "projectId": {
+                      "description": "The project id.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "jobId": {
+                      "location": "path",
+                      "description": "The job id.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}/debug/sendCapture",
+                  "path": "v1b3/projects/{projectId}/jobs/{jobId}/debug/sendCapture",
+                  "id": "dataflow.projects.jobs.debug.sendCapture",
+                  "description": "Send encoded debug capture data for component.",
+                  "request": {
+                    "$ref": "SendDebugCaptureRequest"
+                  }
+                }
+              }
+            },
+            "workItems": {
+              "methods": {
+                "lease": {
+                  "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}/workItems:lease",
+                  "path": "v1b3/projects/{projectId}/jobs/{jobId}/workItems:lease",
+                  "id": "dataflow.projects.jobs.workItems.lease",
+                  "request": {
+                    "$ref": "LeaseWorkItemRequest"
+                  },
+                  "description": "Leases a dataflow WorkItem to run.",
+                  "response": {
+                    "$ref": "LeaseWorkItemResponse"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "jobId"
+                  ],
+                  "httpMethod": "POST",
+                  "parameters": {
+                    "projectId": {
+                      "location": "path",
+                      "description": "Identifies the project this worker belongs to.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "jobId": {
+                      "location": "path",
+                      "description": "Identifies the workflow job this worker belongs to.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/userinfo.email"
+                  ]
+                },
+                "reportStatus": {
+                  "id": "dataflow.projects.jobs.workItems.reportStatus",
+                  "path": "v1b3/projects/{projectId}/jobs/{jobId}/workItems:reportStatus",
+                  "request": {
+                    "$ref": "ReportWorkItemStatusRequest"
+                  },
+                  "description": "Reports the status of dataflow WorkItems leased by a worker.",
+                  "httpMethod": "POST",
+                  "parameterOrder": [
+                    "projectId",
+                    "jobId"
+                  ],
+                  "response": {
+                    "$ref": "ReportWorkItemStatusResponse"
+                  },
+                  "parameters": {
+                    "projectId": {
+                      "location": "path",
+                      "description": "The project which owns the WorkItem's job.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "jobId": {
+                      "description": "The job which the WorkItem is part of.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/userinfo.email"
+                  ],
+                  "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}/workItems:reportStatus"
+                }
+              }
+            }
+          }
+        }
+      }
     }
-   }
   },
-  "NameAndKind": {
-   "id": "NameAndKind",
-   "type": "object",
-   "description": "Basic metadata about a counter.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "Name of the counter."
+  "parameters": {
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
     },
-    "kind": {
-     "type": "string",
-     "description": "Counter aggregation kind.",
-     "enum": [
-      "INVALID",
-      "SUM",
-      "MAX",
-      "MIN",
-      "MEAN",
-      "OR",
-      "AND",
-      "SET",
-      "DISTRIBUTION"
-     ]
-    }
-   }
-  },
-  "CounterStructuredNameAndMetadata": {
-   "id": "CounterStructuredNameAndMetadata",
-   "type": "object",
-   "description": "A single message which encapsulates structured name and metadata for a given counter.",
-   "properties": {
-    "name": {
-     "$ref": "CounterStructuredName",
-     "description": "Structured name of the counter."
-    },
-    "metadata": {
-     "$ref": "CounterMetadata",
-     "description": "Metadata associated with a counter"
-    }
-   }
-  },
-  "CounterStructuredName": {
-   "id": "CounterStructuredName",
-   "type": "object",
-   "description": "Identifies a counter within a per-job namespace. Counters whose structured names are the same get merged into a single value for the job.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "Counter name. Not necessarily globally-unique, but unique within the context of the other fields. Required."
-    },
-    "standardOrigin": {
-     "type": "string",
-     "description": "One of the standard Origins defined above.",
-     "enum": [
-      "DATAFLOW",
-      "USER"
-     ]
-    },
-    "otherOrigin": {
-     "type": "string",
-     "description": "A string containing the origin of the counter."
-    },
-    "originalStepName": {
-     "type": "string",
-     "description": "System generated name of the original step in the user's graph, before optimization."
-    },
-    "componentStepName": {
-     "type": "string",
-     "description": "Name of the optimized step being executed by the workers."
-    },
-    "executionStepName": {
-     "type": "string",
-     "description": "Name of the stage. An execution step contains multiple component steps."
-    },
-    "workerId": {
-     "type": "string",
-     "description": "ID of a particular worker."
-    },
-    "portion": {
-     "type": "string",
-     "description": "Portion of this counter, either key or value.",
-     "enum": [
-      "ALL",
-      "KEY",
-      "VALUE"
-     ]
-    }
-   }
-  },
-  "CounterMetadata": {
-   "id": "CounterMetadata",
-   "type": "object",
-   "description": "CounterMetadata includes all static non-name non-value counter attributes.",
-   "properties": {
-    "kind": {
-     "type": "string",
-     "description": "Counter aggregation kind.",
-     "enum": [
-      "INVALID",
-      "SUM",
-      "MAX",
-      "MIN",
-      "MEAN",
-      "OR",
-      "AND",
-      "SET",
-      "DISTRIBUTION"
-     ]
-    },
-    "description": {
-     "type": "string",
-     "description": "Human-readable description of the counter semantics."
-    },
-    "standardUnits": {
-     "type": "string",
-     "description": "System defined Units, see above enum.",
-     "enum": [
-      "BYTES",
-      "BYTES_PER_SEC",
-      "MILLISECONDS",
-      "MICROSECONDS",
-      "NANOSECONDS",
-      "TIMESTAMP_MSEC",
-      "TIMESTAMP_USEC",
-      "TIMESTAMP_NSEC"
-     ]
-    },
-    "otherUnits": {
-     "type": "string",
-     "description": "A string referring to the unit type."
-    }
-   }
-  },
-  "SplitInt64": {
-   "id": "SplitInt64",
-   "type": "object",
-   "description": "A representation of an int64, n, that is immune to precision loss when encoded in JSON.",
-   "properties": {
-    "lowBits": {
-     "type": "integer",
-     "description": "The low order bits: n & 0xffffffff.",
-     "format": "uint32"
-    },
-    "highBits": {
-     "type": "integer",
-     "description": "The high order bits, including the sign: n \u003e\u003e 32.",
-     "format": "int32"
-    }
-   }
-  },
-  "IntegerMean": {
-   "id": "IntegerMean",
-   "type": "object",
-   "description": "A representation of an integer mean metric contribution.",
-   "properties": {
-    "sum": {
-     "$ref": "SplitInt64",
-     "description": "The sum of all values being aggregated."
-    },
-    "count": {
-     "$ref": "SplitInt64",
-     "description": "The number of values being aggregated."
-    }
-   }
-  },
-  "FloatingPointMean": {
-   "id": "FloatingPointMean",
-   "type": "object",
-   "description": "A representation of a floating point mean metric contribution.",
-   "properties": {
-    "sum": {
-     "type": "number",
-     "description": "The sum of all values being aggregated.",
-     "format": "double"
-    },
-    "count": {
-     "$ref": "SplitInt64",
-     "description": "The number of values being aggregated."
-    }
-   }
-  },
-  "IntegerList": {
-   "id": "IntegerList",
-   "type": "object",
-   "description": "A metric value representing a list of integers.",
-   "properties": {
-    "elements": {
-     "type": "array",
-     "description": "Elements of the list.",
-     "items": {
-      "$ref": "SplitInt64"
-     }
-    }
-   }
-  },
-  "FloatingPointList": {
-   "id": "FloatingPointList",
-   "type": "object",
-   "description": "A metric value representing a list of floating point numbers.",
-   "properties": {
-    "elements": {
-     "type": "array",
-     "description": "Elements of the list.",
-     "items": {
-      "type": "number",
-      "format": "double"
-     }
-    }
-   }
-  },
-  "StringList": {
-   "id": "StringList",
-   "type": "object",
-   "description": "A metric value representing a list of strings.",
-   "properties": {
-    "elements": {
-     "type": "array",
-     "description": "Elements of the list.",
-     "items": {
+    "bearer_token": {
+      "location": "query",
+      "description": "OAuth bearer token.",
       "type": "string"
-     }
-    }
-   }
-  },
-  "DistributionUpdate": {
-   "id": "DistributionUpdate",
-   "type": "object",
-   "description": "A metric value representing a distribution.",
-   "properties": {
-    "min": {
-     "$ref": "SplitInt64",
-     "description": "The minimum value present in the distribution."
     },
-    "max": {
-     "$ref": "SplitInt64",
-     "description": "The maximum value present in the distribution."
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
     },
-    "count": {
-     "$ref": "SplitInt64",
-     "description": "The count of the number of elements present in the distribution."
+    "prettyPrint": {
+      "type": "boolean",
+      "default": "true",
+      "location": "query",
+      "description": "Returns response with indentations and line breaks."
     },
-    "sum": {
-     "$ref": "SplitInt64",
-     "description": "Use an int64 since we'd prefer the added precision. If overflow is a common problem we can detect it and use an additional int64 or a double."
+    "uploadType": {
+      "type": "string",
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\")."
     },
-    "sumOfSquares": {
-     "type": "number",
-     "description": "Use a double since the sum of squares is likely to overflow int64.",
-     "format": "double"
-    }
-   }
-  },
-  "ApproximateReportedProgress": {
-   "id": "ApproximateReportedProgress",
-   "type": "object",
-   "description": "A progress measurement of a WorkItem by a worker.",
-   "properties": {
-    "position": {
-     "$ref": "Position",
-     "description": "A Position within the work to represent a progress."
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
     },
-    "fractionConsumed": {
-     "type": "number",
-     "description": "Completion as fraction of the input consumed, from 0.0 (beginning, nothing consumed), to 1.0 (end of the input, entire input consumed).",
-     "format": "double"
+    "$.xgafv": {
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format."
     },
-    "remainingParallelism": {
-     "$ref": "ReportedParallelism",
-     "description": "Total amount of parallelism in the input of this task that remains, (i.e. can be delegated to this task and any new tasks via dynamic splitting). Always at least 1 for non-finished work items and 0 for finished. \"Amount of parallelism\" refers to how many non-empty parts of the input can be read in parallel. This does not necessarily equal number of records. An input that can be read in parallel down to the individual records is called \"perfectly splittable\". An example of non-perfectly parallelizable input is a block-compressed file format where a block of records has to be read as a whole, but different blocks can be read in parallel. Examples: * If we are processing record #30 (starting at 1) out of 50 in a perfectly splittable 50-record input, this value should be 21 (20 remaining + 1 current). * If we are reading through block 3 in a block-compressed file consisting of 5 blocks, this value should be 3 (since blocks 4 and 5 can be processed in parallel by new tasks via dynamic splitting and the current task remains processing block 3). * If we are reading through the last block in a block-compressed file, or reading or processing the last record in a perfectly splittable input, this value should be 1, because apart from the current task, no additional remainder can be split off."
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
     },
-    "consumedParallelism": {
-     "$ref": "ReportedParallelism",
-     "description": "Total amount of parallelism in the portion of input of this task that has already been consumed and is no longer active. In the first two examples above (see remaining_parallelism), the value should be 29 or 2 respectively. The sum of remaining_parallelism and consumed_parallelism should equal the total amount of parallelism in this work item. If specified, must be finite."
-    }
-   }
-  },
-  "Position": {
-   "id": "Position",
-   "type": "object",
-   "description": "Position defines a position within a collection of data. The value can be either the end position, a key (used with ordered collections), a byte offset, or a record index.",
-   "properties": {
-    "end": {
-     "type": "boolean",
-     "description": "Position is past all other positions. Also useful for the end position of an unbounded range."
+    "alt": {
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string"
     },
     "key": {
-     "type": "string",
-     "description": "Position is a string key, ordered lexicographically."
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
     },
-    "byteOffset": {
-     "type": "string",
-     "description": "Position is a byte offset.",
-     "format": "int64"
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
     },
-    "recordIndex": {
-     "type": "string",
-     "description": "Position is a record index.",
-     "format": "int64"
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
     },
-    "shufflePosition": {
-     "type": "string",
-     "description": "CloudPosition is a base64 encoded BatchShufflePosition (with FIXED sharding)."
-    },
-    "concatPosition": {
-     "$ref": "ConcatPosition",
-     "description": "CloudPosition is a concat position."
+    "pp": {
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
     }
-   }
   },
-  "ConcatPosition": {
-   "id": "ConcatPosition",
-   "type": "object",
-   "description": "A position that encapsulates an inner position and an index for the inner position. A ConcatPosition can be used by a reader of a source that encapsulates a set of other sources.",
-   "properties": {
-    "index": {
-     "type": "integer",
-     "description": "Index of the inner source.",
-     "format": "int32"
-    },
-    "position": {
-     "$ref": "Position",
-     "description": "Position within the inner source."
-    }
-   }
-  },
-  "ReportedParallelism": {
-   "id": "ReportedParallelism",
-   "type": "object",
-   "description": "Represents the level of parallelism in a WorkItem's input, reported by the worker.",
-   "properties": {
-    "isInfinite": {
-     "type": "boolean",
-     "description": "Specifies whether the parallelism is infinite. If true, \"value\" is ignored. Infinite parallelism means the service will assume that the work item can always be split into more non-empty work items by dynamic splitting. This is a work-around for lack of support for infinity by the current JSON-based Java RPC stack."
-    },
-    "value": {
-     "type": "number",
-     "description": "Specifies the level of parallelism in case it is finite.",
-     "format": "double"
-    }
-   }
-  },
-  "DynamicSourceSplit": {
-   "id": "DynamicSourceSplit",
-   "type": "object",
-   "description": "When a task splits using WorkItemStatus.dynamic_source_split, this message describes the two parts of the split relative to the description of the current task's input.",
-   "properties": {
-    "primary": {
-     "$ref": "DerivedSource",
-     "description": "Primary part (continued to be processed by worker). Specified relative to the previously-current source. Becomes current."
-    },
-    "residual": {
-     "$ref": "DerivedSource",
-     "description": "Residual part (returned to the pool of work). Specified relative to the previously-current source."
-    }
-   }
-  },
-  "DerivedSource": {
-   "id": "DerivedSource",
-   "type": "object",
-   "description": "Specification of one of the bundles produced as a result of splitting a Source (e.g. when executing a SourceSplitRequest, or when splitting an active task using WorkItemStatus.dynamic_source_split), relative to the source being split.",
-   "properties": {
-    "source": {
-     "$ref": "Source",
-     "description": "Specification of the source."
-    },
-    "derivationMode": {
-     "type": "string",
-     "description": "What source to base the produced source on (if any).",
-     "enum": [
-      "SOURCE_DERIVATION_MODE_UNKNOWN",
-      "SOURCE_DERIVATION_MODE_INDEPENDENT",
-      "SOURCE_DERIVATION_MODE_CHILD_OF_CURRENT",
-      "SOURCE_DERIVATION_MODE_SIBLING_OF_CURRENT"
-     ]
-    }
-   }
-  },
-  "Source": {
-   "id": "Source",
-   "type": "object",
-   "description": "A source that records can be read and decoded from.",
-   "properties": {
-    "spec": {
-     "type": "object",
-     "description": "The source to read from, plus its parameters.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "codec": {
-     "type": "object",
-     "description": "The codec to use to decode data read from the source.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "baseSpecs": {
-     "type": "array",
-     "description": "While splitting, sources may specify the produced bundles as differences against another source, in order to save backend-side memory and allow bigger jobs. For details, see SourceSplitRequest. To support this use case, the full set of parameters of the source is logically obtained by taking the latest explicitly specified value of each parameter in the order: base_specs (later items win), spec (overrides anything in base_specs).",
-     "items": {
+  "schemas": {
+    "ParDoInstruction": {
+      "description": "An instruction that does a ParDo operation.\nTakes one main input and zero or more side inputs, and produces\nzero or more outputs.\nRuns user code.",
       "type": "object",
-      "additionalProperties": {
-       "type": "any",
-       "description": "Properties of the object."
-      }
-     }
-    },
-    "metadata": {
-     "$ref": "SourceMetadata",
-     "description": "Optionally, metadata for this source can be supplied right away, avoiding a SourceGetMetadataOperation roundtrip (see SourceOperationRequest). This field is meaningful only in the Source objects populated by the user (e.g. when filling in a DerivedSource). Source objects supplied by the framework to the user don't have this field populated."
-    },
-    "doesNotNeedSplitting": {
-     "type": "boolean",
-     "description": "Setting this value to true hints to the framework that the source doesn't need splitting, and using SourceSplitRequest on it would yield SOURCE_SPLIT_OUTCOME_USE_CURRENT. E.g. a file splitter may set this to true when splitting a single file into a set of byte ranges of appropriate size, and set this to false when splitting a filepattern into individual files. However, for efficiency, a file splitter may decide to produce file subranges directly from the filepattern to avoid a splitting round-trip. See SourceSplitRequest for an overview of the splitting process. This field is meaningful only in the Source objects populated by the user (e.g. when filling in a DerivedSource). Source objects supplied by the framework to the user don't have this field populated."
-    }
-   }
-  },
-  "SourceMetadata": {
-   "id": "SourceMetadata",
-   "type": "object",
-   "description": "Metadata about a Source useful for automatically optimizing and tuning the pipeline, etc.",
-   "properties": {
-    "producesSortedKeys": {
-     "type": "boolean",
-     "description": "Whether this source is known to produce key/value pairs with the (encoded) keys in lexicographically sorted order."
-    },
-    "infinite": {
-     "type": "boolean",
-     "description": "Specifies that the size of this source is known to be infinite (this is a streaming source)."
-    },
-    "estimatedSizeBytes": {
-     "type": "string",
-     "description": "An estimate of the total size (in bytes) of the data that would be read from this source. This estimate is in terms of external storage size, before any decompression or other processing done by the reader.",
-     "format": "int64"
-    }
-   }
-  },
-  "SourceOperationResponse": {
-   "id": "SourceOperationResponse",
-   "type": "object",
-   "description": "The result of a SourceOperationRequest, specified in ReportWorkItemStatusRequest.source_operation when the work item is completed.",
-   "properties": {
-    "split": {
-     "$ref": "SourceSplitResponse",
-     "description": "A response to a request to split a source."
-    },
-    "getMetadata": {
-     "$ref": "SourceGetMetadataResponse",
-     "description": "A response to a request to get metadata about a source."
-    }
-   }
-  },
-  "SourceSplitResponse": {
-   "id": "SourceSplitResponse",
-   "type": "object",
-   "description": "The response to a SourceSplitRequest.",
-   "properties": {
-    "outcome": {
-     "type": "string",
-     "description": "Indicates whether splitting happened and produced a list of bundles. If this is USE_CURRENT_SOURCE_AS_IS, the current source should be processed \"as is\" without splitting. \"bundles\" is ignored in this case. If this is SPLITTING_HAPPENED, then \"bundles\" contains a list of bundles into which the source was split.",
-     "enum": [
-      "SOURCE_SPLIT_OUTCOME_UNKNOWN",
-      "SOURCE_SPLIT_OUTCOME_USE_CURRENT",
-      "SOURCE_SPLIT_OUTCOME_SPLITTING_HAPPENED"
-     ]
-    },
-    "bundles": {
-     "type": "array",
-     "description": "If outcome is SPLITTING_HAPPENED, then this is a list of bundles into which the source was split. Otherwise this field is ignored. This list can be empty, which means the source represents an empty input.",
-     "items": {
-      "$ref": "DerivedSource"
-     }
-    },
-    "shards": {
-     "type": "array",
-     "description": "DEPRECATED in favor of bundles.",
-     "items": {
-      "$ref": "SourceSplitShard"
-     }
-    }
-   }
-  },
-  "SourceSplitShard": {
-   "id": "SourceSplitShard",
-   "type": "object",
-   "description": "DEPRECATED in favor of DerivedSource.",
-   "properties": {
-    "source": {
-     "$ref": "Source",
-     "description": "DEPRECATED"
-    },
-    "derivationMode": {
-     "type": "string",
-     "description": "DEPRECATED",
-     "enum": [
-      "SOURCE_DERIVATION_MODE_UNKNOWN",
-      "SOURCE_DERIVATION_MODE_INDEPENDENT",
-      "SOURCE_DERIVATION_MODE_CHILD_OF_CURRENT",
-      "SOURCE_DERIVATION_MODE_SIBLING_OF_CURRENT"
-     ]
-    }
-   }
-  },
-  "SourceGetMetadataResponse": {
-   "id": "SourceGetMetadataResponse",
-   "type": "object",
-   "description": "The result of a SourceGetMetadataOperation.",
-   "properties": {
-    "metadata": {
-     "$ref": "SourceMetadata",
-     "description": "The computed metadata."
-    }
-   }
-  },
-  "SourceFork": {
-   "id": "SourceFork",
-   "type": "object",
-   "description": "DEPRECATED in favor of DynamicSourceSplit.",
-   "properties": {
-    "primary": {
-     "$ref": "SourceSplitShard",
-     "description": "DEPRECATED"
-    },
-    "residual": {
-     "$ref": "SourceSplitShard",
-     "description": "DEPRECATED"
-    },
-    "primarySource": {
-     "$ref": "DerivedSource",
-     "description": "DEPRECATED"
-    },
-    "residualSource": {
-     "$ref": "DerivedSource",
-     "description": "DEPRECATED"
-    }
-   }
-  },
-  "ApproximateProgress": {
-   "id": "ApproximateProgress",
-   "type": "object",
-   "description": "Obsolete in favor of ApproximateReportedProgress and ApproximateSplitRequest.",
-   "properties": {
-    "position": {
-     "$ref": "Position",
-     "description": "Obsolete."
-    },
-    "percentComplete": {
-     "type": "number",
-     "description": "Obsolete.",
-     "format": "float"
-    },
-    "remainingTime": {
-     "type": "string",
-     "description": "Obsolete."
-    }
-   }
-  },
-  "ReportWorkItemStatusResponse": {
-   "id": "ReportWorkItemStatusResponse",
-   "type": "object",
-   "description": "Response from a request to report the status of WorkItems.",
-   "properties": {
-    "workItemServiceStates": {
-     "type": "array",
-     "description": "A set of messages indicating the service-side state for each WorkItem whose status was reported, in the same order as the WorkItemStatus messages in the ReportWorkItemStatusRequest which resulting in this response.",
-     "items": {
-      "$ref": "WorkItemServiceState"
-     }
-    }
-   }
-  },
-  "WorkItemServiceState": {
-   "id": "WorkItemServiceState",
-   "type": "object",
-   "description": "The Dataflow service's idea of the current state of a WorkItem being processed by a worker.",
-   "properties": {
-    "splitRequest": {
-     "$ref": "ApproximateSplitRequest",
-     "description": "The progress point in the WorkItem where the Dataflow service suggests that the worker truncate the task."
-    },
-    "leaseExpireTime": {
-     "type": "string",
-     "description": "Time at which the current lease will expire."
-    },
-    "reportStatusInterval": {
-     "type": "string",
-     "description": "New recommended reporting interval."
-    },
-    "harnessData": {
-     "type": "object",
-     "description": "Other data returned by the service, specific to the particular worker harness.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "nextReportIndex": {
-     "type": "string",
-     "description": "The index value to use for the next report sent by the worker. Note: If the report call fails for whatever reason, the worker should reuse this index for subsequent report attempts.",
-     "format": "int64"
-    },
-    "metricShortId": {
-     "type": "array",
-     "description": "The short ids that workers should use in subsequent metric updates. Workers should strive to use short ids whenever possible, but it is ok to request the short_id again if a worker lost track of it (e.g. if the worker is recovering from a crash). NOTE: it is possible that the response may have short ids for a subset of the metrics.",
-     "items": {
-      "$ref": "MetricShortId"
-     }
-    },
-    "suggestedStopPosition": {
-     "$ref": "Position",
-     "description": "Obsolete, always empty."
-    },
-    "suggestedStopPoint": {
-     "$ref": "ApproximateProgress",
-     "description": "DEPRECATED in favor of split_request."
-    }
-   }
-  },
-  "ApproximateSplitRequest": {
-   "id": "ApproximateSplitRequest",
-   "type": "object",
-   "description": "A suggestion by the service to the worker to dynamically split the WorkItem.",
-   "properties": {
-    "position": {
-     "$ref": "Position",
-     "description": "A Position at which to split the work item."
-    },
-    "fractionConsumed": {
-     "type": "number",
-     "description": "A fraction at which to split the work item, from 0.0 (beginning of the input) to 1.0 (end of the input).",
-     "format": "double"
-    }
-   }
-  },
-  "MetricShortId": {
-   "id": "MetricShortId",
-   "type": "object",
-   "description": "The metric short id is returned to the user alongside an offset into ReportWorkItemStatusRequest",
-   "properties": {
-    "metricIndex": {
-     "type": "integer",
-     "description": "The index of the corresponding metric in the ReportWorkItemStatusRequest. Required.",
-     "format": "int32"
-    },
-    "shortId": {
-     "type": "string",
-     "description": "The service-generated short identifier for the metric.",
-     "format": "int64"
-    }
-   }
-  },
-  "LeaseWorkItemRequest": {
-   "id": "LeaseWorkItemRequest",
-   "type": "object",
-   "description": "Request to lease WorkItems.",
-   "properties": {
-    "workItemTypes": {
-     "type": "array",
-     "description": "Filter for WorkItem type.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "workerCapabilities": {
-     "type": "array",
-     "description": "Worker capabilities. WorkItems might be limited to workers with specific capabilities.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "requestedLeaseDuration": {
-     "type": "string",
-     "description": "The initial lease period."
-    },
-    "currentWorkerTime": {
-     "type": "string",
-     "description": "The current timestamp at the worker."
-    },
-    "workerId": {
-     "type": "string",
-     "description": "Identifies the worker leasing work -- typically the ID of the virtual machine running the worker."
-    },
-    "location": {
-     "type": "string",
-     "description": "The location which contains the WorkItem's job."
-    }
-   }
-  },
-  "LeaseWorkItemResponse": {
-   "id": "LeaseWorkItemResponse",
-   "type": "object",
-   "description": "Response to a request to lease WorkItems.",
-   "properties": {
-    "workItems": {
-     "type": "array",
-     "description": "A list of the leased WorkItems.",
-     "items": {
-      "$ref": "WorkItem"
-     }
-    }
-   }
-  },
-  "WorkItem": {
-   "id": "WorkItem",
-   "type": "object",
-   "description": "WorkItem represents basic information about a WorkItem to be executed in the cloud.",
-   "properties": {
-    "id": {
-     "type": "string",
-     "description": "Identifies this WorkItem.",
-     "format": "int64"
-    },
-    "projectId": {
-     "type": "string",
-     "description": "Identifies the cloud project this WorkItem belongs to."
-    },
-    "jobId": {
-     "type": "string",
-     "description": "Identifies the workflow job this WorkItem belongs to."
-    },
-    "packages": {
-     "type": "array",
-     "description": "Any required packages that need to be fetched in order to execute this WorkItem.",
-     "items": {
-      "$ref": "Package"
-     }
-    },
-    "mapTask": {
-     "$ref": "MapTask",
-     "description": "Additional information for MapTask WorkItems."
-    },
-    "seqMapTask": {
-     "$ref": "SeqMapTask",
-     "description": "Additional information for SeqMapTask WorkItems."
-    },
-    "shellTask": {
-     "$ref": "ShellTask",
-     "description": "Additional information for ShellTask WorkItems."
-    },
-    "streamingSetupTask": {
-     "$ref": "StreamingSetupTask",
-     "description": "Additional information for StreamingSetupTask WorkItems."
-    },
-    "sourceOperationTask": {
-     "$ref": "SourceOperationRequest",
-     "description": "Additional information for source operation WorkItems."
-    },
-    "streamingComputationTask": {
-     "$ref": "StreamingComputationTask",
-     "description": "Additional information for StreamingComputationTask WorkItems."
-    },
-    "streamingConfigTask": {
-     "$ref": "StreamingConfigTask",
-     "description": "Additional information for StreamingConfigTask WorkItems."
-    },
-    "reportStatusInterval": {
-     "type": "string",
-     "description": "Recommended reporting interval."
-    },
-    "leaseExpireTime": {
-     "type": "string",
-     "description": "Time when the lease on this Work will expire."
-    },
-    "configuration": {
-     "type": "string",
-     "description": "Work item-specific configuration as an opaque blob."
-    },
-    "initialReportIndex": {
-     "type": "string",
-     "description": "The initial index to use when reporting the status of the WorkItem.",
-     "format": "int64"
-    }
-   }
-  },
-  "MapTask": {
-   "id": "MapTask",
-   "type": "object",
-   "description": "MapTask consists of an ordered set of instructions, each of which describes one particular low-level operation for the worker to perform in order to accomplish the MapTask's WorkItem. Each instruction must appear in the list before any instructions which depends on its output.",
-   "properties": {
-    "instructions": {
-     "type": "array",
-     "description": "The instructions in the MapTask.",
-     "items": {
-      "$ref": "ParallelInstruction"
-     }
-    },
-    "systemName": {
-     "type": "string",
-     "description": "System-defined name of this MapTask. Unique across the workflow."
-    },
-    "stageName": {
-     "type": "string",
-     "description": "System-defined name of the stage containing this MapTask. Unique across the workflow."
-    }
-   }
-  },
-  "ParallelInstruction": {
-   "id": "ParallelInstruction",
-   "type": "object",
-   "description": "Describes a particular operation comprising a MapTask.",
-   "properties": {
-    "systemName": {
-     "type": "string",
-     "description": "System-defined name of this operation. Unique across the workflow."
-    },
-    "name": {
-     "type": "string",
-     "description": "User-provided name of this operation."
-    },
-    "originalName": {
-     "type": "string",
-     "description": "System-defined name for the operation in the original workflow graph."
-    },
-    "read": {
-     "$ref": "ReadInstruction",
-     "description": "Additional information for Read instructions."
-    },
-    "write": {
-     "$ref": "WriteInstruction",
-     "description": "Additional information for Write instructions."
-    },
-    "parDo": {
-     "$ref": "ParDoInstruction",
-     "description": "Additional information for ParDo instructions."
-    },
-    "partialGroupByKey": {
-     "$ref": "PartialGroupByKeyInstruction",
-     "description": "Additional information for PartialGroupByKey instructions."
-    },
-    "flatten": {
-     "$ref": "FlattenInstruction",
-     "description": "Additional information for Flatten instructions."
-    },
-    "outputs": {
-     "type": "array",
-     "description": "Describes the outputs of the instruction.",
-     "items": {
-      "$ref": "InstructionOutput"
-     }
-    }
-   }
-  },
-  "ReadInstruction": {
-   "id": "ReadInstruction",
-   "type": "object",
-   "description": "An instruction that reads records. Takes no inputs, produces one output.",
-   "properties": {
-    "source": {
-     "$ref": "Source",
-     "description": "The source to read from."
-    }
-   }
-  },
-  "WriteInstruction": {
-   "id": "WriteInstruction",
-   "type": "object",
-   "description": "An instruction that writes records. Takes one input, produces no outputs.",
-   "properties": {
-    "input": {
-     "$ref": "InstructionInput",
-     "description": "The input."
-    },
-    "sink": {
-     "$ref": "Sink",
-     "description": "The sink to write to."
-    }
-   }
-  },
-  "InstructionInput": {
-   "id": "InstructionInput",
-   "type": "object",
-   "description": "An input of an instruction, as a reference to an output of a producer instruction.",
-   "properties": {
-    "producerInstructionIndex": {
-     "type": "integer",
-     "description": "The index (origin zero) of the parallel instruction that produces the output to be consumed by this input. This index is relative to the list of instructions in this input's instruction's containing MapTask.",
-     "format": "int32"
-    },
-    "outputNum": {
-     "type": "integer",
-     "description": "The output index (origin zero) within the producer.",
-     "format": "int32"
-    }
-   }
-  },
-  "Sink": {
-   "id": "Sink",
-   "type": "object",
-   "description": "A sink that records can be encoded and written to.",
-   "properties": {
-    "spec": {
-     "type": "object",
-     "description": "The sink to write to, plus its parameters.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "codec": {
-     "type": "object",
-     "description": "The codec to use to encode data written to the sink.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    }
-   }
-  },
-  "ParDoInstruction": {
-   "id": "ParDoInstruction",
-   "type": "object",
-   "description": "An instruction that does a ParDo operation. Takes one main input and zero or more side inputs, and produces zero or more outputs. Runs user code.",
-   "properties": {
-    "input": {
-     "$ref": "InstructionInput",
-     "description": "The input."
-    },
-    "sideInputs": {
-     "type": "array",
-     "description": "Zero or more side inputs.",
-     "items": {
-      "$ref": "SideInputInfo"
-     }
-    },
-    "userFn": {
-     "type": "object",
-     "description": "The user function to invoke.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "numOutputs": {
-     "type": "integer",
-     "description": "The number of outputs.",
-     "format": "int32"
-    },
-    "multiOutputInfos": {
-     "type": "array",
-     "description": "Information about each of the outputs, if user_fn is a MultiDoFn.",
-     "items": {
-      "$ref": "MultiOutputInfo"
-     }
-    }
-   }
-  },
-  "SideInputInfo": {
-   "id": "SideInputInfo",
-   "type": "object",
-   "description": "Information about a side input of a DoFn or an input of a SeqDoFn.",
-   "properties": {
-    "sources": {
-     "type": "array",
-     "description": "The source(s) to read element(s) from to get the value of this side input. If more than one source, then the elements are taken from the sources, in the specified order if order matters. At least one source is required.",
-     "items": {
-      "$ref": "Source"
-     }
-    },
-    "kind": {
-     "type": "object",
-     "description": "How to interpret the source element(s) as a side input value.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "tag": {
-     "type": "string",
-     "description": "The id of the tag the user code will access this side input by; this should correspond to the tag of some MultiOutputInfo."
-    }
-   }
-  },
-  "MultiOutputInfo": {
-   "id": "MultiOutputInfo",
-   "type": "object",
-   "description": "Information about an output of a multi-output DoFn.",
-   "properties": {
-    "tag": {
-     "type": "string",
-     "description": "The id of the tag the user code will emit to this output by; this should correspond to the tag of some SideInputInfo."
-    }
-   }
-  },
-  "PartialGroupByKeyInstruction": {
-   "id": "PartialGroupByKeyInstruction",
-   "type": "object",
-   "description": "An instruction that does a partial group-by-key. One input and one output.",
-   "properties": {
-    "input": {
-     "$ref": "InstructionInput",
-     "description": "Describes the input to the partial group-by-key instruction."
-    },
-    "inputElementCodec": {
-     "type": "object",
-     "description": "The codec to use for interpreting an element in the input PTable.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "valueCombiningFn": {
-     "type": "object",
-     "description": "The value combining function to invoke.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "sideInputs": {
-     "type": "array",
-     "description": "Zero or more side inputs.",
-     "items": {
-      "$ref": "SideInputInfo"
-     }
-    },
-    "originalCombineValuesStepName": {
-     "type": "string",
-     "description": "If this instruction includes a combining function, this is the name of the CombineValues instruction lifted into this instruction."
-    },
-    "originalCombineValuesInputStoreName": {
-     "type": "string",
-     "description": "If this instruction includes a combining function this is the name of the intermediate store between the GBK and the CombineValues."
-    }
-   }
-  },
-  "FlattenInstruction": {
-   "id": "FlattenInstruction",
-   "type": "object",
-   "description": "An instruction that copies its inputs (zero or more) to its (single) output.",
-   "properties": {
-    "inputs": {
-     "type": "array",
-     "description": "Describes the inputs to the flatten instruction.",
-     "items": {
-      "$ref": "InstructionInput"
-     }
-    }
-   }
-  },
-  "InstructionOutput": {
-   "id": "InstructionOutput",
-   "type": "object",
-   "description": "An output of an instruction.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "The user-provided name of this output."
-    },
-    "systemName": {
-     "type": "string",
-     "description": "System-defined name of this output. Unique across the workflow."
-    },
-    "originalName": {
-     "type": "string",
-     "description": "System-defined name for this output in the original workflow graph. Outputs that do not contribute to an original instruction do not set this."
-    },
-    "codec": {
-     "type": "object",
-     "description": "The codec to use to encode data being written via this output.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "onlyCountKeyBytes": {
-     "type": "boolean",
-     "description": "For system-generated byte and mean byte metrics, certain instructions should only report the key size."
-    },
-    "onlyCountValueBytes": {
-     "type": "boolean",
-     "description": "For system-generated byte and mean byte metrics, certain instructions should only report the value size."
-    }
-   }
-  },
-  "SeqMapTask": {
-   "id": "SeqMapTask",
-   "type": "object",
-   "description": "Describes a particular function to invoke.",
-   "properties": {
-    "inputs": {
-     "type": "array",
-     "description": "Information about each of the inputs.",
-     "items": {
-      "$ref": "SideInputInfo"
-     }
-    },
-    "userFn": {
-     "type": "object",
-     "description": "The user function to invoke.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    },
-    "outputInfos": {
-     "type": "array",
-     "description": "Information about each of the outputs.",
-     "items": {
-      "$ref": "SeqMapTaskOutputInfo"
-     }
-    },
-    "name": {
-     "type": "string",
-     "description": "The user-provided name of the SeqDo operation."
-    },
-    "systemName": {
-     "type": "string",
-     "description": "System-defined name of the SeqDo operation. Unique across the workflow."
-    },
-    "stageName": {
-     "type": "string",
-     "description": "System-defined name of the stage containing the SeqDo operation. Unique across the workflow."
-    }
-   }
-  },
-  "SeqMapTaskOutputInfo": {
-   "id": "SeqMapTaskOutputInfo",
-   "type": "object",
-   "description": "Information about an output of a SeqMapTask.",
-   "properties": {
-    "tag": {
-     "type": "string",
-     "description": "The id of the TupleTag the user code will tag the output value by."
-    },
-    "sink": {
-     "$ref": "Sink",
-     "description": "The sink to write the output value to."
-    }
-   }
-  },
-  "ShellTask": {
-   "id": "ShellTask",
-   "type": "object",
-   "description": "A task which consists of a shell command for the worker to execute.",
-   "properties": {
-    "command": {
-     "type": "string",
-     "description": "The shell command to run."
-    },
-    "exitCode": {
-     "type": "integer",
-     "description": "Exit code for the task.",
-     "format": "int32"
-    }
-   }
-  },
-  "StreamingSetupTask": {
-   "id": "StreamingSetupTask",
-   "type": "object",
-   "description": "A task which initializes part of a streaming Dataflow job.",
-   "properties": {
-    "receiveWorkPort": {
-     "type": "integer",
-     "description": "The TCP port on which the worker should listen for messages from other streaming computation workers.",
-     "format": "int32"
-    },
-    "workerHarnessPort": {
-     "type": "integer",
-     "description": "The TCP port used by the worker to communicate with the Dataflow worker harness.",
-     "format": "int32"
-    },
-    "streamingComputationTopology": {
-     "$ref": "TopologyConfig",
-     "description": "The global topology of the streaming Dataflow job."
-    },
-    "drain": {
-     "type": "boolean",
-     "description": "The user has requested drain."
-    }
-   }
-  },
-  "TopologyConfig": {
-   "id": "TopologyConfig",
-   "type": "object",
-   "description": "Global topology of the streaming Dataflow job, including all computations and their sharded locations.",
-   "properties": {
-    "computations": {
-     "type": "array",
-     "description": "The computations associated with a streaming Dataflow job.",
-     "items": {
-      "$ref": "ComputationTopology"
-     }
-    },
-    "dataDiskAssignments": {
-     "type": "array",
-     "description": "The disks assigned to a streaming Dataflow job.",
-     "items": {
-      "$ref": "DataDiskAssignment"
-     }
-    },
-    "userStageToComputationNameMap": {
-     "type": "object",
-     "description": "Maps user stage names to stable computation names.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "forwardingKeyBits": {
-     "type": "integer",
-     "description": "The size (in bits) of keys that will be assigned to source messages.",
-     "format": "int32"
-    },
-    "persistentStateVersion": {
-     "type": "integer",
-     "description": "Version number for persistent state.",
-     "format": "int32"
-    }
-   }
-  },
-  "ComputationTopology": {
-   "id": "ComputationTopology",
-   "type": "object",
-   "description": "All configuration data for a particular Computation.",
-   "properties": {
-    "systemStageName": {
-     "type": "string",
-     "description": "The system stage name."
-    },
-    "computationId": {
-     "type": "string",
-     "description": "The ID of the computation."
-    },
-    "userStageName": {
-     "type": "string",
-     "description": "The user stage name."
-    },
-    "keyRanges": {
-     "type": "array",
-     "description": "The key ranges processed by the computation.",
-     "items": {
-      "$ref": "KeyRangeLocation"
-     }
-    },
-    "inputs": {
-     "type": "array",
-     "description": "The inputs to the computation.",
-     "items": {
-      "$ref": "StreamLocation"
-     }
-    },
-    "outputs": {
-     "type": "array",
-     "description": "The outputs from the computation.",
-     "items": {
-      "$ref": "StreamLocation"
-     }
-    },
-    "stateFamilies": {
-     "type": "array",
-     "description": "The state family values.",
-     "items": {
-      "$ref": "StateFamilyConfig"
-     }
-    }
-   }
-  },
-  "KeyRangeLocation": {
-   "id": "KeyRangeLocation",
-   "type": "object",
-   "description": "Location information for a specific key-range of a sharded computation. Currently we only support UTF-8 character splits to simplify encoding into JSON.",
-   "properties": {
-    "start": {
-     "type": "string",
-     "description": "The start (inclusive) of the key range."
-    },
-    "end": {
-     "type": "string",
-     "description": "The end (exclusive) of the key range."
-    },
-    "deliveryEndpoint": {
-     "type": "string",
-     "description": "The physical location of this range assignment to be used for streaming computation cross-worker message delivery."
-    },
-    "persistentDirectory": {
-     "type": "string",
-     "description": "The location of the persistent state for this range, as a persistent directory in the worker local filesystem."
-    },
-    "dataDisk": {
-     "type": "string",
-     "description": "The name of the data disk where data for this range is stored. This name is local to the Google Cloud Platform project and uniquely identifies the disk within that project, for example \"myproject-1014-104817-4c2-harness-0-disk-1\"."
-    }
-   }
-  },
-  "StreamLocation": {
-   "id": "StreamLocation",
-   "type": "object",
-   "description": "Describes a stream of data, either as input to be processed or as output of a streaming Dataflow job.",
-   "properties": {
-    "streamingStageLocation": {
-     "$ref": "StreamingStageLocation",
-     "description": "The stream is part of another computation within the current streaming Dataflow job."
-    },
-    "pubsubLocation": {
-     "$ref": "PubsubLocation",
-     "description": "The stream is a pubsub stream."
-    },
-    "sideInputLocation": {
-     "$ref": "StreamingSideInputLocation",
-     "description": "The stream is a streaming side input."
-    },
-    "customSourceLocation": {
-     "$ref": "CustomSourceLocation",
-     "description": "The stream is a custom source."
-    }
-   }
-  },
-  "StreamingStageLocation": {
-   "id": "StreamingStageLocation",
-   "type": "object",
-   "description": "Identifies the location of a streaming computation stage, for stage-to-stage communication.",
-   "properties": {
-    "streamId": {
-     "type": "string",
-     "description": "Identifies the particular stream within the streaming Dataflow job."
-    }
-   }
-  },
-  "PubsubLocation": {
-   "id": "PubsubLocation",
-   "type": "object",
-   "description": "Identifies a pubsub location to use for transferring data into or out of a streaming Dataflow job.",
-   "properties": {
-    "topic": {
-     "type": "string",
-     "description": "A pubsub topic, in the form of \"pubsub.googleapis.com/topics/\n/\""
-    },
-    "subscription": {
-     "type": "string",
-     "description": "A pubsub subscription, in the form of \"pubsub.googleapis.com/subscriptions/\n/\""
-    },
-    "timestampLabel": {
-     "type": "string",
-     "description": "If set, contains a pubsub label from which to extract record timestamps. If left empty, record timestamps will be generated upon arrival."
-    },
-    "idLabel": {
-     "type": "string",
-     "description": "If set, contains a pubsub label from which to extract record ids. If left empty, record deduplication will be strictly best effort."
-    },
-    "dropLateData": {
-     "type": "boolean",
-     "description": "Indicates whether the pipeline allows late-arriving data."
-    },
-    "trackingSubscription": {
-     "type": "string",
-     "description": "If set, specifies the pubsub subscription that will be used for tracking custom time timestamps for watermark estimation."
-    },
-    "withAttributes": {
-     "type": "boolean",
-     "description": "If true, then the client has requested to get pubsub attributes."
-    }
-   }
-  },
-  "StreamingSideInputLocation": {
-   "id": "StreamingSideInputLocation",
-   "type": "object",
-   "description": "Identifies the location of a streaming side input.",
-   "properties": {
-    "tag": {
-     "type": "string",
-     "description": "Identifies the particular side input within the streaming Dataflow job."
-    },
-    "stateFamily": {
-     "type": "string",
-     "description": "Identifies the state family where this side input is stored."
-    }
-   }
-  },
-  "CustomSourceLocation": {
-   "id": "CustomSourceLocation",
-   "type": "object",
-   "description": "Identifies the location of a custom souce.",
-   "properties": {
-    "stateful": {
-     "type": "boolean",
-     "description": "Whether this source is stateful."
-    }
-   }
-  },
-  "StateFamilyConfig": {
-   "id": "StateFamilyConfig",
-   "type": "object",
-   "description": "State family configuration.",
-   "properties": {
-    "stateFamily": {
-     "type": "string",
-     "description": "The state family value."
-    },
-    "isRead": {
-     "type": "boolean",
-     "description": "If true, this family corresponds to a read operation."
-    }
-   }
-  },
-  "DataDiskAssignment": {
-   "id": "DataDiskAssignment",
-   "type": "object",
-   "description": "Data disk assignment for a given VM instance.",
-   "properties": {
-    "vmInstance": {
-     "type": "string",
-     "description": "VM instance name the data disks mounted to, for example \"myproject-1014-104817-4c2-harness-0\"."
-    },
-    "dataDisks": {
-     "type": "array",
-     "description": "Mounted data disks. The order is important a data disk's 0-based index in this list defines which persistent directory the disk is mounted to, for example the list of { \"myproject-1014-104817-4c2-harness-0-disk-0\" }, { \"myproject-1014-104817-4c2-harness-0-disk-1\" }.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "SourceOperationRequest": {
-   "id": "SourceOperationRequest",
-   "type": "object",
-   "description": "A work item that represents the different operations that can be performed on a user-defined Source specification.",
-   "properties": {
-    "split": {
-     "$ref": "SourceSplitRequest",
-     "description": "Information about a request to split a source."
-    },
-    "getMetadata": {
-     "$ref": "SourceGetMetadataRequest",
-     "description": "Information about a request to get metadata about a source."
-    }
-   }
-  },
-  "SourceSplitRequest": {
-   "id": "SourceSplitRequest",
-   "type": "object",
-   "description": "Represents the operation to split a high-level Source specification into bundles (parts for parallel processing). At a high level, splitting of a source into bundles happens as follows: SourceSplitRequest is applied to the source. If it returns SOURCE_SPLIT_OUTCOME_USE_CURRENT, no further splitting happens and the source is used \"as is\". Otherwise, splitting is applied recursively to each produced DerivedSource. As an optimization, for any Source, if its does_not_need_splitting is true, the framework assumes that splitting this source would return SOURCE_SPLIT_OUTCOME_USE_CURRENT, and doesn't initiate a SourceSplitRequest. This applies both to the initial source being split and to bundles produced from it.",
-   "properties": {
-    "source": {
-     "$ref": "Source",
-     "description": "Specification of the source to be split."
-    },
-    "options": {
-     "$ref": "SourceSplitOptions",
-     "description": "Hints for tuning the splitting process."
-    }
-   }
-  },
-  "SourceSplitOptions": {
-   "id": "SourceSplitOptions",
-   "type": "object",
-   "description": "Hints for splitting a Source into bundles (parts for parallel processing) using SourceSplitRequest.",
-   "properties": {
-    "desiredBundleSizeBytes": {
-     "type": "string",
-     "description": "The source should be split into a set of bundles where the estimated size of each is approximately this many bytes.",
-     "format": "int64"
-    },
-    "desiredShardSizeBytes": {
-     "type": "string",
-     "description": "DEPRECATED in favor of desired_bundle_size_bytes.",
-     "format": "int64"
-    }
-   }
-  },
-  "SourceGetMetadataRequest": {
-   "id": "SourceGetMetadataRequest",
-   "type": "object",
-   "description": "A request to compute the SourceMetadata of a Source.",
-   "properties": {
-    "source": {
-     "$ref": "Source",
-     "description": "Specification of the source whose metadata should be computed."
-    }
-   }
-  },
-  "StreamingComputationTask": {
-   "id": "StreamingComputationTask",
-   "type": "object",
-   "description": "A task which describes what action should be performed for the specified streaming computation ranges.",
-   "properties": {
-    "taskType": {
-     "type": "string",
-     "description": "A type of streaming computation task.",
-     "enum": [
-      "STREAMING_COMPUTATION_TASK_UNKNOWN",
-      "STREAMING_COMPUTATION_TASK_STOP",
-      "STREAMING_COMPUTATION_TASK_START"
-     ]
-    },
-    "dataDisks": {
-     "type": "array",
-     "description": "Describes the set of data disks this task should apply to.",
-     "items": {
-      "$ref": "MountedDataDisk"
-     }
-    },
-    "computationRanges": {
-     "type": "array",
-     "description": "Contains ranges of a streaming computation this task should apply to.",
-     "items": {
-      "$ref": "StreamingComputationRanges"
-     }
-    }
-   }
-  },
-  "MountedDataDisk": {
-   "id": "MountedDataDisk",
-   "type": "object",
-   "description": "Describes mounted data disk.",
-   "properties": {
-    "dataDisk": {
-     "type": "string",
-     "description": "The name of the data disk. This name is local to the Google Cloud Platform project and uniquely identifies the disk within that project, for example \"myproject-1014-104817-4c2-harness-0-disk-1\"."
-    }
-   }
-  },
-  "StreamingComputationRanges": {
-   "id": "StreamingComputationRanges",
-   "type": "object",
-   "description": "Describes full or partial data disk assignment information of the computation ranges.",
-   "properties": {
-    "computationId": {
-     "type": "string",
-     "description": "The ID of the computation."
-    },
-    "rangeAssignments": {
-     "type": "array",
-     "description": "Data disk assignments for ranges from this computation.",
-     "items": {
-      "$ref": "KeyRangeDataDiskAssignment"
-     }
-    }
-   }
-  },
-  "KeyRangeDataDiskAssignment": {
-   "id": "KeyRangeDataDiskAssignment",
-   "type": "object",
-   "description": "Data disk assignment information for a specific key-range of a sharded computation. Currently we only support UTF-8 character splits to simplify encoding into JSON.",
-   "properties": {
-    "start": {
-     "type": "string",
-     "description": "The start (inclusive) of the key range."
-    },
-    "end": {
-     "type": "string",
-     "description": "The end (exclusive) of the key range."
-    },
-    "dataDisk": {
-     "type": "string",
-     "description": "The name of the data disk where data for this range is stored. This name is local to the Google Cloud Platform project and uniquely identifies the disk within that project, for example \"myproject-1014-104817-4c2-harness-0-disk-1\"."
-    }
-   }
-  },
-  "StreamingConfigTask": {
-   "id": "StreamingConfigTask",
-   "type": "object",
-   "description": "A task that carries configuration information for streaming computations.",
-   "properties": {
-    "streamingComputationConfigs": {
-     "type": "array",
-     "description": "Set of computation configuration information.",
-     "items": {
-      "$ref": "StreamingComputationConfig"
-     }
-    },
-    "userStepToStateFamilyNameMap": {
-     "type": "object",
-     "description": "Map from user step names to state families.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "StreamingComputationConfig": {
-   "id": "StreamingComputationConfig",
-   "type": "object",
-   "description": "Configuration information for a single streaming computation.",
-   "properties": {
-    "computationId": {
-     "type": "string",
-     "description": "Unique identifier for this computation."
-    },
-    "systemName": {
-     "type": "string",
-     "description": "System defined name for this computation."
-    },
-    "stageName": {
-     "type": "string",
-     "description": "Stage name of this computation."
-    },
-    "instructions": {
-     "type": "array",
-     "description": "Instructions that comprise the computation.",
-     "items": {
-      "$ref": "ParallelInstruction"
-     }
-    }
-   }
-  },
-  "SendWorkerMessagesRequest": {
-   "id": "SendWorkerMessagesRequest",
-   "type": "object",
-   "description": "A request for sending worker messages to the service.",
-   "properties": {
-    "workerMessages": {
-     "type": "array",
-     "description": "The WorkerMessages to send.",
-     "items": {
-      "$ref": "WorkerMessage"
-     }
-    }
-   }
-  },
-  "WorkerMessage": {
-   "id": "WorkerMessage",
-   "type": "object",
-   "description": "WorkerMessage provides information to the backend about a worker.",
-   "properties": {
-    "labels": {
-     "type": "object",
-     "description": "Labels are used to group WorkerMessages. For example, a worker_message about a particular container might have the labels: { \"JOB_ID\": \"2015-04-22\", \"WORKER_ID\": \"wordcount-vm-2015…\" \"CONTAINER_TYPE\": \"worker\", \"CONTAINER_ID\": \"ac1234def\"} Label tags typically correspond to Label enum values. However, for ease of development other strings can be used as tags. LABEL_UNSPECIFIED should not be used here.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "time": {
-     "type": "string",
-     "description": "The timestamp of the worker_message."
-    },
-    "workerHealthReport": {
-     "$ref": "WorkerHealthReport",
-     "description": "The health of a worker."
-    },
-    "workerMessageCode": {
-     "$ref": "WorkerMessageCode",
-     "description": "A worker message code."
-    },
-    "workerMetrics": {
-     "$ref": "ResourceUtilizationReport",
-     "description": "Resource metrics reported by workers."
-    }
-   }
-  },
-  "WorkerHealthReport": {
-   "id": "WorkerHealthReport",
-   "type": "object",
-   "description": "WorkerHealthReport contains information about the health of a worker. The VM should be identified by the labels attached to the WorkerMessage that this health ping belongs to.",
-   "properties": {
-    "vmIsHealthy": {
-     "type": "boolean",
-     "description": "Whether the VM is healthy."
-    },
-    "vmStartupTime": {
-     "type": "string",
-     "description": "The time the VM was booted."
-    },
-    "reportInterval": {
-     "type": "string",
-     "description": "The interval at which the worker is sending health reports. The default value of 0 should be interpreted as the field is not being explicitly set by the worker."
-    },
-    "pods": {
-     "type": "array",
-     "description": "The pods running on the worker. See: http://kubernetes.io/v1.1/docs/api-reference/v1/definitions.html#_v1_pod This field is used by the worker to send the status of the indvidual containers running on each worker.",
-     "items": {
-      "type": "object",
-      "additionalProperties": {
-       "type": "any",
-       "description": "Properties of the object."
-      }
-     }
-    }
-   }
-  },
-  "WorkerMessageCode": {
-   "id": "WorkerMessageCode",
-   "type": "object",
-   "description": "A message code is used to report status and error messages to the service. The message codes are intended to be machine readable. The service will take care of translating these into user understandable messages if necessary. Example use cases: 1. Worker processes reporting successful startup. 2. Worker processes reporting specific errors (e.g. package staging failure).",
-   "properties": {
-    "code": {
-     "type": "string",
-     "description": "The code is a string intended for consumption by a machine that identifies the type of message being sent. Examples: 1. \"HARNESS_STARTED\" might be used to indicate the worker harness has started. 2. \"GCS_DOWNLOAD_ERROR\" might be used to indicate an error downloading a GCS file as part of the boot process of one of the worker containers. This is a string and not an enum to make it easy to add new codes without waiting for an API change."
-    },
-    "parameters": {
-     "type": "object",
-     "description": "Parameters contains specific information about the code. This is a struct to allow parameters of different types. Examples: 1. For a \"HARNESS_STARTED\" message parameters might provide the name of the worker and additional data like timing information. 2. For a \"GCS_DOWNLOAD_ERROR\" parameters might contain fields listing the GCS objects being downloaded and fields containing errors. In general complex data structures should be avoided. If a worker needs to send a specific and complicated data structure then please consider defining a new proto and adding it to the data oneof in WorkerMessageResponse. Conventions: Parameters should only be used for information that isn't typically passed as a label. hostname and other worker identifiers should almost always be passed as labels since they will be included on most messages.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object."
-     }
-    }
-   }
-  },
-  "ResourceUtilizationReport": {
-   "id": "ResourceUtilizationReport",
-   "type": "object",
-   "description": "Worker metrics exported from workers. This contains resource utilization metrics accumulated from a variety of sources. For more information, see go/df-resource-signals. Note that this proto closely follows the structure of its DFE siblings in its contents.",
-   "properties": {
-    "metrics": {
-     "type": "array",
-     "description": "Each Struct must parallel DFE worker metrics protos (eg., cpu_time metric will have nested values “timestamp_ms, total_ms, rate”).",
-     "items": {
-      "type": "object",
-      "additionalProperties": {
-       "type": "any",
-       "description": "Properties of the object."
-      }
-     }
-    }
-   }
-  },
-  "SendWorkerMessagesResponse": {
-   "id": "SendWorkerMessagesResponse",
-   "type": "object",
-   "description": "The response to the worker messages.",
-   "properties": {
-    "workerMessageResponses": {
-     "type": "array",
-     "description": "The servers response to the worker messages.",
-     "items": {
-      "$ref": "WorkerMessageResponse"
-     }
-    }
-   }
-  },
-  "WorkerMessageResponse": {
-   "id": "WorkerMessageResponse",
-   "type": "object",
-   "description": "A worker_message response allows the server to pass information to the sender.",
-   "properties": {
-    "workerHealthReportResponse": {
-     "$ref": "WorkerHealthReportResponse",
-     "description": "The service's response to a worker's health report."
-    },
-    "workerMetricsResponse": {
-     "$ref": "ResourceUtilizationReportResponse",
-     "description": "Service's response to reporting worker metrics (currently empty)."
-    }
-   }
-  },
-  "WorkerHealthReportResponse": {
-   "id": "WorkerHealthReportResponse",
-   "type": "object",
-   "description": "WorkerHealthReportResponse contains information returned to the worker in response to a health ping.",
-   "properties": {
-    "reportInterval": {
-     "type": "string",
-     "description": "A positive value indicates the worker should change its reporting interval to the specified value. The default value of zero means no change in report rate is requested by the server."
-    }
-   }
-  },
-  "ResourceUtilizationReportResponse": {
-   "id": "ResourceUtilizationReportResponse",
-   "type": "object",
-   "description": "Service-side response to WorkerMessage reporting resource utilization."
-  }
- },
- "resources": {
-  "projects": {
-   "methods": {
-    "workerMessages": {
-     "id": "dataflow.projects.workerMessages",
-     "path": "v1b3/projects/{projectId}/WorkerMessages",
-     "httpMethod": "POST",
-     "description": "Send a worker_message to the service.",
-     "parameters": {
-      "projectId": {
-       "type": "string",
-       "description": "The project to send the WorkerMessages to.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "projectId"
-     ],
-     "request": {
-      "$ref": "SendWorkerMessagesRequest"
-     },
-     "response": {
-      "$ref": "SendWorkerMessagesResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform",
-      "https://www.googleapis.com/auth/userinfo.email"
-     ]
-    }
-   },
-   "resources": {
-    "jobs": {
-     "methods": {
-      "create": {
-       "id": "dataflow.projects.jobs.create",
-       "path": "v1b3/projects/{projectId}/jobs",
-       "httpMethod": "POST",
-       "description": "Creates a Cloud Dataflow job.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "The ID of the Cloud Platform project that the job belongs to.",
-         "required": true,
-         "location": "path"
+      "properties": {
+        "multiOutputInfos": {
+          "description": "Information about each of the outputs, if user_fn is a  MultiDoFn.",
+          "type": "array",
+          "items": {
+            "$ref": "MultiOutputInfo"
+          }
         },
-        "view": {
-         "type": "string",
-         "description": "The level of information requested in response.",
-         "enum": [
-          "JOB_VIEW_UNKNOWN",
-          "JOB_VIEW_SUMMARY",
-          "JOB_VIEW_ALL"
-         ],
-         "location": "query"
+        "userFn": {
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
+          },
+          "description": "The user function to invoke."
+        },
+        "input": {
+          "$ref": "InstructionInput",
+          "description": "The input."
+        },
+        "numOutputs": {
+          "description": "The number of outputs.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "sideInputs": {
+          "description": "Zero or more side inputs.",
+          "type": "array",
+          "items": {
+            "$ref": "SideInputInfo"
+          }
+        }
+      },
+      "id": "ParDoInstruction"
+    },
+    "CounterStructuredName": {
+      "description": "Identifies a counter within a per-job namespace. Counters whose structured\nnames are the same get merged into a single value for the job.",
+      "type": "object",
+      "properties": {
+        "componentStepName": {
+          "description": "Name of the optimized step being executed by the workers.",
+          "type": "string"
+        },
+        "portion": {
+          "enum": [
+            "ALL",
+            "KEY",
+            "VALUE"
+          ],
+          "description": "Portion of this counter, either key or value.",
+          "type": "string",
+          "enumDescriptions": [
+            "Counter portion has not been set.",
+            "Counter reports a key.",
+            "Counter reports a value."
+          ]
+        },
+        "originalStepName": {
+          "description": "System generated name of the original step in the user's graph, before\noptimization.",
+          "type": "string"
+        },
+        "workerId": {
+          "description": "ID of a particular worker.",
+          "type": "string"
+        },
+        "originNamespace": {
+          "description": "A string containing a more specific namespace of the counter's origin.",
+          "type": "string"
+        },
+        "origin": {
+          "enum": [
+            "SYSTEM",
+            "USER"
+          ],
+          "description": "One of the standard Origins defined above.",
+          "type": "string",
+          "enumDescriptions": [
+            "Counter was created by the Dataflow system.",
+            "Counter was created by the user."
+          ]
+        },
+        "name": {
+          "description": "Counter name. Not necessarily globally-unique, but unique within the\ncontext of the other fields.\nRequired.",
+          "type": "string"
+        },
+        "executionStepName": {
+          "description": "Name of the stage. An execution step contains multiple component steps.",
+          "type": "string"
+        }
+      },
+      "id": "CounterStructuredName"
+    },
+    "MetricUpdate": {
+      "id": "MetricUpdate",
+      "description": "Describes the state of a metric.",
+      "type": "object",
+      "properties": {
+        "meanSum": {
+          "description": "Worker-computed aggregate value for the \"Mean\" aggregation kind.\nThis holds the sum of the aggregated values and is used in combination\nwith mean_count below to obtain the actual mean aggregate value.\nThe only possible value types are Long and Double.",
+          "type": "any"
+        },
+        "updateTime": {
+          "description": "Timestamp associated with the metric value. Optional when workers are\nreporting work progress; it will be filled in responses from the\nmetrics API.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "name": {
+          "$ref": "MetricStructuredName",
+          "description": "Name of the metric."
+        },
+        "set": {
+          "description": "Worker-computed aggregate value for the \"Set\" aggregation kind.  The only\npossible value type is a list of Values whose type can be Long, Double,\nor String, according to the metric's type.  All Values in the list must\nbe of the same type.",
+          "type": "any"
+        },
+        "internal": {
+          "description": "Worker-computed aggregate value for internal use by the Dataflow\nservice.",
+          "type": "any"
+        },
+        "cumulative": {
+          "description": "True if this metric is reported as the total cumulative aggregate\nvalue accumulated since the worker started working on this WorkItem.\nBy default this is false, indicating that this metric is reported\nas a delta that is not associated with any WorkItem.",
+          "type": "boolean"
+        },
+        "kind": {
+          "description": "Metric aggregation kind.  The possible metric aggregation kinds are\n\"Sum\", \"Max\", \"Min\", \"Mean\", \"Set\", \"And\", and \"Or\".\nThe specified aggregation kind is case-insensitive.\n\nIf omitted, this is not an aggregated value but instead\na single metric sample value.",
+          "type": "string"
+        },
+        "scalar": {
+          "description": "Worker-computed aggregate value for aggregation kinds \"Sum\", \"Max\", \"Min\",\n\"And\", and \"Or\".  The possible value types are Long, Double, and Boolean.",
+          "type": "any"
+        },
+        "meanCount": {
+          "description": "Worker-computed aggregate value for the \"Mean\" aggregation kind.\nThis holds the count of the aggregated values and is used in combination\nwith mean_sum above to obtain the actual mean aggregate value.\nThe only possible value type is Long.",
+          "type": "any"
+        }
+      }
+    },
+    "ApproximateProgress": {
+      "description": "Obsolete in favor of ApproximateReportedProgress and ApproximateSplitRequest.",
+      "type": "object",
+      "properties": {
+        "percentComplete": {
+          "description": "Obsolete.",
+          "format": "float",
+          "type": "number"
+        },
+        "remainingTime": {
+          "description": "Obsolete.",
+          "format": "google-duration",
+          "type": "string"
+        },
+        "position": {
+          "description": "Obsolete.",
+          "$ref": "Position"
+        }
+      },
+      "id": "ApproximateProgress"
+    },
+    "WorkerMessageResponse": {
+      "properties": {
+        "workerMetricsResponse": {
+          "$ref": "ResourceUtilizationReportResponse",
+          "description": "Service's response to reporting worker metrics (currently empty)."
+        },
+        "workerHealthReportResponse": {
+          "description": "The service's response to a worker's health report.",
+          "$ref": "WorkerHealthReportResponse"
+        }
+      },
+      "id": "WorkerMessageResponse",
+      "description": "A worker_message response allows the server to pass information to the\nsender.",
+      "type": "object"
+    },
+    "WorkerMessage": {
+      "id": "WorkerMessage",
+      "description": "WorkerMessage provides information to the backend about a worker.",
+      "type": "object",
+      "properties": {
+        "workerHealthReport": {
+          "description": "The health of a worker.",
+          "$ref": "WorkerHealthReport"
+        },
+        "workerMessageCode": {
+          "$ref": "WorkerMessageCode",
+          "description": "A worker message code."
+        },
+        "workerMetrics": {
+          "$ref": "ResourceUtilizationReport",
+          "description": "Resource metrics reported by workers."
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Labels are used to group WorkerMessages.\nFor example, a worker_message about a particular container\nmight have the labels:\n{ \"JOB_ID\": \"2015-04-22\",\n  \"WORKER_ID\": \"wordcount-vm-2015…\"\n  \"CONTAINER_TYPE\": \"worker\",\n  \"CONTAINER_ID\": \"ac1234def\"}\nLabel tags typically correspond to Label enum values. However, for ease\nof development other strings can be used as tags. LABEL_UNSPECIFIED should\nnot be used here.",
+          "type": "object"
+        },
+        "time": {
+          "type": "string",
+          "description": "The timestamp of the worker_message.",
+          "format": "google-datetime"
+        }
+      }
+    },
+    "JobMetrics": {
+      "properties": {
+        "metricTime": {
+          "description": "Timestamp as of which metric values are current.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "metrics": {
+          "type": "array",
+          "items": {
+            "$ref": "MetricUpdate"
+          },
+          "description": "All metrics for this job."
+        }
+      },
+      "id": "JobMetrics",
+      "description": "JobMetrics contains a collection of metrics descibing the detailed progress\nof a Dataflow job. Metrics correspond to user-defined and system-defined\nmetrics in the job.\n\nThis resource captures only the most recent values of each metric;\ntime-series data can be queried for them (under the same metric names)\nfrom Cloud Monitoring.",
+      "type": "object"
+    },
+    "FloatingPointList": {
+      "properties": {
+        "elements": {
+          "description": "Elements of the list.",
+          "type": "array",
+          "items": {
+            "format": "double",
+            "type": "number"
+          }
+        }
+      },
+      "id": "FloatingPointList",
+      "description": "A metric value representing a list of floating point numbers.",
+      "type": "object"
+    },
+    "CounterUpdate": {
+      "description": "An update to a Counter sent from a worker.",
+      "type": "object",
+      "properties": {
+        "floatingPointList": {
+          "$ref": "FloatingPointList",
+          "description": "List of floating point numbers, for Set."
+        },
+        "integer": {
+          "$ref": "SplitInt64",
+          "description": "Integer value for Sum, Max, Min."
+        },
+        "integerList": {
+          "description": "List of integers, for Set.",
+          "$ref": "IntegerList"
+        },
+        "structuredNameAndMetadata": {
+          "$ref": "CounterStructuredNameAndMetadata",
+          "description": "Counter structured name and metadata."
+        },
+        "floatingPoint": {
+          "description": "Floating point value for Sum, Max, Min.",
+          "format": "double",
+          "type": "number"
+        },
+        "integerMean": {
+          "description": "Integer mean aggregation value for Mean.",
+          "$ref": "IntegerMean"
+        },
+        "internal": {
+          "type": "any",
+          "description": "Value for internally-defined counters used by the Dataflow service."
+        },
+        "cumulative": {
+          "description": "True if this counter is reported as the total cumulative aggregate\nvalue accumulated since the worker started working on this WorkItem.\nBy default this is false, indicating that this counter is reported\nas a delta.",
+          "type": "boolean"
+        },
+        "floatingPointMean": {
+          "description": "Floating point mean aggregation value for Mean.",
+          "$ref": "FloatingPointMean"
+        },
+        "boolean": {
+          "description": "Boolean value for And, Or.",
+          "type": "boolean"
+        },
+        "nameAndKind": {
+          "description": "Counter name and aggregation type.",
+          "$ref": "NameAndKind"
+        },
+        "stringList": {
+          "$ref": "StringList",
+          "description": "List of strings, for Set."
+        },
+        "distribution": {
+          "$ref": "DistributionUpdate",
+          "description": "Distribution data"
+        },
+        "shortId": {
+          "description": "The service-generated short identifier for this counter.\nThe short_id -\u003e (name, metadata) mapping is constant for the lifetime of\na job.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "id": "CounterUpdate"
+    },
+    "SourceMetadata": {
+      "description": "Metadata about a Source useful for automatically optimizing\nand tuning the pipeline, etc.",
+      "type": "object",
+      "properties": {
+        "producesSortedKeys": {
+          "description": "Whether this source is known to produce key/value pairs with\nthe (encoded) keys in lexicographically sorted order.",
+          "type": "boolean"
+        },
+        "infinite": {
+          "description": "Specifies that the size of this source is known to be infinite\n(this is a streaming source).",
+          "type": "boolean"
+        },
+        "estimatedSizeBytes": {
+          "description": "An estimate of the total size (in bytes) of the data that would be\nread from this source.  This estimate is in terms of external storage\nsize, before any decompression or other processing done by the reader.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "id": "SourceMetadata"
+    },
+    "DistributionUpdate": {
+      "description": "A metric value representing a distribution.",
+      "type": "object",
+      "properties": {
+        "count": {
+          "description": "The count of the number of elements present in the distribution.",
+          "$ref": "SplitInt64"
+        },
+        "min": {
+          "$ref": "SplitInt64",
+          "description": "The minimum value present in the distribution."
+        },
+        "sumOfSquares": {
+          "type": "number",
+          "description": "Use a double since the sum of squares is likely to overflow int64.",
+          "format": "double"
+        },
+        "max": {
+          "$ref": "SplitInt64",
+          "description": "The maximum value present in the distribution."
+        },
+        "sum": {
+          "$ref": "SplitInt64",
+          "description": "Use an int64 since we'd prefer the added precision. If overflow is a common\nproblem we can detect it and use an additional int64 or a double."
+        }
+      },
+      "id": "DistributionUpdate"
+    },
+    "WorkerHealthReportResponse": {
+      "description": "WorkerHealthReportResponse contains information returned to the worker\nin response to a health ping.",
+      "type": "object",
+      "properties": {
+        "reportInterval": {
+          "description": "A positive value indicates the worker should change its reporting interval\nto the specified value.\n\nThe default value of zero means no change in report rate is requested by\nthe server.",
+          "format": "google-duration",
+          "type": "string"
+        }
+      },
+      "id": "WorkerHealthReportResponse"
+    },
+    "SourceFork": {
+      "description": "DEPRECATED in favor of DynamicSourceSplit.",
+      "type": "object",
+      "properties": {
+        "primary": {
+          "description": "DEPRECATED",
+          "$ref": "SourceSplitShard"
+        },
+        "primarySource": {
+          "$ref": "DerivedSource",
+          "description": "DEPRECATED"
+        },
+        "residual": {
+          "$ref": "SourceSplitShard",
+          "description": "DEPRECATED"
+        },
+        "residualSource": {
+          "$ref": "DerivedSource",
+          "description": "DEPRECATED"
+        }
+      },
+      "id": "SourceFork"
+    },
+    "WorkItemStatus": {
+      "type": "object",
+      "properties": {
+        "sourceOperationResponse": {
+          "$ref": "SourceOperationResponse",
+          "description": "If the work item represented a SourceOperationRequest, and the work\nis completed, contains the result of the operation."
+        },
+        "progress": {
+          "$ref": "ApproximateProgress",
+          "description": "DEPRECATED in favor of reported_progress."
+        },
+        "requestedLeaseDuration": {
+          "description": "Amount of time the worker requests for its lease.",
+          "format": "google-duration",
+          "type": "string"
+        },
+        "reportIndex": {
+          "description": "The report index.  When a WorkItem is leased, the lease will\ncontain an initial report index.  When a WorkItem's status is\nreported to the system, the report should be sent with\nthat report index, and the response will contain the index the\nworker should use for the next report.  Reports received with\nunexpected index values will be rejected by the service.\n\nIn order to preserve idempotency, the worker should not alter the\ncontents of a report, even if the worker must submit the same\nreport multiple times before getting back a response.  The worker\nshould not submit a subsequent report until the response for the\nprevious report had been received from the service.",
+          "format": "int64",
+          "type": "string"
+        },
+        "stopPosition": {
+          "description": "A worker may split an active map task in two parts, \"primary\" and\n\"residual\", continuing to process the primary part and returning the\nresidual part into the pool of available work.\nThis event is called a \"dynamic split\" and is critical to the dynamic\nwork rebalancing feature. The two obtained sub-tasks are called\n\"parts\" of the split.\nThe parts, if concatenated, must represent the same input as would\nbe read by the current task if the split did not happen.\nThe exact way in which the original task is decomposed into the two\nparts is specified either as a position demarcating them\n(stop_position), or explicitly as two DerivedSources, if this\ntask consumes a user-defined source type (dynamic_source_split).\n\nThe \"current\" task is adjusted as a result of the split: after a task\nwith range [A, B) sends a stop_position update at C, its range is\nconsidered to be [A, C), e.g.:\n* Progress should be interpreted relative to the new range, e.g.\n  \"75% completed\" means \"75% of [A, C) completed\"\n* The worker should interpret proposed_stop_position relative to the\n  new range, e.g. \"split at 68%\" should be interpreted as\n  \"split at 68% of [A, C)\".\n* If the worker chooses to split again using stop_position, only\n  stop_positions in [A, C) will be accepted.\n* Etc.\ndynamic_source_split has similar semantics: e.g., if a task with\nsource S splits using dynamic_source_split into {P, R}\n(where P and R must be together equivalent to S), then subsequent\nprogress and proposed_stop_position should be interpreted relative\nto P, and in a potential subsequent dynamic_source_split into {P', R'},\nP' and R' must be together equivalent to P, etc.",
+          "$ref": "Position"
+        },
+        "completed": {
+          "type": "boolean",
+          "description": "True if the WorkItem was completed (successfully or unsuccessfully)."
+        },
+        "reportedProgress": {
+          "$ref": "ApproximateReportedProgress",
+          "description": "The worker's progress through this WorkItem."
+        },
+        "sourceFork": {
+          "$ref": "SourceFork",
+          "description": "DEPRECATED in favor of dynamic_source_split."
+        },
+        "counterUpdates": {
+          "description": "Worker output counters for this WorkItem.",
+          "type": "array",
+          "items": {
+            "$ref": "CounterUpdate"
+          }
+        },
+        "workItemId": {
+          "description": "Identifies the WorkItem.",
+          "type": "string"
+        },
+        "metricUpdates": {
+          "description": "DEPRECATED in favor of counter_updates.",
+          "type": "array",
+          "items": {
+            "$ref": "MetricUpdate"
+          }
+        },
+        "errors": {
+          "description": "Specifies errors which occurred during processing.  If errors are\nprovided, and completed = true, then the WorkItem is considered\nto have failed.",
+          "type": "array",
+          "items": {
+            "$ref": "Status"
+          }
+        },
+        "dynamicSourceSplit": {
+          "$ref": "DynamicSourceSplit",
+          "description": "See documentation of stop_position."
+        }
+      },
+      "id": "WorkItemStatus",
+      "description": "Conveys a worker's progress through the work described by a WorkItem."
+    },
+    "WorkItemServiceState": {
+      "properties": {
+        "reportStatusInterval": {
+          "description": "New recommended reporting interval.",
+          "format": "google-duration",
+          "type": "string"
+        },
+        "suggestedStopPosition": {
+          "description": "Obsolete, always empty.",
+          "$ref": "Position"
+        },
+        "harnessData": {
+          "description": "Other data returned by the service, specific to the particular\nworker harness.",
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
+          }
+        },
+        "leaseExpireTime": {
+          "description": "Time at which the current lease will expire.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "metricShortId": {
+          "description": "The short ids that workers should use in subsequent metric updates.\nWorkers should strive to use short ids whenever possible, but it is ok\nto request the short_id again if a worker lost track of it\n(e.g. if the worker is recovering from a crash).\nNOTE: it is possible that the response may have short ids for a subset\nof the metrics.",
+          "type": "array",
+          "items": {
+            "$ref": "MetricShortId"
+          }
+        },
+        "nextReportIndex": {
+          "description": "The index value to use for the next report sent by the worker.\nNote: If the report call fails for whatever reason, the worker should\nreuse this index for subsequent report attempts.",
+          "format": "int64",
+          "type": "string"
+        },
+        "suggestedStopPoint": {
+          "$ref": "ApproximateProgress",
+          "description": "DEPRECATED in favor of split_request."
+        },
+        "splitRequest": {
+          "$ref": "ApproximateSplitRequest",
+          "description": "The progress point in the WorkItem where the Dataflow service\nsuggests that the worker truncate the task."
+        }
+      },
+      "id": "WorkItemServiceState",
+      "description": "The Dataflow service's idea of the current state of a WorkItem\nbeing processed by a worker.",
+      "type": "object"
+    },
+    "MetricStructuredName": {
+      "description": "Identifies a metric, by describing the source which generated the\nmetric.",
+      "type": "object",
+      "properties": {
+        "context": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Zero or more labeled fields which identify the part of the job this\nmetric is associated with, such as the name of a step or collection.\n\nFor example, built-in counters associated with steps will have\ncontext['step'] = \u003cstep-name\u003e. Counters associated with PCollections\nin the SDK will have context['pcollection'] = \u003cpcollection-name\u003e.",
+          "type": "object"
+        },
+        "origin": {
+          "type": "string",
+          "description": "Origin (namespace) of metric name. May be blank for user-define metrics;\nwill be \"dataflow\" for metrics defined by the Dataflow service or SDK."
+        },
+        "name": {
+          "description": "Worker-defined metric name.",
+          "type": "string"
+        }
+      },
+      "id": "MetricStructuredName"
+    },
+    "SeqMapTaskOutputInfo": {
+      "description": "Information about an output of a SeqMapTask.",
+      "type": "object",
+      "properties": {
+        "sink": {
+          "description": "The sink to write the output value to.",
+          "$ref": "Sink"
+        },
+        "tag": {
+          "description": "The id of the TupleTag the user code will tag the output value by.",
+          "type": "string"
+        }
+      },
+      "id": "SeqMapTaskOutputInfo"
+    },
+    "JobExecutionStageInfo": {
+      "description": "Contains information about how a particular\ngoogle.dataflow.v1beta3.Step will be executed.",
+      "type": "object",
+      "properties": {
+        "stepName": {
+          "description": "The steps associated with the execution stage.\nNote that stages may have several steps, and that a given step\nmight be run by more than one stage.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "JobExecutionStageInfo"
+    },
+    "KeyRangeLocation": {
+      "id": "KeyRangeLocation",
+      "description": "Location information for a specific key-range of a sharded computation.\nCurrently we only support UTF-8 character splits to simplify encoding into\nJSON.",
+      "type": "object",
+      "properties": {
+        "deliveryEndpoint": {
+          "description": "The physical location of this range assignment to be used for\nstreaming computation cross-worker message delivery.",
+          "type": "string"
+        },
+        "start": {
+          "description": "The start (inclusive) of the key range.",
+          "type": "string"
+        },
+        "dataDisk": {
+          "description": "The name of the data disk where data for this range is stored.\nThis name is local to the Google Cloud Platform project and uniquely\nidentifies the disk within that project, for example\n\"myproject-1014-104817-4c2-harness-0-disk-1\".",
+          "type": "string"
+        },
+        "persistentDirectory": {
+          "description": "The location of the persistent state for this range, as a\npersistent directory in the worker local filesystem.",
+          "type": "string"
+        },
+        "end": {
+          "description": "The end (exclusive) of the key range.",
+          "type": "string"
+        }
+      }
+    },
+    "SourceGetMetadataRequest": {
+      "id": "SourceGetMetadataRequest",
+      "description": "A request to compute the SourceMetadata of a Source.",
+      "type": "object",
+      "properties": {
+        "source": {
+          "$ref": "Source",
+          "description": "Specification of the source whose metadata should be computed."
+        }
+      }
+    },
+    "NameAndKind": {
+      "description": "Basic metadata about a counter.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "Name of the counter.",
+          "type": "string"
+        },
+        "kind": {
+          "description": "Counter aggregation kind.",
+          "type": "string",
+          "enumDescriptions": [
+            "Counter aggregation kind was not set.",
+            "Aggregated value is the sum of all contributed values.",
+            "Aggregated value is the max of all contributed values.",
+            "Aggregated value is the min of all contributed values.",
+            "Aggregated value is the mean of all contributed values.",
+            "Aggregated value represents the logical 'or' of all contributed values.",
+            "Aggregated value represents the logical 'and' of all contributed values.",
+            "Aggregated value is a set of unique contributed values.",
+            "Aggregated value captures statistics about a distribution."
+          ],
+          "enum": [
+            "INVALID",
+            "SUM",
+            "MAX",
+            "MIN",
+            "MEAN",
+            "OR",
+            "AND",
+            "SET",
+            "DISTRIBUTION"
+          ]
+        }
+      },
+      "id": "NameAndKind"
+    },
+    "SeqMapTask": {
+      "description": "Describes a particular function to invoke.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The user-provided name of the SeqDo operation.",
+          "type": "string"
+        },
+        "outputInfos": {
+          "description": "Information about each of the outputs.",
+          "type": "array",
+          "items": {
+            "$ref": "SeqMapTaskOutputInfo"
+          }
+        },
+        "inputs": {
+          "description": "Information about each of the inputs.",
+          "type": "array",
+          "items": {
+            "$ref": "SideInputInfo"
+          }
+        },
+        "stageName": {
+          "description": "System-defined name of the stage containing the SeqDo operation.\nUnique across the workflow.",
+          "type": "string"
+        },
+        "systemName": {
+          "description": "System-defined name of the SeqDo operation.\nUnique across the workflow.",
+          "type": "string"
+        },
+        "userFn": {
+          "description": "The user function to invoke.",
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
+          }
+        }
+      },
+      "id": "SeqMapTask"
+    },
+    "WorkerMessageCode": {
+      "description": "A message code is used to report status and error messages to the service.\nThe message codes are intended to be machine readable. The service will\ntake care of translating these into user understandable messages if\nnecessary.\n\nExample use cases:\n  1. Worker processes reporting successful startup.\n  2. Worker processes reporting specific errors (e.g. package staging\n     failure).",
+      "type": "object",
+      "properties": {
+        "code": {
+          "description": "The code is a string intended for consumption by a machine that identifies\nthe type of message being sent.\nExamples:\n 1. \"HARNESS_STARTED\" might be used to indicate the worker harness has\n     started.\n 2. \"GCS_DOWNLOAD_ERROR\" might be used to indicate an error downloading\n    a GCS file as part of the boot process of one of the worker containers.\n\nThis is a string and not an enum to make it easy to add new codes without\nwaiting for an API change.",
+          "type": "string"
+        },
+        "parameters": {
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
+          },
+          "description": "Parameters contains specific information about the code.\n\nThis is a struct to allow parameters of different types.\n\nExamples:\n 1. For a \"HARNESS_STARTED\" message parameters might provide the name\n    of the worker and additional data like timing information.\n 2. For a \"GCS_DOWNLOAD_ERROR\" parameters might contain fields listing\n    the GCS objects being downloaded and fields containing errors.\n\nIn general complex data structures should be avoided. If a worker\nneeds to send a specific and complicated data structure then please\nconsider defining a new proto and adding it to the data oneof in\nWorkerMessageResponse.\n\nConventions:\n Parameters should only be used for information that isn't typically passed\n as a label.\n hostname and other worker identifiers should almost always be passed\n as labels since they will be included on most messages.",
+          "type": "object"
+        }
+      },
+      "id": "WorkerMessageCode"
+    },
+    "CustomSourceLocation": {
+      "properties": {
+        "stateful": {
+          "type": "boolean",
+          "description": "Whether this source is stateful."
+        }
+      },
+      "id": "CustomSourceLocation",
+      "description": "Identifies the location of a custom souce.",
+      "type": "object"
+    },
+    "MapTask": {
+      "description": "MapTask consists of an ordered set of instructions, each of which\ndescribes one particular low-level operation for the worker to\nperform in order to accomplish the MapTask's WorkItem.\n\nEach instruction must appear in the list before any instructions which\ndepends on its output.",
+      "type": "object",
+      "properties": {
+        "systemName": {
+          "description": "System-defined name of this MapTask.\nUnique across the workflow.",
+          "type": "string"
+        },
+        "stageName": {
+          "description": "System-defined name of the stage containing this MapTask.\nUnique across the workflow.",
+          "type": "string"
+        },
+        "instructions": {
+          "description": "The instructions in the MapTask.",
+          "type": "array",
+          "items": {
+            "$ref": "ParallelInstruction"
+          }
+        }
+      },
+      "id": "MapTask"
+    },
+    "FloatingPointMean": {
+      "description": "A representation of a floating point mean metric contribution.",
+      "type": "object",
+      "properties": {
+        "count": {
+          "$ref": "SplitInt64",
+          "description": "The number of values being aggregated."
+        },
+        "sum": {
+          "description": "The sum of all values being aggregated.",
+          "format": "double",
+          "type": "number"
+        }
+      },
+      "id": "FloatingPointMean"
+    },
+    "ReportWorkItemStatusResponse": {
+      "description": "Response from a request to report the status of WorkItems.",
+      "type": "object",
+      "properties": {
+        "workItemServiceStates": {
+          "type": "array",
+          "items": {
+            "$ref": "WorkItemServiceState"
+          },
+          "description": "A set of messages indicating the service-side state for each\nWorkItem whose status was reported, in the same order as the\nWorkItemStatus messages in the ReportWorkItemStatusRequest which\nresulting in this response."
+        }
+      },
+      "id": "ReportWorkItemStatusResponse"
+    },
+    "InstructionOutput": {
+      "properties": {
+        "name": {
+          "description": "The user-provided name of this output.",
+          "type": "string"
+        },
+        "originalName": {
+          "description": "System-defined name for this output in the original workflow graph.\nOutputs that do not contribute to an original instruction do not set this.",
+          "type": "string"
+        },
+        "onlyCountKeyBytes": {
+          "description": "For system-generated byte and mean byte metrics, certain instructions\nshould only report the key size.",
+          "type": "boolean"
+        },
+        "systemName": {
+          "description": "System-defined name of this output.\nUnique across the workflow.",
+          "type": "string"
+        },
+        "onlyCountValueBytes": {
+          "description": "For system-generated byte and mean byte metrics, certain instructions\nshould only report the value size.",
+          "type": "boolean"
+        },
+        "codec": {
+          "additionalProperties": {
+            "type": "any",
+            "description": "Properties of the object."
+          },
+          "description": "The codec to use to encode data being written via this output.",
+          "type": "object"
+        }
+      },
+      "id": "InstructionOutput",
+      "description": "An output of an instruction.",
+      "type": "object"
+    },
+    "CreateJobFromTemplateRequest": {
+      "type": "object",
+      "properties": {
+        "gcsPath": {
+          "description": "Required. A Cloud Storage path to the template from which to\ncreate the job.\nMust be a valid Cloud Storage URL, beginning with `gs://`.",
+          "type": "string"
+        },
+        "environment": {
+          "$ref": "RuntimeEnvironment",
+          "description": "The runtime environment for the job."
+        },
+        "parameters": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "The runtime parameters to pass to the job.",
+          "type": "object"
+        },
+        "jobName": {
+          "description": "Required. The job name to use for the created job.",
+          "type": "string"
+        }
+      },
+      "id": "CreateJobFromTemplateRequest",
+      "description": "A request to create a Cloud Dataflow job from a template."
+    },
+    "IntegerMean": {
+      "properties": {
+        "sum": {
+          "description": "The sum of all values being aggregated.",
+          "$ref": "SplitInt64"
+        },
+        "count": {
+          "$ref": "SplitInt64",
+          "description": "The number of values being aggregated."
+        }
+      },
+      "id": "IntegerMean",
+      "description": "A representation of an integer mean metric contribution.",
+      "type": "object"
+    },
+    "ListJobsResponse": {
+      "description": "Response to a request to list Cloud Dataflow jobs.  This may be a partial\nresponse, depending on the page size in the ListJobsRequest.",
+      "type": "object",
+      "properties": {
+        "jobs": {
+          "description": "A subset of the requested job information.",
+          "type": "array",
+          "items": {
+            "$ref": "Job"
+          }
+        },
+        "nextPageToken": {
+          "description": "Set if there may be more results than fit in this response.",
+          "type": "string"
+        },
+        "failedLocation": {
+          "description": "Zero or more messages describing locations that failed to respond.",
+          "type": "array",
+          "items": {
+            "$ref": "FailedLocation"
+          }
+        }
+      },
+      "id": "ListJobsResponse"
+    },
+    "ComputationTopology": {
+      "properties": {
+        "userStageName": {
+          "description": "The user stage name.",
+          "type": "string"
+        },
+        "stateFamilies": {
+          "type": "array",
+          "items": {
+            "$ref": "StateFamilyConfig"
+          },
+          "description": "The state family values."
+        },
+        "outputs": {
+          "description": "The outputs from the computation.",
+          "type": "array",
+          "items": {
+            "$ref": "StreamLocation"
+          }
+        },
+        "systemStageName": {
+          "description": "The system stage name.",
+          "type": "string"
+        },
+        "inputs": {
+          "description": "The inputs to the computation.",
+          "type": "array",
+          "items": {
+            "$ref": "StreamLocation"
+          }
+        },
+        "computationId": {
+          "description": "The ID of the computation.",
+          "type": "string"
+        },
+        "keyRanges": {
+          "description": "The key ranges processed by the computation.",
+          "type": "array",
+          "items": {
+            "$ref": "KeyRangeLocation"
+          }
+        }
+      },
+      "id": "ComputationTopology",
+      "description": "All configuration data for a particular Computation.",
+      "type": "object"
+    },
+    "RuntimeEnvironment": {
+      "description": "The environment values to set at runtime.",
+      "type": "object",
+      "properties": {
+        "maxWorkers": {
+          "description": "The maximum number of Google Compute Engine instances to be made\navailable to your pipeline during execution, from 1 to 1000.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "zone": {
+          "description": "The Compute Engine [availability zone](https://cloud.google.com/compute/docs/regions-zones/regions-zones)\nfor launching worker instances to run your pipeline.",
+          "type": "string"
+        },
+        "serviceAccountEmail": {
+          "description": "The email address of the service account to run the job as.",
+          "type": "string"
+        },
+        "tempLocation": {
+          "description": "The Cloud Storage path to use for temporary files.\nMust be a valid Cloud Storage URL, beginning with `gs://`.",
+          "type": "string"
+        },
+        "bypassTempDirValidation": {
+          "type": "boolean",
+          "description": "Whether to bypass the safety checks for the job's temporary directory.\nUse with caution."
+        }
+      },
+      "id": "RuntimeEnvironment"
+    },
+    "MountedDataDisk": {
+      "description": "Describes mounted data disk.",
+      "type": "object",
+      "properties": {
+        "dataDisk": {
+          "description": "The name of the data disk.\nThis name is local to the Google Cloud Platform project and uniquely\nidentifies the disk within that project, for example\n\"myproject-1014-104817-4c2-harness-0-disk-1\".",
+          "type": "string"
+        }
+      },
+      "id": "MountedDataDisk"
+    },
+    "StreamingSideInputLocation": {
+      "description": "Identifies the location of a streaming side input.",
+      "type": "object",
+      "properties": {
+        "tag": {
+          "description": "Identifies the particular side input within the streaming Dataflow job.",
+          "type": "string"
+        },
+        "stateFamily": {
+          "description": "Identifies the state family where this side input is stored.",
+          "type": "string"
+        }
+      },
+      "id": "StreamingSideInputLocation"
+    },
+    "Job": {
+      "description": "Defines a job to be run by the Cloud Dataflow service.",
+      "type": "object",
+      "properties": {
+        "type": {
+          "enumDescriptions": [
+            "The type of the job is unspecified, or unknown.",
+            "A batch job with a well-defined end point: data is read, data is\nprocessed, data is written, and the job is done.",
+            "A continuously streaming job with no end: data is read,\nprocessed, and written continuously."
+          ],
+          "enum": [
+            "JOB_TYPE_UNKNOWN",
+            "JOB_TYPE_BATCH",
+            "JOB_TYPE_STREAMING"
+          ],
+          "description": "The type of Cloud Dataflow job.",
+          "type": "string"
+        },
+        "projectId": {
+          "description": "The ID of the Cloud Platform project that the job belongs to.",
+          "type": "string"
         },
         "replaceJobId": {
-         "type": "string",
-         "description": "Deprecated. This field is now in the Job message.",
-         "location": "query"
+          "description": "If this job is an update of an existing job, this field is the job ID\nof the job it replaced.\n\nWhen sending a `CreateJobRequest`, you can update a job by specifying it\nhere. The job named here is stopped, and its intermediate state is\ntransferred to this job.",
+          "type": "string"
+        },
+        "requestedState": {
+          "enum": [
+            "JOB_STATE_UNKNOWN",
+            "JOB_STATE_STOPPED",
+            "JOB_STATE_RUNNING",
+            "JOB_STATE_DONE",
+            "JOB_STATE_FAILED",
+            "JOB_STATE_CANCELLED",
+            "JOB_STATE_UPDATED",
+            "JOB_STATE_DRAINING",
+            "JOB_STATE_DRAINED"
+          ],
+          "description": "The job's requested state.\n\n`UpdateJob` may be used to switch between the `JOB_STATE_STOPPED` and\n`JOB_STATE_RUNNING` states, by setting requested_state.  `UpdateJob` may\nalso be used to directly set a job's requested state to\n`JOB_STATE_CANCELLED` or `JOB_STATE_DONE`, irrevocably terminating the\njob if it has not already reached a terminal state.",
+          "type": "string",
+          "enumDescriptions": [
+            "The job's run state isn't specified.",
+            "`JOB_STATE_STOPPED` indicates that the job has not\nyet started to run.",
+            "`JOB_STATE_RUNNING` indicates that the job is currently running.",
+            "`JOB_STATE_DONE` indicates that the job has successfully completed.\nThis is a terminal job state.  This state may be set by the Cloud Dataflow\nservice, as a transition from `JOB_STATE_RUNNING`. It may also be set via a\nCloud Dataflow `UpdateJob` call, if the job has not yet reached a terminal\nstate.",
+            "`JOB_STATE_FAILED` indicates that the job has failed.  This is a\nterminal job state.  This state may only be set by the Cloud Dataflow\nservice, and only as a transition from `JOB_STATE_RUNNING`.",
+            "`JOB_STATE_CANCELLED` indicates that the job has been explicitly\ncancelled. This is a terminal job state. This state may only be\nset via a Cloud Dataflow `UpdateJob` call, and only if the job has not\nyet reached another terminal state.",
+            "`JOB_STATE_UPDATED` indicates that the job was successfully updated,\nmeaning that this job was stopped and another job was started, inheriting\nstate from this one. This is a terminal job state. This state may only be\nset by the Cloud Dataflow service, and only as a transition from\n`JOB_STATE_RUNNING`.",
+            "`JOB_STATE_DRAINING` indicates that the job is in the process of draining.\nA draining job has stopped pulling from its input sources and is processing\nany data that remains in-flight. This state may be set via a Cloud Dataflow\n`UpdateJob` call, but only as a transition from `JOB_STATE_RUNNING`. Jobs\nthat are draining may only transition to `JOB_STATE_DRAINED`,\n`JOB_STATE_CANCELLED`, or `JOB_STATE_FAILED`.",
+            "`JOB_STATE_DRAINED` indicates that the job has been drained.\nA drained job terminated by stopping pulling from its input sources and\nprocessing any data that remained in-flight when draining was requested.\nThis state is a terminal state, may only be set by the Cloud Dataflow\nservice, and only as a transition from `JOB_STATE_DRAINING`."
+          ]
+        },
+        "tempFiles": {
+          "description": "A set of files the system should be aware of that are used\nfor temporary storage. These temporary files will be\nremoved on job completion.\nNo duplicates are allowed.\nNo file patterns are supported.\n\nThe supported files are:\n\nGoogle Cloud Storage:\n\n   storage.googleapis.com/{bucket}/{object}\n   bucket.storage.googleapis.com/{object}",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "clientRequestId": {
+          "description": "The client's unique identifier of the job, re-used across retried attempts.\nIf this field is set, the service will ensure its uniqueness.\nThe request to create a job will fail if the service has knowledge of a\npreviously submitted job with the same client's ID and job name.\nThe caller may use this field to ensure idempotence of job\ncreation across retried attempts to create a job.\nBy default, the field is empty and, in that case, the service ignores it.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The user-specified Cloud Dataflow job name.\n\nOnly one Job with a given name may exist in a project at any\ngiven time. If a caller attempts to create a Job with the same\nname as an already-existing Job, the attempt returns the\nexisting Job.\n\nThe name must match the regular expression\n`[a-z]([-a-z0-9]{0,38}[a-z0-9])?`",
+          "type": "string"
+        },
+        "steps": {
+          "description": "The top-level steps that constitute the entire job.",
+          "type": "array",
+          "items": {
+            "$ref": "Step"
+          }
+        },
+        "replacedByJobId": {
+          "description": "If another job is an update of this job (and thus, this job is in\n`JOB_STATE_UPDATED`), this field contains the ID of that job.",
+          "type": "string"
+        },
+        "id": {
+          "description": "The unique ID of this job.\n\nThis field is set by the Cloud Dataflow service when the Job is\ncreated, and is immutable for the life of the job.",
+          "type": "string"
+        },
+        "executionInfo": {
+          "description": "Information about how the Cloud Dataflow service will run the job.",
+          "$ref": "JobExecutionInfo"
+        },
+        "currentState": {
+          "enumDescriptions": [
+            "The job's run state isn't specified.",
+            "`JOB_STATE_STOPPED` indicates that the job has not\nyet started to run.",
+            "`JOB_STATE_RUNNING` indicates that the job is currently running.",
+            "`JOB_STATE_DONE` indicates that the job has successfully completed.\nThis is a terminal job state.  This state may be set by the Cloud Dataflow\nservice, as a transition from `JOB_STATE_RUNNING`. It may also be set via a\nCloud Dataflow `UpdateJob` call, if the job has not yet reached a terminal\nstate.",
+            "`JOB_STATE_FAILED` indicates that the job has failed.  This is a\nterminal job state.  This state may only be set by the Cloud Dataflow\nservice, and only as a transition from `JOB_STATE_RUNNING`.",
+            "`JOB_STATE_CANCELLED` indicates that the job has been explicitly\ncancelled. This is a terminal job state. This state may only be\nset via a Cloud Dataflow `UpdateJob` call, and only if the job has not\nyet reached another terminal state.",
+            "`JOB_STATE_UPDATED` indicates that the job was successfully updated,\nmeaning that this job was stopped and another job was started, inheriting\nstate from this one. This is a terminal job state. This state may only be\nset by the Cloud Dataflow service, and only as a transition from\n`JOB_STATE_RUNNING`.",
+            "`JOB_STATE_DRAINING` indicates that the job is in the process of draining.\nA draining job has stopped pulling from its input sources and is processing\nany data that remains in-flight. This state may be set via a Cloud Dataflow\n`UpdateJob` call, but only as a transition from `JOB_STATE_RUNNING`. Jobs\nthat are draining may only transition to `JOB_STATE_DRAINED`,\n`JOB_STATE_CANCELLED`, or `JOB_STATE_FAILED`.",
+            "`JOB_STATE_DRAINED` indicates that the job has been drained.\nA drained job terminated by stopping pulling from its input sources and\nprocessing any data that remained in-flight when draining was requested.\nThis state is a terminal state, may only be set by the Cloud Dataflow\nservice, and only as a transition from `JOB_STATE_DRAINING`."
+          ],
+          "enum": [
+            "JOB_STATE_UNKNOWN",
+            "JOB_STATE_STOPPED",
+            "JOB_STATE_RUNNING",
+            "JOB_STATE_DONE",
+            "JOB_STATE_FAILED",
+            "JOB_STATE_CANCELLED",
+            "JOB_STATE_UPDATED",
+            "JOB_STATE_DRAINING",
+            "JOB_STATE_DRAINED"
+          ],
+          "description": "The current state of the job.\n\nJobs are created in the `JOB_STATE_STOPPED` state unless otherwise\nspecified.\n\nA job in the `JOB_STATE_RUNNING` state may asynchronously enter a\nterminal state. After a job has reached a terminal state, no\nfurther state updates may be made.\n\nThis field may be mutated by the Cloud Dataflow service;\ncallers cannot mutate it.",
+          "type": "string"
         },
         "location": {
-         "type": "string",
-         "description": "The location that contains this job.",
-         "location": "query"
+          "description": "The location that contains this job.",
+          "type": "string"
+        },
+        "currentStateTime": {
+          "description": "The timestamp associated with the current state.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "transformNameMapping": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "The map of transform name prefixes of the job to be replaced to the\ncorresponding name prefixes of the new job.",
+          "type": "object"
+        },
+        "createTime": {
+          "description": "The timestamp when the job was initially created. Immutable and set by the\nCloud Dataflow service.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "environment": {
+          "$ref": "Environment",
+          "description": "The environment for the job."
+        },
+        "labels": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "User-defined labels for this job.\n\nThe labels map can contain no more than 64 entries.  Entries of the labels\nmap are UTF8 strings that comply with the following restrictions:\n\n* Keys must conform to regexp:  \\p{Ll}\\p{Lo}{0,62}\n* Values must conform to regexp:  [\\p{Ll}\\p{Lo}\\p{N}_-]{0,63}\n* Both keys and values are additionally constrained to be \u003c= 128 bytes in\nsize."
         }
-       },
-       "parameterOrder": [
-        "projectId"
-       ],
-       "request": {
-        "$ref": "Job"
-       },
-       "response": {
-        "$ref": "Job"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform",
-        "https://www.googleapis.com/auth/userinfo.email"
-       ]
       },
-      "get": {
-       "id": "dataflow.projects.jobs.get",
-       "path": "v1b3/projects/{projectId}/jobs/{jobId}",
-       "httpMethod": "GET",
-       "description": "Gets the state of the specified Cloud Dataflow job.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "The ID of the Cloud Platform project that the job belongs to.",
-         "required": true,
-         "location": "path"
+      "id": "Job"
+    },
+    "DynamicSourceSplit": {
+      "description": "When a task splits using WorkItemStatus.dynamic_source_split, this\nmessage describes the two parts of the split relative to the\ndescription of the current task's input.",
+      "type": "object",
+      "properties": {
+        "primary": {
+          "description": "Primary part (continued to be processed by worker).\nSpecified relative to the previously-current source.\nBecomes current.",
+          "$ref": "DerivedSource"
         },
-        "jobId": {
-         "type": "string",
-         "description": "The job ID.",
-         "required": true,
-         "location": "path"
-        },
-        "view": {
-         "type": "string",
-         "description": "The level of information requested in response.",
-         "enum": [
-          "JOB_VIEW_UNKNOWN",
-          "JOB_VIEW_SUMMARY",
-          "JOB_VIEW_ALL"
-         ],
-         "location": "query"
-        },
-        "location": {
-         "type": "string",
-         "description": "The location that contains this job.",
-         "location": "query"
+        "residual": {
+          "description": "Residual part (returned to the pool of work).\nSpecified relative to the previously-current source.",
+          "$ref": "DerivedSource"
         }
-       },
-       "parameterOrder": [
-        "projectId",
-        "jobId"
-       ],
-       "response": {
-        "$ref": "Job"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform",
-        "https://www.googleapis.com/auth/userinfo.email"
-       ]
       },
-      "update": {
-       "id": "dataflow.projects.jobs.update",
-       "path": "v1b3/projects/{projectId}/jobs/{jobId}",
-       "httpMethod": "PUT",
-       "description": "Updates the state of an existing Cloud Dataflow job.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "The ID of the Cloud Platform project that the job belongs to.",
-         "required": true,
-         "location": "path"
+      "id": "DynamicSourceSplit"
+    },
+    "DerivedSource": {
+      "description": "Specification of one of the bundles produced as a result of splitting\na Source (e.g. when executing a SourceSplitRequest, or when\nsplitting an active task using WorkItemStatus.dynamic_source_split),\nrelative to the source being split.",
+      "type": "object",
+      "properties": {
+        "derivationMode": {
+          "enum": [
+            "SOURCE_DERIVATION_MODE_UNKNOWN",
+            "SOURCE_DERIVATION_MODE_INDEPENDENT",
+            "SOURCE_DERIVATION_MODE_CHILD_OF_CURRENT",
+            "SOURCE_DERIVATION_MODE_SIBLING_OF_CURRENT"
+          ],
+          "description": "What source to base the produced source on (if any).",
+          "type": "string",
+          "enumDescriptions": [
+            "The source derivation is unknown, or unspecified.",
+            "Produce a completely independent Source with no base.",
+            "Produce a Source based on the Source being split.",
+            "Produce a Source based on the base of the Source being split."
+          ]
         },
-        "jobId": {
-         "type": "string",
-         "description": "The job ID.",
-         "required": true,
-         "location": "path"
-        },
-        "location": {
-         "type": "string",
-         "description": "The location that contains this job.",
-         "location": "query"
+        "source": {
+          "description": "Specification of the source.",
+          "$ref": "Source"
         }
-       },
-       "parameterOrder": [
-        "projectId",
-        "jobId"
-       ],
-       "request": {
-        "$ref": "Job"
-       },
-       "response": {
-        "$ref": "Job"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform",
-        "https://www.googleapis.com/auth/userinfo.email"
-       ]
       },
-      "list": {
-       "id": "dataflow.projects.jobs.list",
-       "path": "v1b3/projects/{projectId}/jobs",
-       "httpMethod": "GET",
-       "description": "List the jobs of a project.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "The project which owns the jobs.",
-         "required": true,
-         "location": "path"
+      "id": "DerivedSource"
+    },
+    "SourceOperationResponse": {
+      "id": "SourceOperationResponse",
+      "description": "The result of a SourceOperationRequest, specified in\nReportWorkItemStatusRequest.source_operation when the work item\nis completed.",
+      "type": "object",
+      "properties": {
+        "split": {
+          "$ref": "SourceSplitResponse",
+          "description": "A response to a request to split a source."
         },
-        "filter": {
-         "type": "string",
-         "description": "The kind of filter to use.",
-         "enum": [
-          "UNKNOWN",
-          "ALL",
-          "TERMINATED",
-          "ACTIVE"
-         ],
-         "location": "query"
-        },
-        "view": {
-         "type": "string",
-         "description": "Level of information requested in response. Default is `JOB_VIEW_SUMMARY`.",
-         "enum": [
-          "JOB_VIEW_UNKNOWN",
-          "JOB_VIEW_SUMMARY",
-          "JOB_VIEW_ALL"
-         ],
-         "location": "query"
-        },
-        "pageSize": {
-         "type": "integer",
-         "description": "If there are many jobs, limit response to at most this many. The actual number of jobs returned will be the lesser of max_responses and an unspecified server-defined limit.",
-         "format": "int32",
-         "location": "query"
-        },
-        "pageToken": {
-         "type": "string",
-         "description": "Set this to the 'next_page_token' field of a previous response to request additional results in a long list.",
-         "location": "query"
-        },
-        "location": {
-         "type": "string",
-         "description": "The location that contains this job.",
-         "location": "query"
+        "getMetadata": {
+          "$ref": "SourceGetMetadataResponse",
+          "description": "A response to a request to get metadata about a source."
         }
-       },
-       "parameterOrder": [
-        "projectId"
-       ],
-       "response": {
-        "$ref": "ListJobsResponse"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform",
-        "https://www.googleapis.com/auth/userinfo.email"
-       ]
-      },
-      "getMetrics": {
-       "id": "dataflow.projects.jobs.getMetrics",
-       "path": "v1b3/projects/{projectId}/jobs/{jobId}/metrics",
-       "httpMethod": "GET",
-       "description": "Request the job status.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "A project id.",
-         "required": true,
-         "location": "path"
-        },
-        "jobId": {
-         "type": "string",
-         "description": "The job to get messages for.",
-         "required": true,
-         "location": "path"
-        },
-        "startTime": {
-         "type": "string",
-         "description": "Return only metric data that has changed since this time. Default is to return all information about all metrics for the job.",
-         "location": "query"
-        },
-        "location": {
-         "type": "string",
-         "description": "The location which contains the job specified by job_id.",
-         "location": "query"
-        }
-       },
-       "parameterOrder": [
-        "projectId",
-        "jobId"
-       ],
-       "response": {
-        "$ref": "JobMetrics"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform",
-        "https://www.googleapis.com/auth/userinfo.email"
-       ]
       }
-     },
-     "resources": {
-      "debug": {
-       "methods": {
-        "getConfig": {
-         "id": "dataflow.projects.jobs.debug.getConfig",
-         "path": "v1b3/projects/{projectId}/jobs/{jobId}/debug/getConfig",
-         "httpMethod": "POST",
-         "description": "Get encoded debug configuration for component. Not cacheable.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "The project id.",
-           "required": true,
-           "location": "path"
-          },
-          "jobId": {
-           "type": "string",
-           "description": "The job id.",
-           "required": true,
-           "location": "path"
+    },
+    "SendDebugCaptureResponse": {
+      "description": "Response to a send capture request.\nnothing",
+      "type": "object",
+      "properties": {},
+      "id": "SendDebugCaptureResponse"
+    },
+    "SideInputInfo": {
+      "id": "SideInputInfo",
+      "description": "Information about a side input of a DoFn or an input of a SeqDoFn.",
+      "type": "object",
+      "properties": {
+        "sources": {
+          "description": "The source(s) to read element(s) from to get the value of this side input.\nIf more than one source, then the elements are taken from the\nsources, in the specified order if order matters.\nAt least one source is required.",
+          "type": "array",
+          "items": {
+            "$ref": "Source"
           }
-         },
-         "parameterOrder": [
-          "projectId",
-          "jobId"
-         ],
-         "request": {
-          "$ref": "GetDebugConfigRequest"
-         },
-         "response": {
-          "$ref": "GetDebugConfigResponse"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform",
-          "https://www.googleapis.com/auth/userinfo.email"
-         ]
         },
-        "sendCapture": {
-         "id": "dataflow.projects.jobs.debug.sendCapture",
-         "path": "v1b3/projects/{projectId}/jobs/{jobId}/debug/sendCapture",
-         "httpMethod": "POST",
-         "description": "Send encoded debug capture data for component.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "The project id.",
-           "required": true,
-           "location": "path"
-          },
-          "jobId": {
-           "type": "string",
-           "description": "The job id.",
-           "required": true,
-           "location": "path"
+        "kind": {
+          "description": "How to interpret the source element(s) as a side input value.",
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
           }
-         },
-         "parameterOrder": [
-          "projectId",
-          "jobId"
-         ],
-         "request": {
-          "$ref": "SendDebugCaptureRequest"
-         },
-         "response": {
-          "$ref": "SendDebugCaptureResponse"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform",
-          "https://www.googleapis.com/auth/userinfo.email"
-         ]
+        },
+        "tag": {
+          "description": "The id of the tag the user code will access this side input by;\nthis should correspond to the tag of some MultiOutputInfo.",
+          "type": "string"
         }
-       }
+      }
+    },
+    "ConcatPosition": {
+      "description": "A position that encapsulates an inner position and an index for the inner\nposition. A ConcatPosition can be used by a reader of a source that\nencapsulates a set of other sources.",
+      "type": "object",
+      "properties": {
+        "position": {
+          "description": "Position within the inner source.",
+          "$ref": "Position"
+        },
+        "index": {
+          "description": "Index of the inner source.",
+          "format": "int32",
+          "type": "integer"
+        }
       },
-      "messages": {
-       "methods": {
-        "list": {
-         "id": "dataflow.projects.jobs.messages.list",
-         "path": "v1b3/projects/{projectId}/jobs/{jobId}/messages",
-         "httpMethod": "GET",
-         "description": "Request the job status.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "A project id.",
-           "required": true,
-           "location": "path"
+      "id": "ConcatPosition"
+    },
+    "WriteInstruction": {
+      "description": "An instruction that writes records.\nTakes one input, produces no outputs.",
+      "type": "object",
+      "properties": {
+        "input": {
+          "description": "The input.",
+          "$ref": "InstructionInput"
+        },
+        "sink": {
+          "$ref": "Sink",
+          "description": "The sink to write to."
+        }
+      },
+      "id": "WriteInstruction"
+    },
+    "CounterStructuredNameAndMetadata": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "$ref": "CounterStructuredName",
+          "description": "Structured name of the counter."
+        },
+        "metadata": {
+          "description": "Metadata associated with a counter",
+          "$ref": "CounterMetadata"
+        }
+      },
+      "id": "CounterStructuredNameAndMetadata",
+      "description": "A single message which encapsulates structured name and metadata for a given\ncounter."
+    },
+    "StreamingComputationRanges": {
+      "description": "Describes full or partial data disk assignment information of the computation\nranges.",
+      "type": "object",
+      "properties": {
+        "rangeAssignments": {
+          "description": "Data disk assignments for ranges from this computation.",
+          "type": "array",
+          "items": {
+            "$ref": "KeyRangeDataDiskAssignment"
+          }
+        },
+        "computationId": {
+          "description": "The ID of the computation.",
+          "type": "string"
+        }
+      },
+      "id": "StreamingComputationRanges"
+    },
+    "AutoscalingSettings": {
+      "description": "Settings for WorkerPool autoscaling.",
+      "type": "object",
+      "properties": {
+        "maxNumWorkers": {
+          "description": "The maximum number of workers to cap scaling at.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "algorithm": {
+          "enumDescriptions": [
+            "The algorithm is unknown, or unspecified.",
+            "Disable autoscaling.",
+            "Increase worker count over time to reduce job execution time."
+          ],
+          "enum": [
+            "AUTOSCALING_ALGORITHM_UNKNOWN",
+            "AUTOSCALING_ALGORITHM_NONE",
+            "AUTOSCALING_ALGORITHM_BASIC"
+          ],
+          "description": "The algorithm to use for autoscaling.",
+          "type": "string"
+        }
+      },
+      "id": "AutoscalingSettings"
+    },
+    "SendWorkerMessagesRequest": {
+      "type": "object",
+      "properties": {
+        "workerMessages": {
+          "description": "The WorkerMessages to send.",
+          "type": "array",
+          "items": {
+            "$ref": "WorkerMessage"
+          }
+        }
+      },
+      "id": "SendWorkerMessagesRequest",
+      "description": "A request for sending worker messages to the service."
+    },
+    "SourceSplitShard": {
+      "type": "object",
+      "properties": {
+        "source": {
+          "$ref": "Source",
+          "description": "DEPRECATED"
+        },
+        "derivationMode": {
+          "description": "DEPRECATED",
+          "type": "string",
+          "enumDescriptions": [
+            "The source derivation is unknown, or unspecified.",
+            "Produce a completely independent Source with no base.",
+            "Produce a Source based on the Source being split.",
+            "Produce a Source based on the base of the Source being split."
+          ],
+          "enum": [
+            "SOURCE_DERIVATION_MODE_UNKNOWN",
+            "SOURCE_DERIVATION_MODE_INDEPENDENT",
+            "SOURCE_DERIVATION_MODE_CHILD_OF_CURRENT",
+            "SOURCE_DERIVATION_MODE_SIBLING_OF_CURRENT"
+          ]
+        }
+      },
+      "id": "SourceSplitShard",
+      "description": "DEPRECATED in favor of DerivedSource."
+    },
+    "CPUTime": {
+      "id": "CPUTime",
+      "description": "Modeled after information exposed by /proc/stat.",
+      "type": "object",
+      "properties": {
+        "rate": {
+          "description": "Average CPU utilization rate (% non-idle cpu / second) since previous\nsample.",
+          "format": "double",
+          "type": "number"
+        },
+        "timestamp": {
+          "description": "Timestamp of the measurement.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "totalMs": {
+          "type": "string",
+          "description": "Total active CPU time across all cores (ie., non-idle) in milliseconds\nsince start-up.",
+          "format": "uint64"
+        }
+      }
+    },
+    "Environment": {
+      "description": "Describes the environment in which a Dataflow Job runs.",
+      "type": "object",
+      "properties": {
+        "workerPools": {
+          "description": "The worker pools. At least one \"harness\" worker pool must be\nspecified in order for the job to have workers.",
+          "type": "array",
+          "items": {
+            "$ref": "WorkerPool"
+          }
+        },
+        "dataset": {
+          "description": "The dataset for the current project where various workflow\nrelated tables are stored.\n\nThe supported resource type is:\n\nGoogle BigQuery:\n  bigquery.googleapis.com/{dataset}",
+          "type": "string"
+        },
+        "experiments": {
+          "description": "The list of experiments to enable.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "internalExperiments": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
           },
-          "jobId": {
-           "type": "string",
-           "description": "The job to get messages about.",
-           "required": true,
-           "location": "path"
+          "description": "Experimental settings.",
+          "type": "object"
+        },
+        "version": {
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
           },
-          "minimumImportance": {
-           "type": "string",
-           "description": "Filter to only get messages with importance \u003e= level",
-           "enum": [
+          "description": "A structure describing which components and their versions of the service\nare required in order to run the job."
+        },
+        "serviceAccountEmail": {
+          "description": "Identity to run virtual machines as. Defaults to the default account.",
+          "type": "string"
+        },
+        "userAgent": {
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
+          },
+          "description": "A description of the process that generated the request."
+        },
+        "sdkPipelineOptions": {
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
+          },
+          "description": "The Cloud Dataflow SDK pipeline options specified by the user. These\noptions are passed through the service and are used to recreate the\nSDK pipeline options on the worker in a language agnostic and platform\nindependent way.",
+          "type": "object"
+        },
+        "clusterManagerApiService": {
+          "description": "The type of cluster manager API to use.  If unknown or\nunspecified, the service will attempt to choose a reasonable\ndefault.  This should be in the form of the API service name,\ne.g. \"compute.googleapis.com\".",
+          "type": "string"
+        },
+        "tempStoragePrefix": {
+          "description": "The prefix of the resources the system should use for temporary\nstorage.  The system will append the suffix \"/temp-{JOBNAME} to\nthis resource prefix, where {JOBNAME} is the value of the\njob_name field.  The resulting bucket and object prefix is used\nas the prefix of the resources used to store temporary data\nneeded during the job execution.  NOTE: This will override the\nvalue in taskrunner_settings.\nThe supported resource type is:\n\nGoogle Cloud Storage:\n\n  storage.googleapis.com/{bucket}/{object}\n  bucket.storage.googleapis.com/{object}",
+          "type": "string"
+        }
+      },
+      "id": "Environment"
+    },
+    "StreamingComputationTask": {
+      "description": "A task which describes what action should be performed for the specified\nstreaming computation ranges.",
+      "type": "object",
+      "properties": {
+        "computationRanges": {
+          "description": "Contains ranges of a streaming computation this task should apply to.",
+          "type": "array",
+          "items": {
+            "$ref": "StreamingComputationRanges"
+          }
+        },
+        "dataDisks": {
+          "description": "Describes the set of data disks this task should apply to.",
+          "type": "array",
+          "items": {
+            "$ref": "MountedDataDisk"
+          }
+        },
+        "taskType": {
+          "enum": [
+            "STREAMING_COMPUTATION_TASK_UNKNOWN",
+            "STREAMING_COMPUTATION_TASK_STOP",
+            "STREAMING_COMPUTATION_TASK_START"
+          ],
+          "description": "A type of streaming computation task.",
+          "type": "string",
+          "enumDescriptions": [
+            "The streaming computation task is unknown, or unspecified.",
+            "Stop processing specified streaming computation range(s).",
+            "Start processing specified streaming computation range(s)."
+          ]
+        }
+      },
+      "id": "StreamingComputationTask"
+    },
+    "SendDebugCaptureRequest": {
+      "id": "SendDebugCaptureRequest",
+      "description": "Request to send encoded debug information.",
+      "type": "object",
+      "properties": {
+        "data": {
+          "description": "The encoded debug information.",
+          "type": "string"
+        },
+        "componentId": {
+          "description": "The internal component id for which debug information is sent.",
+          "type": "string"
+        },
+        "workerId": {
+          "description": "The worker id, i.e., VM hostname.",
+          "type": "string"
+        }
+      }
+    },
+    "GetDebugConfigResponse": {
+      "description": "Response to a get debug configuration request.",
+      "type": "object",
+      "properties": {
+        "config": {
+          "type": "string",
+          "description": "The encoded debug configuration for the requested component."
+        }
+      },
+      "id": "GetDebugConfigResponse"
+    },
+    "StreamingSetupTask": {
+      "description": "A task which initializes part of a streaming Dataflow job.",
+      "type": "object",
+      "properties": {
+        "streamingComputationTopology": {
+          "$ref": "TopologyConfig",
+          "description": "The global topology of the streaming Dataflow job."
+        },
+        "workerHarnessPort": {
+          "description": "The TCP port used by the worker to communicate with the Dataflow\nworker harness.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "drain": {
+          "description": "The user has requested drain.",
+          "type": "boolean"
+        },
+        "receiveWorkPort": {
+          "description": "The TCP port on which the worker should listen for messages from\nother streaming computation workers.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "StreamingSetupTask"
+    },
+    "PubsubLocation": {
+      "description": "Identifies a pubsub location to use for transferring data into or\nout of a streaming Dataflow job.",
+      "type": "object",
+      "properties": {
+        "subscription": {
+          "description": "A pubsub subscription, in the form of\n\"pubsub.googleapis.com/subscriptions/\u003cproject-id\u003e/\u003csubscription-name\u003e\"",
+          "type": "string"
+        },
+        "dropLateData": {
+          "description": "Indicates whether the pipeline allows late-arriving data.",
+          "type": "boolean"
+        },
+        "trackingSubscription": {
+          "description": "If set, specifies the pubsub subscription that will be used for tracking\ncustom time timestamps for watermark estimation.",
+          "type": "string"
+        },
+        "withAttributes": {
+          "description": "If true, then the client has requested to get pubsub attributes.",
+          "type": "boolean"
+        },
+        "idLabel": {
+          "description": "If set, contains a pubsub label from which to extract record ids.\nIf left empty, record deduplication will be strictly best effort.",
+          "type": "string"
+        },
+        "topic": {
+          "description": "A pubsub topic, in the form of\n\"pubsub.googleapis.com/topics/\u003cproject-id\u003e/\u003ctopic-name\u003e\"",
+          "type": "string"
+        },
+        "timestampLabel": {
+          "description": "If set, contains a pubsub label from which to extract record timestamps.\nIf left empty, record timestamps will be generated upon arrival.",
+          "type": "string"
+        }
+      },
+      "id": "PubsubLocation"
+    },
+    "WorkerHealthReport": {
+      "description": "WorkerHealthReport contains information about the health of a worker.\n\nThe VM should be identified by the labels attached to the WorkerMessage that\nthis health ping belongs to.",
+      "type": "object",
+      "properties": {
+        "pods": {
+          "description": "The pods running on the worker. See:\nhttp://kubernetes.io/v1.1/docs/api-reference/v1/definitions.html#_v1_pod\n\nThis field is used by the worker to send the status of the indvidual\ncontainers running on each worker.",
+          "type": "array",
+          "items": {
+            "type": "object",
+            "additionalProperties": {
+              "description": "Properties of the object.",
+              "type": "any"
+            }
+          }
+        },
+        "vmStartupTime": {
+          "description": "The time the VM was booted.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "vmIsHealthy": {
+          "description": "Whether the VM is healthy.",
+          "type": "boolean"
+        },
+        "reportInterval": {
+          "description": "The interval at which the worker is sending health reports.\nThe default value of 0 should be interpreted as the field is not being\nexplicitly set by the worker.",
+          "format": "google-duration",
+          "type": "string"
+        }
+      },
+      "id": "WorkerHealthReport"
+    },
+    "JobMessage": {
+      "description": "A particular message pertaining to a Dataflow job.",
+      "type": "object",
+      "properties": {
+        "messageText": {
+          "description": "The text of the message.",
+          "type": "string"
+        },
+        "messageImportance": {
+          "enum": [
             "JOB_MESSAGE_IMPORTANCE_UNKNOWN",
             "JOB_MESSAGE_DEBUG",
             "JOB_MESSAGE_DETAILED",
             "JOB_MESSAGE_BASIC",
             "JOB_MESSAGE_WARNING",
             "JOB_MESSAGE_ERROR"
-           ],
-           "location": "query"
-          },
-          "pageSize": {
-           "type": "integer",
-           "description": "If specified, determines the maximum number of messages to return. If unspecified, the service may choose an appropriate default, or may return an arbitrarily large number of results.",
-           "format": "int32",
-           "location": "query"
-          },
-          "pageToken": {
-           "type": "string",
-           "description": "If supplied, this should be the value of next_page_token returned by an earlier call. This will cause the next page of results to be returned.",
-           "location": "query"
-          },
-          "startTime": {
-           "type": "string",
-           "description": "If specified, return only messages with timestamps \u003e= start_time. The default is the job creation time (i.e. beginning of messages).",
-           "location": "query"
-          },
-          "endTime": {
-           "type": "string",
-           "description": "Return only messages with timestamps \u003c end_time. The default is now (i.e. return up to the latest messages available).",
-           "location": "query"
-          },
-          "location": {
-           "type": "string",
-           "description": "The location which contains the job specified by job_id.",
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "jobId"
-         ],
-         "response": {
-          "$ref": "ListJobMessagesResponse"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform",
-          "https://www.googleapis.com/auth/userinfo.email"
-         ]
+          ],
+          "description": "Importance level of the message.",
+          "type": "string",
+          "enumDescriptions": [
+            "The message importance isn't specified, or is unknown.",
+            "The message is at the 'debug' level: typically only useful for\nsoftware engineers working on the code the job is running.\nTypically, Dataflow pipeline runners do not display log messages\nat this level by default.",
+            "The message is at the 'detailed' level: somewhat verbose, but\npotentially useful to users.  Typically, Dataflow pipeline\nrunners do not display log messages at this level by default.\nThese messages are displayed by default in the Dataflow\nmonitoring UI.",
+            "The message is at the 'basic' level: useful for keeping\ntrack of the execution of a Dataflow pipeline.  Typically,\nDataflow pipeline runners display log messages at this level by\ndefault, and these messages are displayed by default in the\nDataflow monitoring UI.",
+            "The message is at the 'warning' level: indicating a condition\npertaining to a job which may require human intervention.\nTypically, Dataflow pipeline runners display log messages at this\nlevel by default, and these messages are displayed by default in\nthe Dataflow monitoring UI.",
+            "The message is at the 'error' level: indicating a condition\npreventing a job from succeeding.  Typically, Dataflow pipeline\nrunners display log messages at this level by default, and these\nmessages are displayed by default in the Dataflow monitoring UI."
+          ]
+        },
+        "time": {
+          "description": "The timestamp of the message.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "id": {
+          "description": "Identifies the message.  This is automatically generated by the\nservice; the caller should treat it as an opaque string.",
+          "type": "string"
         }
-       }
       },
-      "workItems": {
-       "methods": {
-        "reportStatus": {
-         "id": "dataflow.projects.jobs.workItems.reportStatus",
-         "path": "v1b3/projects/{projectId}/jobs/{jobId}/workItems:reportStatus",
-         "httpMethod": "POST",
-         "description": "Reports the status of dataflow WorkItems leased by a worker.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "The project which owns the WorkItem's job.",
-           "required": true,
-           "location": "path"
-          },
-          "jobId": {
-           "type": "string",
-           "description": "The job which the WorkItem is part of.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "jobId"
-         ],
-         "request": {
-          "$ref": "ReportWorkItemStatusRequest"
-         },
-         "response": {
-          "$ref": "ReportWorkItemStatusResponse"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform",
-          "https://www.googleapis.com/auth/userinfo.email"
-         ]
-        },
-        "lease": {
-         "id": "dataflow.projects.jobs.workItems.lease",
-         "path": "v1b3/projects/{projectId}/jobs/{jobId}/workItems:lease",
-         "httpMethod": "POST",
-         "description": "Leases a dataflow WorkItem to run.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "Identifies the project this worker belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "jobId": {
-           "type": "string",
-           "description": "Identifies the workflow job this worker belongs to.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "jobId"
-         ],
-         "request": {
-          "$ref": "LeaseWorkItemRequest"
-         },
-         "response": {
-          "$ref": "LeaseWorkItemResponse"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform",
-          "https://www.googleapis.com/auth/userinfo.email"
-         ]
-        }
-       }
-      }
-     }
+      "id": "JobMessage"
     },
-    "locations": {
-     "resources": {
-      "jobs": {
-       "methods": {
-        "create": {
-         "id": "dataflow.projects.locations.jobs.create",
-         "path": "v1b3/projects/{projectId}/locations/{location}/jobs",
-         "httpMethod": "POST",
-         "description": "Creates a Cloud Dataflow job.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "The ID of the Cloud Platform project that the job belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "location": {
-           "type": "string",
-           "description": "The location that contains this job.",
-           "required": true,
-           "location": "path"
-          },
-          "view": {
-           "type": "string",
-           "description": "The level of information requested in response.",
-           "enum": [
-            "JOB_VIEW_UNKNOWN",
-            "JOB_VIEW_SUMMARY",
-            "JOB_VIEW_ALL"
-           ],
-           "location": "query"
-          },
-          "replaceJobId": {
-           "type": "string",
-           "description": "Deprecated. This field is now in the Job message.",
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "location"
-         ],
-         "request": {
-          "$ref": "Job"
-         },
-         "response": {
-          "$ref": "Job"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform",
-          "https://www.googleapis.com/auth/userinfo.email"
-         ]
-        },
-        "get": {
-         "id": "dataflow.projects.locations.jobs.get",
-         "path": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}",
-         "httpMethod": "GET",
-         "description": "Gets the state of the specified Cloud Dataflow job.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "The ID of the Cloud Platform project that the job belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "location": {
-           "type": "string",
-           "description": "The location that contains this job.",
-           "required": true,
-           "location": "path"
-          },
-          "jobId": {
-           "type": "string",
-           "description": "The job ID.",
-           "required": true,
-           "location": "path"
-          },
-          "view": {
-           "type": "string",
-           "description": "The level of information requested in response.",
-           "enum": [
-            "JOB_VIEW_UNKNOWN",
-            "JOB_VIEW_SUMMARY",
-            "JOB_VIEW_ALL"
-           ],
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "location",
-          "jobId"
-         ],
-         "response": {
-          "$ref": "Job"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform",
-          "https://www.googleapis.com/auth/userinfo.email"
-         ]
-        },
-        "update": {
-         "id": "dataflow.projects.locations.jobs.update",
-         "path": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}",
-         "httpMethod": "PUT",
-         "description": "Updates the state of an existing Cloud Dataflow job.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "The ID of the Cloud Platform project that the job belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "location": {
-           "type": "string",
-           "description": "The location that contains this job.",
-           "required": true,
-           "location": "path"
-          },
-          "jobId": {
-           "type": "string",
-           "description": "The job ID.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "location",
-          "jobId"
-         ],
-         "request": {
-          "$ref": "Job"
-         },
-         "response": {
-          "$ref": "Job"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform",
-          "https://www.googleapis.com/auth/userinfo.email"
-         ]
-        },
-        "list": {
-         "id": "dataflow.projects.locations.jobs.list",
-         "path": "v1b3/projects/{projectId}/locations/{location}/jobs",
-         "httpMethod": "GET",
-         "description": "List the jobs of a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "The project which owns the jobs.",
-           "required": true,
-           "location": "path"
-          },
-          "location": {
-           "type": "string",
-           "description": "The location that contains this job.",
-           "required": true,
-           "location": "path"
-          },
-          "filter": {
-           "type": "string",
-           "description": "The kind of filter to use.",
-           "enum": [
-            "UNKNOWN",
-            "ALL",
-            "TERMINATED",
-            "ACTIVE"
-           ],
-           "location": "query"
-          },
-          "view": {
-           "type": "string",
-           "description": "Level of information requested in response. Default is `JOB_VIEW_SUMMARY`.",
-           "enum": [
-            "JOB_VIEW_UNKNOWN",
-            "JOB_VIEW_SUMMARY",
-            "JOB_VIEW_ALL"
-           ],
-           "location": "query"
-          },
-          "pageSize": {
-           "type": "integer",
-           "description": "If there are many jobs, limit response to at most this many. The actual number of jobs returned will be the lesser of max_responses and an unspecified server-defined limit.",
-           "format": "int32",
-           "location": "query"
-          },
-          "pageToken": {
-           "type": "string",
-           "description": "Set this to the 'next_page_token' field of a previous response to request additional results in a long list.",
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "location"
-         ],
-         "response": {
-          "$ref": "ListJobsResponse"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform",
-          "https://www.googleapis.com/auth/userinfo.email"
-         ]
-        },
-        "getMetrics": {
-         "id": "dataflow.projects.locations.jobs.getMetrics",
-         "path": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/metrics",
-         "httpMethod": "GET",
-         "description": "Request the job status.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "A project id.",
-           "required": true,
-           "location": "path"
-          },
-          "location": {
-           "type": "string",
-           "description": "The location which contains the job specified by job_id.",
-           "required": true,
-           "location": "path"
-          },
-          "jobId": {
-           "type": "string",
-           "description": "The job to get messages for.",
-           "required": true,
-           "location": "path"
-          },
-          "startTime": {
-           "type": "string",
-           "description": "Return only metric data that has changed since this time. Default is to return all information about all metrics for the job.",
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "location",
-          "jobId"
-         ],
-         "response": {
-          "$ref": "JobMetrics"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform",
-          "https://www.googleapis.com/auth/userinfo.email"
-         ]
+    "MultiOutputInfo": {
+      "description": "Information about an output of a multi-output DoFn.",
+      "type": "object",
+      "properties": {
+        "tag": {
+          "description": "The id of the tag the user code will emit to this output by; this\nshould correspond to the tag of some SideInputInfo.",
+          "type": "string"
         }
-       },
-       "resources": {
-        "messages": {
-         "methods": {
-          "list": {
-           "id": "dataflow.projects.locations.jobs.messages.list",
-           "path": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/messages",
-           "httpMethod": "GET",
-           "description": "Request the job status.",
-           "parameters": {
-            "projectId": {
-             "type": "string",
-             "description": "A project id.",
-             "required": true,
-             "location": "path"
-            },
-            "location": {
-             "type": "string",
-             "description": "The location which contains the job specified by job_id.",
-             "required": true,
-             "location": "path"
-            },
-            "jobId": {
-             "type": "string",
-             "description": "The job to get messages about.",
-             "required": true,
-             "location": "path"
-            },
-            "minimumImportance": {
-             "type": "string",
-             "description": "Filter to only get messages with importance \u003e= level",
-             "enum": [
-              "JOB_MESSAGE_IMPORTANCE_UNKNOWN",
-              "JOB_MESSAGE_DEBUG",
-              "JOB_MESSAGE_DETAILED",
-              "JOB_MESSAGE_BASIC",
-              "JOB_MESSAGE_WARNING",
-              "JOB_MESSAGE_ERROR"
-             ],
-             "location": "query"
-            },
-            "pageSize": {
-             "type": "integer",
-             "description": "If specified, determines the maximum number of messages to return. If unspecified, the service may choose an appropriate default, or may return an arbitrarily large number of results.",
-             "format": "int32",
-             "location": "query"
-            },
-            "pageToken": {
-             "type": "string",
-             "description": "If supplied, this should be the value of next_page_token returned by an earlier call. This will cause the next page of results to be returned.",
-             "location": "query"
-            },
-            "startTime": {
-             "type": "string",
-             "description": "If specified, return only messages with timestamps \u003e= start_time. The default is the job creation time (i.e. beginning of messages).",
-             "location": "query"
-            },
-            "endTime": {
-             "type": "string",
-             "description": "Return only messages with timestamps \u003c end_time. The default is now (i.e. return up to the latest messages available).",
-             "location": "query"
-            }
-           },
-           "parameterOrder": [
-            "projectId",
-            "location",
-            "jobId"
-           ],
-           "response": {
-            "$ref": "ListJobMessagesResponse"
-           },
-           "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/userinfo.email"
-           ]
-          }
-         }
-        },
-        "workItems": {
-         "methods": {
-          "reportStatus": {
-           "id": "dataflow.projects.locations.jobs.workItems.reportStatus",
-           "path": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/workItems:reportStatus",
-           "httpMethod": "POST",
-           "description": "Reports the status of dataflow WorkItems leased by a worker.",
-           "parameters": {
-            "projectId": {
-             "type": "string",
-             "description": "The project which owns the WorkItem's job.",
-             "required": true,
-             "location": "path"
-            },
-            "location": {
-             "type": "string",
-             "description": "The location which contains the WorkItem's job.",
-             "required": true,
-             "location": "path"
-            },
-            "jobId": {
-             "type": "string",
-             "description": "The job which the WorkItem is part of.",
-             "required": true,
-             "location": "path"
-            }
-           },
-           "parameterOrder": [
-            "projectId",
-            "location",
-            "jobId"
-           ],
-           "request": {
-            "$ref": "ReportWorkItemStatusRequest"
-           },
-           "response": {
-            "$ref": "ReportWorkItemStatusResponse"
-           },
-           "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/userinfo.email"
-           ]
-          },
-          "lease": {
-           "id": "dataflow.projects.locations.jobs.workItems.lease",
-           "path": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/workItems:lease",
-           "httpMethod": "POST",
-           "description": "Leases a dataflow WorkItem to run.",
-           "parameters": {
-            "projectId": {
-             "type": "string",
-             "description": "Identifies the project this worker belongs to.",
-             "required": true,
-             "location": "path"
-            },
-            "location": {
-             "type": "string",
-             "description": "The location which contains the WorkItem's job.",
-             "required": true,
-             "location": "path"
-            },
-            "jobId": {
-             "type": "string",
-             "description": "Identifies the workflow job this worker belongs to.",
-             "required": true,
-             "location": "path"
-            }
-           },
-           "parameterOrder": [
-            "projectId",
-            "location",
-            "jobId"
-           ],
-           "request": {
-            "$ref": "LeaseWorkItemRequest"
-           },
-           "response": {
-            "$ref": "LeaseWorkItemResponse"
-           },
-           "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/userinfo.email"
-           ]
-          }
-         }
-        }
-       }
-      }
-     }
+      },
+      "id": "MultiOutputInfo"
     },
-    "templates": {
-     "methods": {
-      "create": {
-       "id": "dataflow.projects.templates.create",
-       "path": "v1b3/projects/{projectId}/templates",
-       "httpMethod": "POST",
-       "description": "Creates a Cloud Dataflow job from a template.",
-       "parameters": {
+    "SourceSplitRequest": {
+      "id": "SourceSplitRequest",
+      "description": "Represents the operation to split a high-level Source specification\ninto bundles (parts for parallel processing).\n\nAt a high level, splitting of a source into bundles happens as follows:\nSourceSplitRequest is applied to the source. If it returns\nSOURCE_SPLIT_OUTCOME_USE_CURRENT, no further splitting happens and the source\nis used \"as is\". Otherwise, splitting is applied recursively to each\nproduced DerivedSource.\n\nAs an optimization, for any Source, if its does_not_need_splitting is\ntrue, the framework assumes that splitting this source would return\nSOURCE_SPLIT_OUTCOME_USE_CURRENT, and doesn't initiate a SourceSplitRequest.\nThis applies both to the initial source being split and to bundles\nproduced from it.",
+      "type": "object",
+      "properties": {
+        "source": {
+          "$ref": "Source",
+          "description": "Specification of the source to be split."
+        },
+        "options": {
+          "description": "Hints for tuning the splitting process.",
+          "$ref": "SourceSplitOptions"
+        }
+      }
+    },
+    "SourceGetMetadataResponse": {
+      "description": "The result of a SourceGetMetadataOperation.",
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "$ref": "SourceMetadata",
+          "description": "The computed metadata."
+        }
+      },
+      "id": "SourceGetMetadataResponse"
+    },
+    "ShellTask": {
+      "properties": {
+        "exitCode": {
+          "description": "Exit code for the task.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "command": {
+          "description": "The shell command to run.",
+          "type": "string"
+        }
+      },
+      "id": "ShellTask",
+      "description": "A task which consists of a shell command for the worker to execute.",
+      "type": "object"
+    },
+    "MetricShortId": {
+      "description": "The metric short id is returned to the user alongside an offset into\nReportWorkItemStatusRequest",
+      "type": "object",
+      "properties": {
+        "metricIndex": {
+          "description": "The index of the corresponding metric in\nthe ReportWorkItemStatusRequest. Required.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "shortId": {
+          "description": "The service-generated short identifier for the metric.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "id": "MetricShortId"
+    },
+    "TaskRunnerSettings": {
+      "properties": {
+        "baseUrl": {
+          "description": "The base URL for the taskrunner to use when accessing Google Cloud APIs.\n\nWhen workers access Google Cloud APIs, they logically do so via\nrelative URLs.  If this field is specified, it supplies the base\nURL to use for resolving these relative URLs.  The normative\nalgorithm used is defined by RFC 1808, \"Relative Uniform Resource\nLocators\".\n\nIf not specified, the default value is \"http://www.googleapis.com/\"",
+          "type": "string"
+        },
+        "logToSerialconsole": {
+          "description": "Whether to send taskrunner log info to Google Compute Engine VM serial\nconsole.",
+          "type": "boolean"
+        },
+        "continueOnException": {
+          "description": "Whether to continue taskrunner if an exception is hit.",
+          "type": "boolean"
+        },
+        "parallelWorkerSettings": {
+          "description": "The settings to pass to the parallel worker harness.",
+          "$ref": "WorkerSettings"
+        },
+        "vmId": {
+          "description": "The ID string of the VM.",
+          "type": "string"
+        },
+        "taskUser": {
+          "description": "The UNIX user ID on the worker VM to use for tasks launched by\ntaskrunner; e.g. \"root\".",
+          "type": "string"
+        },
+        "alsologtostderr": {
+          "description": "Whether to also send taskrunner log info to stderr.",
+          "type": "boolean"
+        },
+        "taskGroup": {
+          "type": "string",
+          "description": "The UNIX group ID on the worker VM to use for tasks launched by\ntaskrunner; e.g. \"wheel\"."
+        },
+        "harnessCommand": {
+          "description": "The command to launch the worker harness.",
+          "type": "string"
+        },
+        "logDir": {
+          "description": "The directory on the VM to store logs.",
+          "type": "string"
+        },
+        "oauthScopes": {
+          "description": "The OAuth2 scopes to be requested by the taskrunner in order to\naccess the Cloud Dataflow API.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "dataflowApiVersion": {
+          "description": "The API version of endpoint, e.g. \"v1b3\"",
+          "type": "string"
+        },
+        "logUploadLocation": {
+          "description": "Indicates where to put logs.  If this is not specified, the logs\nwill not be uploaded.\n\nThe supported resource type is:\n\nGoogle Cloud Storage:\n  storage.googleapis.com/{bucket}/{object}\n  bucket.storage.googleapis.com/{object}",
+          "type": "string"
+        },
+        "streamingWorkerMainClass": {
+          "description": "The streaming worker main class name.",
+          "type": "string"
+        },
+        "workflowFileName": {
+          "description": "The file to store the workflow in.",
+          "type": "string"
+        },
+        "tempStoragePrefix": {
+          "description": "The prefix of the resources the taskrunner should use for\ntemporary storage.\n\nThe supported resource type is:\n\nGoogle Cloud Storage:\n  storage.googleapis.com/{bucket}/{object}\n  bucket.storage.googleapis.com/{object}",
+          "type": "string"
+        },
+        "baseTaskDir": {
+          "description": "The location on the worker for task-specific subdirectories.",
+          "type": "string"
+        },
+        "languageHint": {
+          "description": "The suggested backend language.",
+          "type": "string"
+        },
+        "commandlinesFileName": {
+          "description": "The file to store preprocessing commands in.",
+          "type": "string"
+        }
+      },
+      "id": "TaskRunnerSettings",
+      "description": "Taskrunner configuration settings.",
+      "type": "object"
+    },
+    "Position": {
+      "description": "Position defines a position within a collection of data.  The value\ncan be either the end position, a key (used with ordered\ncollections), a byte offset, or a record index.",
+      "type": "object",
+      "properties": {
+        "key": {
+          "description": "Position is a string key, ordered lexicographically.",
+          "type": "string"
+        },
+        "recordIndex": {
+          "description": "Position is a record index.",
+          "format": "int64",
+          "type": "string"
+        },
+        "shufflePosition": {
+          "description": "CloudPosition is a base64 encoded BatchShufflePosition (with FIXED\nsharding).",
+          "type": "string"
+        },
+        "concatPosition": {
+          "$ref": "ConcatPosition",
+          "description": "CloudPosition is a concat position."
+        },
+        "byteOffset": {
+          "description": "Position is a byte offset.",
+          "format": "int64",
+          "type": "string"
+        },
+        "end": {
+          "description": "Position is past all other positions. Also useful for the end\nposition of an unbounded range.",
+          "type": "boolean"
+        }
+      },
+      "id": "Position"
+    },
+    "SplitInt64": {
+      "description": "A representation of an int64, n, that is immune to precision loss when\nencoded in JSON.",
+      "type": "object",
+      "properties": {
+        "lowBits": {
+          "description": "The low order bits: n & 0xffffffff.",
+          "format": "uint32",
+          "type": "integer"
+        },
+        "highBits": {
+          "description": "The high order bits, including the sign: n \u003e\u003e 32.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "SplitInt64"
+    },
+    "Source": {
+      "description": "A source that records can be read and decoded from.",
+      "type": "object",
+      "properties": {
+        "codec": {
+          "description": "The codec to use to decode data read from the source.",
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
+          }
+        },
+        "doesNotNeedSplitting": {
+          "description": "Setting this value to true hints to the framework that the source\ndoesn't need splitting, and using SourceSplitRequest on it would\nyield SOURCE_SPLIT_OUTCOME_USE_CURRENT.\n\nE.g. a file splitter may set this to true when splitting a single file\ninto a set of byte ranges of appropriate size, and set this\nto false when splitting a filepattern into individual files.\nHowever, for efficiency, a file splitter may decide to produce\nfile subranges directly from the filepattern to avoid a splitting\nround-trip.\n\nSee SourceSplitRequest for an overview of the splitting process.\n\nThis field is meaningful only in the Source objects populated\nby the user (e.g. when filling in a DerivedSource).\nSource objects supplied by the framework to the user don't have\nthis field populated.",
+          "type": "boolean"
+        },
+        "spec": {
+          "description": "The source to read from, plus its parameters.",
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
+          }
+        },
+        "metadata": {
+          "description": "Optionally, metadata for this source can be supplied right away,\navoiding a SourceGetMetadataOperation roundtrip\n(see SourceOperationRequest).\n\nThis field is meaningful only in the Source objects populated\nby the user (e.g. when filling in a DerivedSource).\nSource objects supplied by the framework to the user don't have\nthis field populated.",
+          "$ref": "SourceMetadata"
+        },
+        "baseSpecs": {
+          "description": "While splitting, sources may specify the produced bundles\nas differences against another source, in order to save backend-side\nmemory and allow bigger jobs. For details, see SourceSplitRequest.\nTo support this use case, the full set of parameters of the source\nis logically obtained by taking the latest explicitly specified value\nof each parameter in the order:\nbase_specs (later items win), spec (overrides anything in base_specs).",
+          "type": "array",
+          "items": {
+            "additionalProperties": {
+              "description": "Properties of the object.",
+              "type": "any"
+            },
+            "type": "object"
+          }
+        }
+      },
+      "id": "Source"
+    },
+    "WorkerPool": {
+      "type": "object",
+      "properties": {
+        "packages": {
+          "description": "Packages to be installed on workers.",
+          "type": "array",
+          "items": {
+            "$ref": "Package"
+          }
+        },
+        "teardownPolicy": {
+          "description": "Sets the policy for determining when to turndown worker pool.\nAllowed values are: `TEARDOWN_ALWAYS`, `TEARDOWN_ON_SUCCESS`, and\n`TEARDOWN_NEVER`.\n`TEARDOWN_ALWAYS` means workers are always torn down regardless of whether\nthe job succeeds. `TEARDOWN_ON_SUCCESS` means workers are torn down\nif the job succeeds. `TEARDOWN_NEVER` means the workers are never torn\ndown.\n\nIf the workers are not torn down by the service, they will\ncontinue to run and use Google Compute Engine VM resources in the\nuser's project until they are explicitly terminated by the user.\nBecause of this, Google recommends using the `TEARDOWN_ALWAYS`\npolicy except for small, manually supervised test jobs.\n\nIf unknown or unspecified, the service will attempt to choose a reasonable\ndefault.",
+          "type": "string",
+          "enumDescriptions": [
+            "The teardown policy isn't specified, or is unknown.",
+            "Always teardown the resource.",
+            "Teardown the resource on success. This is useful for debugging\nfailures.",
+            "Never teardown the resource. This is useful for debugging and\ndevelopment."
+          ],
+          "enum": [
+            "TEARDOWN_POLICY_UNKNOWN",
+            "TEARDOWN_ALWAYS",
+            "TEARDOWN_ON_SUCCESS",
+            "TEARDOWN_NEVER"
+          ]
+        },
+        "onHostMaintenance": {
+          "description": "The action to take on host maintenance, as defined by the Google\nCompute Engine API.",
+          "type": "string"
+        },
+        "poolArgs": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "Extra arguments for this worker pool.",
+          "type": "object"
+        },
+        "diskSizeGb": {
+          "description": "Size of root disk for VMs, in GB.  If zero or unspecified, the service will\nattempt to choose a reasonable default.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "workerHarnessContainerImage": {
+          "description": "Required. Docker container image that executes the Cloud Dataflow worker\nharness, residing in Google Container Registry.",
+          "type": "string"
+        },
+        "machineType": {
+          "description": "Machine type (e.g. \"n1-standard-1\").  If empty or unspecified, the\nservice will attempt to choose a reasonable default.",
+          "type": "string"
+        },
+        "diskType": {
+          "description": "Type of root disk for VMs.  If empty or unspecified, the service will\nattempt to choose a reasonable default.",
+          "type": "string"
+        },
+        "kind": {
+          "description": "The kind of the worker pool; currently only `harness` and `shuffle`\nare supported.",
+          "type": "string"
+        },
+        "dataDisks": {
+          "description": "Data disks that are used by a VM in this workflow.",
+          "type": "array",
+          "items": {
+            "$ref": "Disk"
+          }
+        },
+        "subnetwork": {
+          "description": "Subnetwork to which VMs will be assigned, if desired.  Expected to be of\nthe form \"regions/REGION/subnetworks/SUBNETWORK\".",
+          "type": "string"
+        },
+        "ipConfiguration": {
+          "enum": [
+            "WORKER_IP_UNSPECIFIED",
+            "WORKER_IP_PUBLIC",
+            "WORKER_IP_PRIVATE"
+          ],
+          "description": "Configuration for VM IPs.",
+          "type": "string",
+          "enumDescriptions": [
+            "The configuration is unknown, or unspecified.",
+            "Workers should have public IP addresses.",
+            "Workers should have private IP addresses."
+          ]
+        },
+        "autoscalingSettings": {
+          "$ref": "AutoscalingSettings",
+          "description": "Settings for autoscaling of this WorkerPool."
+        },
+        "taskrunnerSettings": {
+          "$ref": "TaskRunnerSettings",
+          "description": "Settings passed through to Google Compute Engine workers when\nusing the standard Dataflow task runner.  Users should ignore\nthis field."
+        },
+        "metadata": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Metadata to set on the Google Compute Engine VMs.",
+          "type": "object"
+        },
+        "defaultPackageSet": {
+          "description": "The default package set to install.  This allows the service to\nselect a default set of packages which are useful to worker\nharnesses written in a particular language.",
+          "type": "string",
+          "enumDescriptions": [
+            "The default set of packages to stage is unknown, or unspecified.",
+            "Indicates that no packages should be staged at the worker unless\nexplicitly specified by the job.",
+            "Stage packages typically useful to workers written in Java.",
+            "Stage pacakges typically useful to workers written in Python."
+          ],
+          "enum": [
+            "DEFAULT_PACKAGE_SET_UNKNOWN",
+            "DEFAULT_PACKAGE_SET_NONE",
+            "DEFAULT_PACKAGE_SET_JAVA",
+            "DEFAULT_PACKAGE_SET_PYTHON"
+          ]
+        },
+        "network": {
+          "description": "Network to which VMs will be assigned.  If empty or unspecified,\nthe service will use the network \"default\".",
+          "type": "string"
+        },
+        "zone": {
+          "description": "Zone to run the worker pools in.  If empty or unspecified, the service\nwill attempt to choose a reasonable default.",
+          "type": "string"
+        },
+        "numWorkers": {
+          "description": "Number of Google Compute Engine workers in this pool needed to\nexecute the job.  If zero or unspecified, the service will\nattempt to choose a reasonable default.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "numThreadsPerWorker": {
+          "description": "The number of threads per worker harness. If empty or unspecified, the\nservice will choose a number of threads (according to the number of cores\non the selected machine type for batch, or 1 by convention for streaming).",
+          "format": "int32",
+          "type": "integer"
+        },
+        "diskSourceImage": {
+          "description": "Fully qualified source image for disks.",
+          "type": "string"
+        }
+      },
+      "id": "WorkerPool",
+      "description": "Describes one particular pool of Cloud Dataflow workers to be\ninstantiated by the Cloud Dataflow service in order to perform the\ncomputations required by a job.  Note that a workflow job may use\nmultiple pools, in order to match the various computational\nrequirements of the various stages of the job."
+    },
+    "SourceOperationRequest": {
+      "description": "A work item that represents the different operations that can be\nperformed on a user-defined Source specification.",
+      "type": "object",
+      "properties": {
+        "getMetadata": {
+          "$ref": "SourceGetMetadataRequest",
+          "description": "Information about a request to get metadata about a source."
+        },
+        "split": {
+          "$ref": "SourceSplitRequest",
+          "description": "Information about a request to split a source."
+        }
+      },
+      "id": "SourceOperationRequest"
+    },
+    "WorkItem": {
+      "type": "object",
+      "properties": {
+        "seqMapTask": {
+          "description": "Additional information for SeqMapTask WorkItems.",
+          "$ref": "SeqMapTask"
+        },
+        "packages": {
+          "description": "Any required packages that need to be fetched in order to execute\nthis WorkItem.",
+          "type": "array",
+          "items": {
+            "$ref": "Package"
+          }
+        },
         "projectId": {
-         "type": "string",
-         "description": "Required. The ID of the Cloud Platform project that the job belongs to.",
-         "required": true,
-         "location": "path"
+          "description": "Identifies the cloud project this WorkItem belongs to.",
+          "type": "string"
+        },
+        "reportStatusInterval": {
+          "description": "Recommended reporting interval.",
+          "format": "google-duration",
+          "type": "string"
+        },
+        "streamingSetupTask": {
+          "$ref": "StreamingSetupTask",
+          "description": "Additional information for StreamingSetupTask WorkItems."
+        },
+        "sourceOperationTask": {
+          "description": "Additional information for source operation WorkItems.",
+          "$ref": "SourceOperationRequest"
+        },
+        "streamingConfigTask": {
+          "$ref": "StreamingConfigTask",
+          "description": "Additional information for StreamingConfigTask WorkItems."
+        },
+        "leaseExpireTime": {
+          "type": "string",
+          "description": "Time when the lease on this Work will expire.",
+          "format": "google-datetime"
+        },
+        "initialReportIndex": {
+          "description": "The initial index to use when reporting the status of the WorkItem.",
+          "format": "int64",
+          "type": "string"
+        },
+        "shellTask": {
+          "$ref": "ShellTask",
+          "description": "Additional information for ShellTask WorkItems."
+        },
+        "streamingComputationTask": {
+          "description": "Additional information for StreamingComputationTask WorkItems.",
+          "$ref": "StreamingComputationTask"
+        },
+        "jobId": {
+          "description": "Identifies the workflow job this WorkItem belongs to.",
+          "type": "string"
+        },
+        "id": {
+          "description": "Identifies this WorkItem.",
+          "format": "int64",
+          "type": "string"
+        },
+        "configuration": {
+          "description": "Work item-specific configuration as an opaque blob.",
+          "type": "string"
+        },
+        "mapTask": {
+          "description": "Additional information for MapTask WorkItems.",
+          "$ref": "MapTask"
         }
-       },
-       "parameterOrder": [
-        "projectId"
-       ],
-       "request": {
-        "$ref": "CreateJobFromTemplateRequest"
-       },
-       "response": {
-        "$ref": "Job"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform",
-        "https://www.googleapis.com/auth/userinfo.email"
-       ]
+      },
+      "id": "WorkItem",
+      "description": "WorkItem represents basic information about a WorkItem to be executed\nin the cloud."
+    },
+    "ReportedParallelism": {
+      "description": "Represents the level of parallelism in a WorkItem's input,\nreported by the worker.",
+      "type": "object",
+      "properties": {
+        "isInfinite": {
+          "description": "Specifies whether the parallelism is infinite. If true, \"value\" is\nignored.\nInfinite parallelism means the service will assume that the work item\ncan always be split into more non-empty work items by dynamic splitting.\nThis is a work-around for lack of support for infinity by the current\nJSON-based Java RPC stack.",
+          "type": "boolean"
+        },
+        "value": {
+          "description": "Specifies the level of parallelism in case it is finite.",
+          "format": "double",
+          "type": "number"
+        }
+      },
+      "id": "ReportedParallelism"
+    },
+    "ResourceUtilizationReport": {
+      "properties": {
+        "cpuTime": {
+          "type": "array",
+          "items": {
+            "$ref": "CPUTime"
+          },
+          "description": "CPU utilization samples."
+        }
+      },
+      "id": "ResourceUtilizationReport",
+      "description": "Worker metrics exported from workers. This contains resource utilization\nmetrics accumulated from a variety of sources. For more information, see\ngo/df-resource-signals.",
+      "type": "object"
+    },
+    "TopologyConfig": {
+      "description": "Global topology of the streaming Dataflow job, including all\ncomputations and their sharded locations.",
+      "type": "object",
+      "properties": {
+        "forwardingKeyBits": {
+          "description": "The size (in bits) of keys that will be assigned to source messages.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "userStageToComputationNameMap": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Maps user stage names to stable computation names.",
+          "type": "object"
+        },
+        "computations": {
+          "description": "The computations associated with a streaming Dataflow job.",
+          "type": "array",
+          "items": {
+            "$ref": "ComputationTopology"
+          }
+        },
+        "dataDiskAssignments": {
+          "description": "The disks assigned to a streaming Dataflow job.",
+          "type": "array",
+          "items": {
+            "$ref": "DataDiskAssignment"
+          }
+        },
+        "persistentStateVersion": {
+          "type": "integer",
+          "description": "Version number for persistent state.",
+          "format": "int32"
+        }
+      },
+      "id": "TopologyConfig"
+    },
+    "SourceSplitOptions": {
+      "description": "Hints for splitting a Source into bundles (parts for parallel\nprocessing) using SourceSplitRequest.",
+      "type": "object",
+      "properties": {
+        "desiredShardSizeBytes": {
+          "description": "DEPRECATED in favor of desired_bundle_size_bytes.",
+          "format": "int64",
+          "type": "string"
+        },
+        "desiredBundleSizeBytes": {
+          "description": "The source should be split into a set of bundles where the estimated size\nof each is approximately this many bytes.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "id": "SourceSplitOptions"
+    },
+    "ReadInstruction": {
+      "description": "An instruction that reads records.\nTakes no inputs, produces one output.",
+      "type": "object",
+      "properties": {
+        "source": {
+          "$ref": "Source",
+          "description": "The source to read from."
+        }
+      },
+      "id": "ReadInstruction"
+    },
+    "WorkerSettings": {
+      "type": "object",
+      "properties": {
+        "servicePath": {
+          "description": "The Cloud Dataflow service path relative to the root URL, for example,\n\"dataflow/v1b3/projects\".",
+          "type": "string"
+        },
+        "shuffleServicePath": {
+          "description": "The Shuffle service path relative to the root URL, for example,\n\"shuffle/v1beta1\".",
+          "type": "string"
+        },
+        "workerId": {
+          "description": "The ID of the worker running this pipeline.",
+          "type": "string"
+        },
+        "tempStoragePrefix": {
+          "description": "The prefix of the resources the system should use for temporary\nstorage.\n\nThe supported resource type is:\n\nGoogle Cloud Storage:\n\n  storage.googleapis.com/{bucket}/{object}\n  bucket.storage.googleapis.com/{object}",
+          "type": "string"
+        },
+        "reportingEnabled": {
+          "description": "Whether to send work progress updates to the service.",
+          "type": "boolean"
+        },
+        "baseUrl": {
+          "type": "string",
+          "description": "The base URL for accessing Google Cloud APIs.\n\nWhen workers access Google Cloud APIs, they logically do so via\nrelative URLs.  If this field is specified, it supplies the base\nURL to use for resolving these relative URLs.  The normative\nalgorithm used is defined by RFC 1808, \"Relative Uniform Resource\nLocators\".\n\nIf not specified, the default value is \"http://www.googleapis.com/\""
+        }
+      },
+      "id": "WorkerSettings",
+      "description": "Provides data to pass through to the worker harness."
+    },
+    "StreamingStageLocation": {
+      "type": "object",
+      "properties": {
+        "streamId": {
+          "description": "Identifies the particular stream within the streaming Dataflow\njob.",
+          "type": "string"
+        }
+      },
+      "id": "StreamingStageLocation",
+      "description": "Identifies the location of a streaming computation stage, for\nstage-to-stage communication."
+    },
+    "DataDiskAssignment": {
+      "description": "Data disk assignment for a given VM instance.",
+      "type": "object",
+      "properties": {
+        "vmInstance": {
+          "type": "string",
+          "description": "VM instance name the data disks mounted to, for example\n\"myproject-1014-104817-4c2-harness-0\"."
+        },
+        "dataDisks": {
+          "description": "Mounted data disks. The order is important a data disk's 0-based index in\nthis list defines which persistent directory the disk is mounted to, for\nexample the list of { \"myproject-1014-104817-4c2-harness-0-disk-0\" },\n{ \"myproject-1014-104817-4c2-harness-0-disk-1\" }.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "DataDiskAssignment"
+    },
+    "ApproximateSplitRequest": {
+      "description": "A suggestion by the service to the worker to dynamically split the WorkItem.",
+      "type": "object",
+      "properties": {
+        "position": {
+          "$ref": "Position",
+          "description": "A Position at which to split the work item."
+        },
+        "fractionConsumed": {
+          "description": "A fraction at which to split the work item, from 0.0 (beginning of the\ninput) to 1.0 (end of the input).",
+          "format": "double",
+          "type": "number"
+        }
+      },
+      "id": "ApproximateSplitRequest"
+    },
+    "Status": {
+      "id": "Status",
+      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
+      "type": "object",
+      "properties": {
+        "code": {
+          "description": "The status code, which should be an enum value of google.rpc.Code.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "message": {
+          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
+          "type": "string"
+        },
+        "details": {
+          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
+          "type": "array",
+          "items": {
+            "additionalProperties": {
+              "description": "Properties of the object. Contains field @type with type URL.",
+              "type": "any"
+            },
+            "type": "object"
+          }
+        }
       }
-     }
+    },
+    "StreamLocation": {
+      "description": "Describes a stream of data, either as input to be processed or as\noutput of a streaming Dataflow job.",
+      "type": "object",
+      "properties": {
+        "customSourceLocation": {
+          "description": "The stream is a custom source.",
+          "$ref": "CustomSourceLocation"
+        },
+        "streamingStageLocation": {
+          "$ref": "StreamingStageLocation",
+          "description": "The stream is part of another computation within the current\nstreaming Dataflow job."
+        },
+        "pubsubLocation": {
+          "$ref": "PubsubLocation",
+          "description": "The stream is a pubsub stream."
+        },
+        "sideInputLocation": {
+          "description": "The stream is a streaming side input.",
+          "$ref": "StreamingSideInputLocation"
+        }
+      },
+      "id": "StreamLocation"
+    },
+    "SendWorkerMessagesResponse": {
+      "type": "object",
+      "properties": {
+        "workerMessageResponses": {
+          "description": "The servers response to the worker messages.",
+          "type": "array",
+          "items": {
+            "$ref": "WorkerMessageResponse"
+          }
+        }
+      },
+      "id": "SendWorkerMessagesResponse",
+      "description": "The response to the worker messages."
+    },
+    "LeaseWorkItemResponse": {
+      "description": "Response to a request to lease WorkItems.",
+      "type": "object",
+      "properties": {
+        "workItems": {
+          "description": "A list of the leased WorkItems.",
+          "type": "array",
+          "items": {
+            "$ref": "WorkItem"
+          }
+        }
+      },
+      "id": "LeaseWorkItemResponse"
+    },
+    "StreamingComputationConfig": {
+      "description": "Configuration information for a single streaming computation.",
+      "type": "object",
+      "properties": {
+        "systemName": {
+          "description": "System defined name for this computation.",
+          "type": "string"
+        },
+        "stageName": {
+          "description": "Stage name of this computation.",
+          "type": "string"
+        },
+        "instructions": {
+          "description": "Instructions that comprise the computation.",
+          "type": "array",
+          "items": {
+            "$ref": "ParallelInstruction"
+          }
+        },
+        "computationId": {
+          "description": "Unique identifier for this computation.",
+          "type": "string"
+        }
+      },
+      "id": "StreamingComputationConfig"
+    },
+    "Sink": {
+      "description": "A sink that records can be encoded and written to.",
+      "type": "object",
+      "properties": {
+        "codec": {
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
+          },
+          "description": "The codec to use to encode data written to the sink.",
+          "type": "object"
+        },
+        "spec": {
+          "additionalProperties": {
+            "type": "any",
+            "description": "Properties of the object."
+          },
+          "description": "The sink to write to, plus its parameters.",
+          "type": "object"
+        }
+      },
+      "id": "Sink"
+    },
+    "FlattenInstruction": {
+      "description": "An instruction that copies its inputs (zero or more) to its (single) output.",
+      "type": "object",
+      "properties": {
+        "inputs": {
+          "type": "array",
+          "items": {
+            "$ref": "InstructionInput"
+          },
+          "description": "Describes the inputs to the flatten instruction."
+        }
+      },
+      "id": "FlattenInstruction"
+    },
+    "PartialGroupByKeyInstruction": {
+      "description": "An instruction that does a partial group-by-key.\nOne input and one output.",
+      "type": "object",
+      "properties": {
+        "input": {
+          "description": "Describes the input to the partial group-by-key instruction.",
+          "$ref": "InstructionInput"
+        },
+        "inputElementCodec": {
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
+          },
+          "description": "The codec to use for interpreting an element in the input PTable."
+        },
+        "valueCombiningFn": {
+          "description": "The value combining function to invoke.",
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
+          }
+        },
+        "originalCombineValuesInputStoreName": {
+          "description": "If this instruction includes a combining function this is the name of the\nintermediate store between the GBK and the CombineValues.",
+          "type": "string"
+        },
+        "originalCombineValuesStepName": {
+          "description": "If this instruction includes a combining function, this is the name of the\nCombineValues instruction lifted into this instruction.",
+          "type": "string"
+        },
+        "sideInputs": {
+          "description": "Zero or more side inputs.",
+          "type": "array",
+          "items": {
+            "$ref": "SideInputInfo"
+          }
+        }
+      },
+      "id": "PartialGroupByKeyInstruction"
+    },
+    "InstructionInput": {
+      "description": "An input of an instruction, as a reference to an output of a\nproducer instruction.",
+      "type": "object",
+      "properties": {
+        "producerInstructionIndex": {
+          "description": "The index (origin zero) of the parallel instruction that produces\nthe output to be consumed by this input.  This index is relative\nto the list of instructions in this input's instruction's\ncontaining MapTask.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "outputNum": {
+          "description": "The output index (origin zero) within the producer.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "InstructionInput"
+    },
+    "StringList": {
+      "properties": {
+        "elements": {
+          "description": "Elements of the list.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "StringList",
+      "description": "A metric value representing a list of strings.",
+      "type": "object"
+    },
+    "GetDebugConfigRequest": {
+      "description": "Request to get updated debug configuration for component.",
+      "type": "object",
+      "properties": {
+        "componentId": {
+          "description": "The internal component id for which debug configuration is\nrequested.",
+          "type": "string"
+        },
+        "workerId": {
+          "description": "The worker id, i.e., VM hostname.",
+          "type": "string"
+        }
+      },
+      "id": "GetDebugConfigRequest"
+    },
+    "LeaseWorkItemRequest": {
+      "type": "object",
+      "properties": {
+        "currentWorkerTime": {
+          "description": "The current timestamp at the worker.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "workItemTypes": {
+          "description": "Filter for WorkItem type.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "location": {
+          "description": "The location which contains the WorkItem's job.",
+          "type": "string"
+        },
+        "workerCapabilities": {
+          "description": "Worker capabilities. WorkItems might be limited to workers with specific\ncapabilities.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "workerId": {
+          "description": "Identifies the worker leasing work -- typically the ID of the\nvirtual machine running the worker.",
+          "type": "string"
+        },
+        "requestedLeaseDuration": {
+          "description": "The initial lease period.",
+          "format": "google-duration",
+          "type": "string"
+        }
+      },
+      "id": "LeaseWorkItemRequest",
+      "description": "Request to lease WorkItems."
+    },
+    "ReportWorkItemStatusRequest": {
+      "type": "object",
+      "properties": {
+        "workerId": {
+          "description": "The ID of the worker reporting the WorkItem status.  If this\ndoes not match the ID of the worker which the Dataflow service\nbelieves currently has the lease on the WorkItem, the report\nwill be dropped (with an error response).",
+          "type": "string"
+        },
+        "currentWorkerTime": {
+          "description": "The current timestamp at the worker.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "location": {
+          "description": "The location which contains the WorkItem's job.",
+          "type": "string"
+        },
+        "workItemStatuses": {
+          "description": "The order is unimportant, except that the order of the\nWorkItemServiceState messages in the ReportWorkItemStatusResponse\ncorresponds to the order of WorkItemStatus messages here.",
+          "type": "array",
+          "items": {
+            "$ref": "WorkItemStatus"
+          }
+        }
+      },
+      "id": "ReportWorkItemStatusRequest",
+      "description": "Request to report the status of WorkItems."
+    },
+    "StreamingConfigTask": {
+      "description": "A task that carries configuration information for streaming computations.",
+      "type": "object",
+      "properties": {
+        "streamingComputationConfigs": {
+          "description": "Set of computation configuration information.",
+          "type": "array",
+          "items": {
+            "$ref": "StreamingComputationConfig"
+          }
+        },
+        "userStepToStateFamilyNameMap": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Map from user step names to state families.",
+          "type": "object"
+        }
+      },
+      "id": "StreamingConfigTask"
+    },
+    "Step": {
+      "description": "Defines a particular step within a Cloud Dataflow job.\n\nA job consists of multiple steps, each of which performs some\nspecific operation as part of the overall job.  Data is typically\npassed from one step to another as part of the job.\n\nHere's an example of a sequence of steps which together implement a\nMap-Reduce job:\n\n  * Read a collection of data from some source, parsing the\n    collection's elements.\n\n  * Validate the elements.\n\n  * Apply a user-defined function to map each element to some value\n    and extract an element-specific key value.\n\n  * Group elements with the same key into a single element with\n    that key, transforming a multiply-keyed collection into a\n    uniquely-keyed collection.\n\n  * Write the elements out to some data sink.\n\nNote that the Cloud Dataflow service may be used to run many different\ntypes of jobs, not just Map-Reduce.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The name that identifies the step. This must be unique for each\nstep with respect to all other steps in the Cloud Dataflow job.",
+          "type": "string"
+        },
+        "kind": {
+          "description": "The kind of step in the Cloud Dataflow job.",
+          "type": "string"
+        },
+        "properties": {
+          "additionalProperties": {
+            "description": "Properties of the object.",
+            "type": "any"
+          },
+          "description": "Named properties associated with the step. Each kind of\npredefined step has its own required set of properties.",
+          "type": "object"
+        }
+      },
+      "id": "Step"
+    },
+    "JobExecutionInfo": {
+      "properties": {
+        "stages": {
+          "description": "A mapping from each stage to the information about that stage.",
+          "type": "object",
+          "additionalProperties": {
+            "$ref": "JobExecutionStageInfo"
+          }
+        }
+      },
+      "id": "JobExecutionInfo",
+      "description": "Additional information about how a Cloud Dataflow job will be executed that\nisn't contained in the submitted job.",
+      "type": "object"
+    },
+    "FailedLocation": {
+      "id": "FailedLocation",
+      "description": "Indicates which location failed to respond to a request for data.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The name of the failed location.",
+          "type": "string"
+        }
+      }
+    },
+    "Disk": {
+      "description": "Describes the data disk used by a workflow job.",
+      "type": "object",
+      "properties": {
+        "sizeGb": {
+          "type": "integer",
+          "description": "Size of disk in GB.  If zero or unspecified, the service will\nattempt to choose a reasonable default.",
+          "format": "int32"
+        },
+        "diskType": {
+          "description": "Disk storage type, as defined by Google Compute Engine.  This\nmust be a disk type appropriate to the project and zone in which\nthe workers will run.  If unknown or unspecified, the service\nwill attempt to choose a reasonable default.\n\nFor example, the standard persistent disk type is a resource name\ntypically ending in \"pd-standard\".  If SSD persistent disks are\navailable, the resource name typically ends with \"pd-ssd\".  The\nactual valid values are defined the Google Compute Engine API,\nnot by the Cloud Dataflow API; consult the Google Compute Engine\ndocumentation for more information about determining the set of\navailable disk types for a particular project and zone.\n\nGoogle Compute Engine Disk types are local to a particular\nproject in a particular zone, and so the resource name will\ntypically look something like this:\n\ncompute.googleapis.com/projects/project-id/zones/zone/diskTypes/pd-standard",
+          "type": "string"
+        },
+        "mountPoint": {
+          "description": "Directory in a VM where disk is mounted.",
+          "type": "string"
+        }
+      },
+      "id": "Disk"
+    },
+    "CounterMetadata": {
+      "description": "CounterMetadata includes all static non-name non-value counter attributes.",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "description": "Counter aggregation kind.",
+          "type": "string",
+          "enumDescriptions": [
+            "Counter aggregation kind was not set.",
+            "Aggregated value is the sum of all contributed values.",
+            "Aggregated value is the max of all contributed values.",
+            "Aggregated value is the min of all contributed values.",
+            "Aggregated value is the mean of all contributed values.",
+            "Aggregated value represents the logical 'or' of all contributed values.",
+            "Aggregated value represents the logical 'and' of all contributed values.",
+            "Aggregated value is a set of unique contributed values.",
+            "Aggregated value captures statistics about a distribution."
+          ],
+          "enum": [
+            "INVALID",
+            "SUM",
+            "MAX",
+            "MIN",
+            "MEAN",
+            "OR",
+            "AND",
+            "SET",
+            "DISTRIBUTION"
+          ]
+        },
+        "description": {
+          "description": "Human-readable description of the counter semantics.",
+          "type": "string"
+        },
+        "standardUnits": {
+          "enumDescriptions": [
+            "Counter returns a value in bytes.",
+            "Counter returns a value in bytes per second.",
+            "Counter returns a value in milliseconds.",
+            "Counter returns a value in microseconds.",
+            "Counter returns a value in nanoseconds.",
+            "Counter returns a timestamp in milliseconds.",
+            "Counter returns a timestamp in microseconds.",
+            "Counter returns a timestamp in nanoseconds."
+          ],
+          "enum": [
+            "BYTES",
+            "BYTES_PER_SEC",
+            "MILLISECONDS",
+            "MICROSECONDS",
+            "NANOSECONDS",
+            "TIMESTAMP_MSEC",
+            "TIMESTAMP_USEC",
+            "TIMESTAMP_NSEC"
+          ],
+          "description": "System defined Units, see above enum.",
+          "type": "string"
+        },
+        "otherUnits": {
+          "description": "A string referring to the unit type.",
+          "type": "string"
+        }
+      },
+      "id": "CounterMetadata"
+    },
+    "ListJobMessagesResponse": {
+      "id": "ListJobMessagesResponse",
+      "description": "Response to a request to list job messages.",
+      "type": "object",
+      "properties": {
+        "jobMessages": {
+          "description": "Messages in ascending timestamp order.",
+          "type": "array",
+          "items": {
+            "$ref": "JobMessage"
+          }
+        },
+        "nextPageToken": {
+          "description": "The token to obtain the next page of results if there are more.",
+          "type": "string"
+        }
+      }
+    },
+    "ApproximateReportedProgress": {
+      "description": "A progress measurement of a WorkItem by a worker.",
+      "type": "object",
+      "properties": {
+        "fractionConsumed": {
+          "description": "Completion as fraction of the input consumed, from 0.0 (beginning, nothing\nconsumed), to 1.0 (end of the input, entire input consumed).",
+          "format": "double",
+          "type": "number"
+        },
+        "consumedParallelism": {
+          "$ref": "ReportedParallelism",
+          "description": "Total amount of parallelism in the portion of input of this task that has\nalready been consumed and is no longer active. In the first two examples\nabove (see remaining_parallelism), the value should be 29 or 2\nrespectively.  The sum of remaining_parallelism and consumed_parallelism\nshould equal the total amount of parallelism in this work item.  If\nspecified, must be finite."
+        },
+        "remainingParallelism": {
+          "$ref": "ReportedParallelism",
+          "description": "Total amount of parallelism in the input of this task that remains,\n(i.e. can be delegated to this task and any new tasks via dynamic\nsplitting). Always at least 1 for non-finished work items and 0 for\nfinished.\n\n\"Amount of parallelism\" refers to how many non-empty parts of the input\ncan be read in parallel. This does not necessarily equal number\nof records. An input that can be read in parallel down to the\nindividual records is called \"perfectly splittable\".\nAn example of non-perfectly parallelizable input is a block-compressed\nfile format where a block of records has to be read as a whole,\nbut different blocks can be read in parallel.\n\nExamples:\n* If we are processing record #30 (starting at 1) out of 50 in a perfectly\n  splittable 50-record input, this value should be 21 (20 remaining + 1\n  current).\n* If we are reading through block 3 in a block-compressed file consisting\n  of 5 blocks, this value should be 3 (since blocks 4 and 5 can be\n  processed in parallel by new tasks via dynamic splitting and the current\n  task remains processing block 3).\n* If we are reading through the last block in a block-compressed file,\n  or reading or processing the last record in a perfectly splittable\n  input, this value should be 1, because apart from the current task, no\n  additional remainder can be split off."
+        },
+        "position": {
+          "$ref": "Position",
+          "description": "A Position within the work to represent a progress."
+        }
+      },
+      "id": "ApproximateReportedProgress"
+    },
+    "StateFamilyConfig": {
+      "description": "State family configuration.",
+      "type": "object",
+      "properties": {
+        "stateFamily": {
+          "type": "string",
+          "description": "The state family value."
+        },
+        "isRead": {
+          "description": "If true, this family corresponds to a read operation.",
+          "type": "boolean"
+        }
+      },
+      "id": "StateFamilyConfig"
+    },
+    "IntegerList": {
+      "type": "object",
+      "properties": {
+        "elements": {
+          "description": "Elements of the list.",
+          "type": "array",
+          "items": {
+            "$ref": "SplitInt64"
+          }
+        }
+      },
+      "id": "IntegerList",
+      "description": "A metric value representing a list of integers."
+    },
+    "ResourceUtilizationReportResponse": {
+      "description": "Service-side response to WorkerMessage reporting resource utilization.",
+      "type": "object",
+      "properties": {},
+      "id": "ResourceUtilizationReportResponse"
+    },
+    "SourceSplitResponse": {
+      "description": "The response to a SourceSplitRequest.",
+      "type": "object",
+      "properties": {
+        "outcome": {
+          "enum": [
+            "SOURCE_SPLIT_OUTCOME_UNKNOWN",
+            "SOURCE_SPLIT_OUTCOME_USE_CURRENT",
+            "SOURCE_SPLIT_OUTCOME_SPLITTING_HAPPENED"
+          ],
+          "description": "Indicates whether splitting happened and produced a list of bundles.\nIf this is USE_CURRENT_SOURCE_AS_IS, the current source should\nbe processed \"as is\" without splitting. \"bundles\" is ignored in this case.\nIf this is SPLITTING_HAPPENED, then \"bundles\" contains a list of\nbundles into which the source was split.",
+          "type": "string",
+          "enumDescriptions": [
+            "The source split outcome is unknown, or unspecified.",
+            "The current source should be processed \"as is\" without splitting.",
+            "Splitting produced a list of bundles."
+          ]
+        },
+        "bundles": {
+          "type": "array",
+          "items": {
+            "$ref": "DerivedSource"
+          },
+          "description": "If outcome is SPLITTING_HAPPENED, then this is a list of bundles\ninto which the source was split. Otherwise this field is ignored.\nThis list can be empty, which means the source represents an empty input."
+        },
+        "shards": {
+          "description": "DEPRECATED in favor of bundles.",
+          "type": "array",
+          "items": {
+            "$ref": "SourceSplitShard"
+          }
+        }
+      },
+      "id": "SourceSplitResponse"
+    },
+    "ParallelInstruction": {
+      "description": "Describes a particular operation comprising a MapTask.",
+      "type": "object",
+      "properties": {
+        "outputs": {
+          "description": "Describes the outputs of the instruction.",
+          "type": "array",
+          "items": {
+            "$ref": "InstructionOutput"
+          }
+        },
+        "name": {
+          "description": "User-provided name of this operation.",
+          "type": "string"
+        },
+        "read": {
+          "description": "Additional information for Read instructions.",
+          "$ref": "ReadInstruction"
+        },
+        "parDo": {
+          "$ref": "ParDoInstruction",
+          "description": "Additional information for ParDo instructions."
+        },
+        "flatten": {
+          "$ref": "FlattenInstruction",
+          "description": "Additional information for Flatten instructions."
+        },
+        "originalName": {
+          "description": "System-defined name for the operation in the original workflow graph.",
+          "type": "string"
+        },
+        "systemName": {
+          "description": "System-defined name of this operation.\nUnique across the workflow.",
+          "type": "string"
+        },
+        "write": {
+          "description": "Additional information for Write instructions.",
+          "$ref": "WriteInstruction"
+        },
+        "partialGroupByKey": {
+          "description": "Additional information for PartialGroupByKey instructions.",
+          "$ref": "PartialGroupByKeyInstruction"
+        }
+      },
+      "id": "ParallelInstruction"
+    },
+    "Package": {
+      "description": "The packages that must be installed in order for a worker to run the\nsteps of the Cloud Dataflow job that will be assigned to its worker\npool.\n\nThis is the mechanism by which the Cloud Dataflow SDK causes code to\nbe loaded onto the workers. For example, the Cloud Dataflow Java SDK\nmight use this to install jars containing the user's code and all of the\nvarious dependencies (libraries, data files, etc.) required in order\nfor that code to run.",
+      "type": "object",
+      "properties": {
+        "location": {
+          "description": "The resource to read the package from. The supported resource type is:\n\nGoogle Cloud Storage:\n\n  storage.googleapis.com/{bucket}\n  bucket.storage.googleapis.com/",
+          "type": "string"
+        },
+        "name": {
+          "description": "The name of the package.",
+          "type": "string"
+        }
+      },
+      "id": "Package"
+    },
+    "KeyRangeDataDiskAssignment": {
+      "id": "KeyRangeDataDiskAssignment",
+      "description": "Data disk assignment information for a specific key-range of a sharded\ncomputation.\nCurrently we only support UTF-8 character splits to simplify encoding into\nJSON.",
+      "type": "object",
+      "properties": {
+        "end": {
+          "description": "The end (exclusive) of the key range.",
+          "type": "string"
+        },
+        "start": {
+          "description": "The start (inclusive) of the key range.",
+          "type": "string"
+        },
+        "dataDisk": {
+          "description": "The name of the data disk where data for this range is stored.\nThis name is local to the Google Cloud Platform project and uniquely\nidentifies the disk within that project, for example\n\"myproject-1014-104817-4c2-harness-0-disk-1\".",
+          "type": "string"
+        }
+      }
     }
-   }
-  }
- }
+  },
+  "protocol": "rest",
+  "icons": {
+    "x32": "http://www.google.com/images/icons/product/search-32.gif",
+    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+  },
+  "version": "v1b3",
+  "baseUrl": "https://dataflow.googleapis.com/"
 }
diff --git a/dataflow/v1b3/dataflow-gen.go b/dataflow/v1b3/dataflow-gen.go
index dae2bd9..6955107 100644
--- a/dataflow/v1b3/dataflow-gen.go
+++ b/dataflow/v1b3/dataflow-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Jobs = NewProjectsJobsService(s)
@@ -249,42 +254,63 @@
 // a worker.
 type ApproximateReportedProgress struct {
 	// ConsumedParallelism: Total amount of parallelism in the portion of
-	// input of this task that has already been consumed and is no longer
-	// active. In the first two examples above (see remaining_parallelism),
-	// the value should be 29 or 2 respectively. The sum of
-	// remaining_parallelism and consumed_parallelism should equal the total
-	// amount of parallelism in this work item. If specified, must be
-	// finite.
+	// input of this task that has
+	// already been consumed and is no longer active. In the first two
+	// examples
+	// above (see remaining_parallelism), the value should be 29 or
+	// 2
+	// respectively.  The sum of remaining_parallelism and
+	// consumed_parallelism
+	// should equal the total amount of parallelism in this work item.
+	// If
+	// specified, must be finite.
 	ConsumedParallelism *ReportedParallelism `json:"consumedParallelism,omitempty"`
 
 	// FractionConsumed: Completion as fraction of the input consumed, from
-	// 0.0 (beginning, nothing consumed), to 1.0 (end of the input, entire
-	// input consumed).
+	// 0.0 (beginning, nothing
+	// consumed), to 1.0 (end of the input, entire input consumed).
 	FractionConsumed float64 `json:"fractionConsumed,omitempty"`
 
 	// Position: A Position within the work to represent a progress.
 	Position *Position `json:"position,omitempty"`
 
 	// RemainingParallelism: Total amount of parallelism in the input of
-	// this task that remains, (i.e. can be delegated to this task and any
-	// new tasks via dynamic splitting). Always at least 1 for non-finished
-	// work items and 0 for finished. "Amount of parallelism" refers to how
-	// many non-empty parts of the input can be read in parallel. This does
-	// not necessarily equal number of records. An input that can be read in
-	// parallel down to the individual records is called "perfectly
-	// splittable". An example of non-perfectly parallelizable input is a
-	// block-compressed file format where a block of records has to be read
-	// as a whole, but different blocks can be read in parallel. Examples: *
-	// If we are processing record #30 (starting at 1) out of 50 in a
-	// perfectly splittable 50-record input, this value should be 21 (20
-	// remaining + 1 current). * If we are reading through block 3 in a
-	// block-compressed file consisting of 5 blocks, this value should be 3
-	// (since blocks 4 and 5 can be processed in parallel by new tasks via
-	// dynamic splitting and the current task remains processing block 3). *
-	// If we are reading through the last block in a block-compressed file,
-	// or reading or processing the last record in a perfectly splittable
-	// input, this value should be 1, because apart from the current task,
-	// no additional remainder can be split off.
+	// this task that remains,
+	// (i.e. can be delegated to this task and any new tasks via
+	// dynamic
+	// splitting). Always at least 1 for non-finished work items and 0
+	// for
+	// finished.
+	//
+	// "Amount of parallelism" refers to how many non-empty parts of the
+	// input
+	// can be read in parallel. This does not necessarily equal number
+	// of records. An input that can be read in parallel down to
+	// the
+	// individual records is called "perfectly splittable".
+	// An example of non-perfectly parallelizable input is a
+	// block-compressed
+	// file format where a block of records has to be read as a whole,
+	// but different blocks can be read in parallel.
+	//
+	// Examples:
+	// * If we are processing record #30 (starting at 1) out of 50 in a
+	// perfectly
+	//   splittable 50-record input, this value should be 21 (20 remaining +
+	// 1
+	//   current).
+	// * If we are reading through block 3 in a block-compressed file
+	// consisting
+	//   of 5 blocks, this value should be 3 (since blocks 4 and 5 can be
+	//   processed in parallel by new tasks via dynamic splitting and the
+	// current
+	//   task remains processing block 3).
+	// * If we are reading through the last block in a block-compressed
+	// file,
+	//   or reading or processing the last record in a perfectly splittable
+	//   input, this value should be 1, because apart from the current task,
+	// no
+	//   additional remainder can be split off.
 	RemainingParallelism *ReportedParallelism `json:"remainingParallelism,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ConsumedParallelism")
@@ -329,7 +355,8 @@
 // dynamically split the WorkItem.
 type ApproximateSplitRequest struct {
 	// FractionConsumed: A fraction at which to split the work item, from
-	// 0.0 (beginning of the input) to 1.0 (end of the input).
+	// 0.0 (beginning of the
+	// input) to 1.0 (end of the input).
 	FractionConsumed float64 `json:"fractionConsumed,omitempty"`
 
 	// Position: A Position at which to split the work item.
@@ -378,9 +405,11 @@
 	// Algorithm: The algorithm to use for autoscaling.
 	//
 	// Possible values:
-	//   "AUTOSCALING_ALGORITHM_UNKNOWN"
-	//   "AUTOSCALING_ALGORITHM_NONE"
-	//   "AUTOSCALING_ALGORITHM_BASIC"
+	//   "AUTOSCALING_ALGORITHM_UNKNOWN" - The algorithm is unknown, or
+	// unspecified.
+	//   "AUTOSCALING_ALGORITHM_NONE" - Disable autoscaling.
+	//   "AUTOSCALING_ALGORITHM_BASIC" - Increase worker count over time to
+	// reduce job execution time.
 	Algorithm string `json:"algorithm,omitempty"`
 
 	// MaxNumWorkers: The maximum number of workers to cap scaling at.
@@ -409,6 +438,58 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// CPUTime: Modeled after information exposed by /proc/stat.
+type CPUTime struct {
+	// Rate: Average CPU utilization rate (% non-idle cpu / second) since
+	// previous
+	// sample.
+	Rate float64 `json:"rate,omitempty"`
+
+	// Timestamp: Timestamp of the measurement.
+	Timestamp string `json:"timestamp,omitempty"`
+
+	// TotalMs: Total active CPU time across all cores (ie., non-idle) in
+	// milliseconds
+	// since start-up.
+	TotalMs uint64 `json:"totalMs,omitempty,string"`
+
+	// ForceSendFields is a list of field names (e.g. "Rate") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Rate") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *CPUTime) MarshalJSON() ([]byte, error) {
+	type noMethod CPUTime
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+func (s *CPUTime) UnmarshalJSON(data []byte) error {
+	type noMethod CPUTime
+	var s1 struct {
+		Rate gensupport.JSONFloat64 `json:"rate"`
+		*noMethod
+	}
+	s1.noMethod = (*noMethod)(s)
+	if err := json.Unmarshal(data, &s1); err != nil {
+		return err
+	}
+	s.Rate = float64(s1.Rate)
+	return nil
+}
+
 // ComputationTopology: All configuration data for a particular
 // Computation.
 type ComputationTopology struct {
@@ -457,8 +538,10 @@
 }
 
 // ConcatPosition: A position that encapsulates an inner position and an
-// index for the inner position. A ConcatPosition can be used by a
-// reader of a source that encapsulates a set of other sources.
+// index for the inner
+// position. A ConcatPosition can be used by a reader of a source
+// that
+// encapsulates a set of other sources.
 type ConcatPosition struct {
 	// Index: Index of the inner source.
 	Index int64 `json:"index,omitempty"`
@@ -498,15 +581,18 @@
 	// Kind: Counter aggregation kind.
 	//
 	// Possible values:
-	//   "INVALID"
-	//   "SUM"
-	//   "MAX"
-	//   "MIN"
-	//   "MEAN"
-	//   "OR"
-	//   "AND"
-	//   "SET"
-	//   "DISTRIBUTION"
+	//   "INVALID" - Counter aggregation kind was not set.
+	//   "SUM" - Aggregated value is the sum of all contributed values.
+	//   "MAX" - Aggregated value is the max of all contributed values.
+	//   "MIN" - Aggregated value is the min of all contributed values.
+	//   "MEAN" - Aggregated value is the mean of all contributed values.
+	//   "OR" - Aggregated value represents the logical 'or' of all
+	// contributed values.
+	//   "AND" - Aggregated value represents the logical 'and' of all
+	// contributed values.
+	//   "SET" - Aggregated value is a set of unique contributed values.
+	//   "DISTRIBUTION" - Aggregated value captures statistics about a
+	// distribution.
 	Kind string `json:"kind,omitempty"`
 
 	// OtherUnits: A string referring to the unit type.
@@ -515,14 +601,14 @@
 	// StandardUnits: System defined Units, see above enum.
 	//
 	// Possible values:
-	//   "BYTES"
-	//   "BYTES_PER_SEC"
-	//   "MILLISECONDS"
-	//   "MICROSECONDS"
-	//   "NANOSECONDS"
-	//   "TIMESTAMP_MSEC"
-	//   "TIMESTAMP_USEC"
-	//   "TIMESTAMP_NSEC"
+	//   "BYTES" - Counter returns a value in bytes.
+	//   "BYTES_PER_SEC" - Counter returns a value in bytes per second.
+	//   "MILLISECONDS" - Counter returns a value in milliseconds.
+	//   "MICROSECONDS" - Counter returns a value in microseconds.
+	//   "NANOSECONDS" - Counter returns a value in nanoseconds.
+	//   "TIMESTAMP_MSEC" - Counter returns a timestamp in milliseconds.
+	//   "TIMESTAMP_USEC" - Counter returns a timestamp in microseconds.
+	//   "TIMESTAMP_NSEC" - Counter returns a timestamp in nanoseconds.
 	StandardUnits string `json:"standardUnits,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Description") to
@@ -549,8 +635,8 @@
 }
 
 // CounterStructuredName: Identifies a counter within a per-job
-// namespace. Counters whose structured names are the same get merged
-// into a single value for the job.
+// namespace. Counters whose structured
+// names are the same get merged into a single value for the job.
 type CounterStructuredName struct {
 	// ComponentStepName: Name of the optimized step being executed by the
 	// workers.
@@ -561,31 +647,35 @@
 	ExecutionStepName string `json:"executionStepName,omitempty"`
 
 	// Name: Counter name. Not necessarily globally-unique, but unique
-	// within the context of the other fields. Required.
+	// within the
+	// context of the other fields.
+	// Required.
 	Name string `json:"name,omitempty"`
 
-	// OriginalStepName: System generated name of the original step in the
-	// user's graph, before optimization.
-	OriginalStepName string `json:"originalStepName,omitempty"`
+	// Origin: One of the standard Origins defined above.
+	//
+	// Possible values:
+	//   "SYSTEM" - Counter was created by the Dataflow system.
+	//   "USER" - Counter was created by the user.
+	Origin string `json:"origin,omitempty"`
 
-	// OtherOrigin: A string containing the origin of the counter.
-	OtherOrigin string `json:"otherOrigin,omitempty"`
+	// OriginNamespace: A string containing a more specific namespace of the
+	// counter's origin.
+	OriginNamespace string `json:"originNamespace,omitempty"`
+
+	// OriginalStepName: System generated name of the original step in the
+	// user's graph, before
+	// optimization.
+	OriginalStepName string `json:"originalStepName,omitempty"`
 
 	// Portion: Portion of this counter, either key or value.
 	//
 	// Possible values:
-	//   "ALL"
-	//   "KEY"
-	//   "VALUE"
+	//   "ALL" - Counter portion has not been set.
+	//   "KEY" - Counter reports a key.
+	//   "VALUE" - Counter reports a value.
 	Portion string `json:"portion,omitempty"`
 
-	// StandardOrigin: One of the standard Origins defined above.
-	//
-	// Possible values:
-	//   "DATAFLOW"
-	//   "USER"
-	StandardOrigin string `json:"standardOrigin,omitempty"`
-
 	// WorkerId: ID of a particular worker.
 	WorkerId string `json:"workerId,omitempty"`
 
@@ -614,7 +704,8 @@
 }
 
 // CounterStructuredNameAndMetadata: A single message which encapsulates
-// structured name and metadata for a given counter.
+// structured name and metadata for a given
+// counter.
 type CounterStructuredNameAndMetadata struct {
 	// Metadata: Metadata associated with a counter
 	Metadata *CounterMetadata `json:"metadata,omitempty"`
@@ -651,9 +742,11 @@
 	Boolean bool `json:"boolean,omitempty"`
 
 	// Cumulative: True if this counter is reported as the total cumulative
-	// aggregate value accumulated since the worker started working on this
-	// WorkItem. By default this is false, indicating that this counter is
-	// reported as a delta.
+	// aggregate
+	// value accumulated since the worker started working on this
+	// WorkItem.
+	// By default this is false, indicating that this counter is reported
+	// as a delta.
 	Cumulative bool `json:"cumulative,omitempty"`
 
 	// Distribution: Distribution data
@@ -684,8 +777,9 @@
 	// NameAndKind: Counter name and aggregation type.
 	NameAndKind *NameAndKind `json:"nameAndKind,omitempty"`
 
-	// ShortId: The service-generated short identifier for this counter. The
-	// short_id -> (name, metadata) mapping is constant for the lifetime of
+	// ShortId: The service-generated short identifier for this counter.
+	// The short_id -> (name, metadata) mapping is constant for the lifetime
+	// of
 	// a job.
 	ShortId int64 `json:"shortId,omitempty,string"`
 
@@ -738,9 +832,10 @@
 	// Environment: The runtime environment for the job.
 	Environment *RuntimeEnvironment `json:"environment,omitempty"`
 
-	// GcsPath: Required. A Cloud Storage path to the template from which to
-	// create the job. Must be a valid Cloud Storage URL, beginning with
-	// `gs://`.
+	// GcsPath: Required. A Cloud Storage path to the template from which
+	// to
+	// create the job.
+	// Must be a valid Cloud Storage URL, beginning with `gs://`.
 	GcsPath string `json:"gcsPath,omitempty"`
 
 	// JobName: Required. The job name to use for the created job.
@@ -803,13 +898,16 @@
 // DataDiskAssignment: Data disk assignment for a given VM instance.
 type DataDiskAssignment struct {
 	// DataDisks: Mounted data disks. The order is important a data disk's
-	// 0-based index in this list defines which persistent directory the
-	// disk is mounted to, for example the list of {
-	// "myproject-1014-104817-4c2-harness-0-disk-0" }, {
-	// "myproject-1014-104817-4c2-harness-0-disk-1" }.
+	// 0-based index in
+	// this list defines which persistent directory the disk is mounted to,
+	// for
+	// example the list of { "myproject-1014-104817-4c2-harness-0-disk-0"
+	// },
+	// { "myproject-1014-104817-4c2-harness-0-disk-1" }.
 	DataDisks []string `json:"dataDisks,omitempty"`
 
-	// VmInstance: VM instance name the data disks mounted to, for example
+	// VmInstance: VM instance name the data disks mounted to, for
+	// example
 	// "myproject-1014-104817-4c2-harness-0".
 	VmInstance string `json:"vmInstance,omitempty"`
 
@@ -837,18 +935,23 @@
 }
 
 // DerivedSource: Specification of one of the bundles produced as a
-// result of splitting a Source (e.g. when executing a
-// SourceSplitRequest, or when splitting an active task using
-// WorkItemStatus.dynamic_source_split), relative to the source being
-// split.
+// result of splitting
+// a Source (e.g. when executing a SourceSplitRequest, or when
+// splitting an active task using
+// WorkItemStatus.dynamic_source_split),
+// relative to the source being split.
 type DerivedSource struct {
 	// DerivationMode: What source to base the produced source on (if any).
 	//
 	// Possible values:
-	//   "SOURCE_DERIVATION_MODE_UNKNOWN"
-	//   "SOURCE_DERIVATION_MODE_INDEPENDENT"
-	//   "SOURCE_DERIVATION_MODE_CHILD_OF_CURRENT"
-	//   "SOURCE_DERIVATION_MODE_SIBLING_OF_CURRENT"
+	//   "SOURCE_DERIVATION_MODE_UNKNOWN" - The source derivation is
+	// unknown, or unspecified.
+	//   "SOURCE_DERIVATION_MODE_INDEPENDENT" - Produce a completely
+	// independent Source with no base.
+	//   "SOURCE_DERIVATION_MODE_CHILD_OF_CURRENT" - Produce a Source based
+	// on the Source being split.
+	//   "SOURCE_DERIVATION_MODE_SIBLING_OF_CURRENT" - Produce a Source
+	// based on the base of the Source being split.
 	DerivationMode string `json:"derivationMode,omitempty"`
 
 	// Source: Specification of the source.
@@ -881,26 +984,38 @@
 // Disk: Describes the data disk used by a workflow job.
 type Disk struct {
 	// DiskType: Disk storage type, as defined by Google Compute Engine.
-	// This must be a disk type appropriate to the project and zone in which
-	// the workers will run. If unknown or unspecified, the service will
-	// attempt to choose a reasonable default. For example, the standard
-	// persistent disk type is a resource name typically ending in
-	// "pd-standard". If SSD persistent disks are available, the resource
-	// name typically ends with "pd-ssd". The actual valid values are
-	// defined the Google Compute Engine API, not by the Cloud Dataflow API;
-	// consult the Google Compute Engine documentation for more information
-	// about determining the set of available disk types for a particular
-	// project and zone. Google Compute Engine Disk types are local to a
-	// particular project in a particular zone, and so the resource name
-	// will typically look something like this:
-	// compute.googleapis.com/projects/project-id/zones/zone/diskTypes/pd-sta
-	// ndard
+	// This
+	// must be a disk type appropriate to the project and zone in which
+	// the workers will run.  If unknown or unspecified, the service
+	// will attempt to choose a reasonable default.
+	//
+	// For example, the standard persistent disk type is a resource
+	// name
+	// typically ending in "pd-standard".  If SSD persistent disks
+	// are
+	// available, the resource name typically ends with "pd-ssd".
+	// The
+	// actual valid values are defined the Google Compute Engine API,
+	// not by the Cloud Dataflow API; consult the Google Compute
+	// Engine
+	// documentation for more information about determining the set
+	// of
+	// available disk types for a particular project and zone.
+	//
+	// Google Compute Engine Disk types are local to a particular
+	// project in a particular zone, and so the resource name will
+	// typically look something like
+	// this:
+	//
+	// compute.googleapis.com/projects/project-id/zones/zone/diskTypes
+	// /pd-standard
 	DiskType string `json:"diskType,omitempty"`
 
 	// MountPoint: Directory in a VM where disk is mounted.
 	MountPoint string `json:"mountPoint,omitempty"`
 
-	// SizeGb: Size of disk in GB. If zero or unspecified, the service will
+	// SizeGb: Size of disk in GB.  If zero or unspecified, the service
+	// will
 	// attempt to choose a reasonable default.
 	SizeGb int64 `json:"sizeGb,omitempty"`
 
@@ -940,8 +1055,8 @@
 	Min *SplitInt64 `json:"min,omitempty"`
 
 	// Sum: Use an int64 since we'd prefer the added precision. If overflow
-	// is a common problem we can detect it and use an additional int64 or a
-	// double.
+	// is a common
+	// problem we can detect it and use an additional int64 or a double.
 	Sum *SplitInt64 `json:"sum,omitempty"`
 
 	// SumOfSquares: Use a double since the sum of squares is likely to
@@ -986,16 +1101,19 @@
 }
 
 // DynamicSourceSplit: When a task splits using
-// WorkItemStatus.dynamic_source_split, this message describes the two
-// parts of the split relative to the description of the current task's
-// input.
+// WorkItemStatus.dynamic_source_split, this
+// message describes the two parts of the split relative to
+// the
+// description of the current task's input.
 type DynamicSourceSplit struct {
-	// Primary: Primary part (continued to be processed by worker).
-	// Specified relative to the previously-current source. Becomes current.
+	// Primary: Primary part (continued to be processed by
+	// worker).
+	// Specified relative to the previously-current source.
+	// Becomes current.
 	Primary *DerivedSource `json:"primary,omitempty"`
 
-	// Residual: Residual part (returned to the pool of work). Specified
-	// relative to the previously-current source.
+	// Residual: Residual part (returned to the pool of work).
+	// Specified relative to the previously-current source.
 	Residual *DerivedSource `json:"residual,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Primary") to
@@ -1023,15 +1141,21 @@
 
 // Environment: Describes the environment in which a Dataflow Job runs.
 type Environment struct {
-	// ClusterManagerApiService: The type of cluster manager API to use. If
-	// unknown or unspecified, the service will attempt to choose a
-	// reasonable default. This should be in the form of the API service
-	// name, e.g. "compute.googleapis.com".
+	// ClusterManagerApiService: The type of cluster manager API to use.  If
+	// unknown or
+	// unspecified, the service will attempt to choose a reasonable
+	// default.  This should be in the form of the API service name,
+	// e.g. "compute.googleapis.com".
 	ClusterManagerApiService string `json:"clusterManagerApiService,omitempty"`
 
-	// Dataset: The dataset for the current project where various workflow
-	// related tables are stored. The supported resource type is: Google
-	// BigQuery: bigquery.googleapis.com/{dataset}
+	// Dataset: The dataset for the current project where various
+	// workflow
+	// related tables are stored.
+	//
+	// The supported resource type is:
+	//
+	// Google BigQuery:
+	//   bigquery.googleapis.com/{dataset}
 	Dataset string `json:"dataset,omitempty"`
 
 	// Experiments: The list of experiments to enable.
@@ -1041,9 +1165,12 @@
 	InternalExperiments googleapi.RawMessage `json:"internalExperiments,omitempty"`
 
 	// SdkPipelineOptions: The Cloud Dataflow SDK pipeline options specified
-	// by the user. These options are passed through the service and are
-	// used to recreate the SDK pipeline options on the worker in a language
-	// agnostic and platform independent way.
+	// by the user. These
+	// options are passed through the service and are used to recreate
+	// the
+	// SDK pipeline options on the worker in a language agnostic and
+	// platform
+	// independent way.
 	SdkPipelineOptions googleapi.RawMessage `json:"sdkPipelineOptions,omitempty"`
 
 	// ServiceAccountEmail: Identity to run virtual machines as. Defaults to
@@ -1051,25 +1178,32 @@
 	ServiceAccountEmail string `json:"serviceAccountEmail,omitempty"`
 
 	// TempStoragePrefix: The prefix of the resources the system should use
-	// for temporary storage. The system will append the suffix
-	// "/temp-{JOBNAME} to this resource prefix, where {JOBNAME} is the
-	// value of the job_name field. The resulting bucket and object prefix
-	// is used as the prefix of the resources used to store temporary data
-	// needed during the job execution. NOTE: This will override the value
-	// in taskrunner_settings. The supported resource type is: Google Cloud
-	// Storage: storage.googleapis.com/{bucket}/{object}
-	// bucket.storage.googleapis.com/{object}
+	// for temporary
+	// storage.  The system will append the suffix "/temp-{JOBNAME} to
+	// this resource prefix, where {JOBNAME} is the value of the
+	// job_name field.  The resulting bucket and object prefix is used
+	// as the prefix of the resources used to store temporary data
+	// needed during the job execution.  NOTE: This will override the
+	// value in taskrunner_settings.
+	// The supported resource type is:
+	//
+	// Google Cloud Storage:
+	//
+	//   storage.googleapis.com/{bucket}/{object}
+	//   bucket.storage.googleapis.com/{object}
 	TempStoragePrefix string `json:"tempStoragePrefix,omitempty"`
 
 	// UserAgent: A description of the process that generated the request.
 	UserAgent googleapi.RawMessage `json:"userAgent,omitempty"`
 
 	// Version: A structure describing which components and their versions
-	// of the service are required in order to run the job.
+	// of the service
+	// are required in order to run the job.
 	Version googleapi.RawMessage `json:"version,omitempty"`
 
 	// WorkerPools: The worker pools. At least one "harness" worker pool
-	// must be specified in order for the job to have workers.
+	// must be
+	// specified in order for the job to have workers.
 	WorkerPools []*WorkerPool `json:"workerPools,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g.
@@ -1234,7 +1368,8 @@
 // component.
 type GetDebugConfigRequest struct {
 	// ComponentId: The internal component id for which debug configuration
-	// is requested.
+	// is
+	// requested.
 	ComponentId string `json:"componentId,omitempty"`
 
 	// WorkerId: The worker id, i.e., VM hostname.
@@ -1297,15 +1432,17 @@
 }
 
 // InstructionInput: An input of an instruction, as a reference to an
-// output of a producer instruction.
+// output of a
+// producer instruction.
 type InstructionInput struct {
 	// OutputNum: The output index (origin zero) within the producer.
 	OutputNum int64 `json:"outputNum,omitempty"`
 
 	// ProducerInstructionIndex: The index (origin zero) of the parallel
-	// instruction that produces the output to be consumed by this input.
-	// This index is relative to the list of instructions in this input's
-	// instruction's containing MapTask.
+	// instruction that produces
+	// the output to be consumed by this input.  This index is relative
+	// to the list of instructions in this input's instruction's
+	// containing MapTask.
 	ProducerInstructionIndex int64 `json:"producerInstructionIndex,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "OutputNum") to
@@ -1340,20 +1477,23 @@
 	Name string `json:"name,omitempty"`
 
 	// OnlyCountKeyBytes: For system-generated byte and mean byte metrics,
-	// certain instructions should only report the key size.
+	// certain instructions
+	// should only report the key size.
 	OnlyCountKeyBytes bool `json:"onlyCountKeyBytes,omitempty"`
 
 	// OnlyCountValueBytes: For system-generated byte and mean byte metrics,
-	// certain instructions should only report the value size.
+	// certain instructions
+	// should only report the value size.
 	OnlyCountValueBytes bool `json:"onlyCountValueBytes,omitempty"`
 
 	// OriginalName: System-defined name for this output in the original
-	// workflow graph. Outputs that do not contribute to an original
-	// instruction do not set this.
+	// workflow graph.
+	// Outputs that do not contribute to an original instruction do not set
+	// this.
 	OriginalName string `json:"originalName,omitempty"`
 
-	// SystemName: System-defined name of this output. Unique across the
-	// workflow.
+	// SystemName: System-defined name of this output.
+	// Unique across the workflow.
 	SystemName string `json:"systemName,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Codec") to
@@ -1441,36 +1581,92 @@
 // Job: Defines a job to be run by the Cloud Dataflow service.
 type Job struct {
 	// ClientRequestId: The client's unique identifier of the job, re-used
-	// across retried attempts. If this field is set, the service will
-	// ensure its uniqueness. The request to create a job will fail if the
-	// service has knowledge of a previously submitted job with the same
-	// client's ID and job name. The caller may use this field to ensure
-	// idempotence of job creation across retried attempts to create a job.
+	// across retried attempts.
+	// If this field is set, the service will ensure its uniqueness.
+	// The request to create a job will fail if the service has knowledge of
+	// a
+	// previously submitted job with the same client's ID and job name.
+	// The caller may use this field to ensure idempotence of job
+	// creation across retried attempts to create a job.
 	// By default, the field is empty and, in that case, the service ignores
 	// it.
 	ClientRequestId string `json:"clientRequestId,omitempty"`
 
 	// CreateTime: The timestamp when the job was initially created.
-	// Immutable and set by the Cloud Dataflow service.
+	// Immutable and set by the
+	// Cloud Dataflow service.
 	CreateTime string `json:"createTime,omitempty"`
 
-	// CurrentState: The current state of the job. Jobs are created in the
-	// `JOB_STATE_STOPPED` state unless otherwise specified. A job in the
-	// `JOB_STATE_RUNNING` state may asynchronously enter a terminal state.
-	// After a job has reached a terminal state, no further state updates
-	// may be made. This field may be mutated by the Cloud Dataflow service;
+	// CurrentState: The current state of the job.
+	//
+	// Jobs are created in the `JOB_STATE_STOPPED` state unless
+	// otherwise
+	// specified.
+	//
+	// A job in the `JOB_STATE_RUNNING` state may asynchronously enter
+	// a
+	// terminal state. After a job has reached a terminal state, no
+	// further state updates may be made.
+	//
+	// This field may be mutated by the Cloud Dataflow service;
 	// callers cannot mutate it.
 	//
 	// Possible values:
-	//   "JOB_STATE_UNKNOWN"
-	//   "JOB_STATE_STOPPED"
-	//   "JOB_STATE_RUNNING"
-	//   "JOB_STATE_DONE"
-	//   "JOB_STATE_FAILED"
-	//   "JOB_STATE_CANCELLED"
-	//   "JOB_STATE_UPDATED"
-	//   "JOB_STATE_DRAINING"
-	//   "JOB_STATE_DRAINED"
+	//   "JOB_STATE_UNKNOWN" - The job's run state isn't specified.
+	//   "JOB_STATE_STOPPED" - `JOB_STATE_STOPPED` indicates that the job
+	// has not
+	// yet started to run.
+	//   "JOB_STATE_RUNNING" - `JOB_STATE_RUNNING` indicates that the job is
+	// currently running.
+	//   "JOB_STATE_DONE" - `JOB_STATE_DONE` indicates that the job has
+	// successfully completed.
+	// This is a terminal job state.  This state may be set by the Cloud
+	// Dataflow
+	// service, as a transition from `JOB_STATE_RUNNING`. It may also be set
+	// via a
+	// Cloud Dataflow `UpdateJob` call, if the job has not yet reached a
+	// terminal
+	// state.
+	//   "JOB_STATE_FAILED" - `JOB_STATE_FAILED` indicates that the job has
+	// failed.  This is a
+	// terminal job state.  This state may only be set by the Cloud
+	// Dataflow
+	// service, and only as a transition from `JOB_STATE_RUNNING`.
+	//   "JOB_STATE_CANCELLED" - `JOB_STATE_CANCELLED` indicates that the
+	// job has been explicitly
+	// cancelled. This is a terminal job state. This state may only be
+	// set via a Cloud Dataflow `UpdateJob` call, and only if the job has
+	// not
+	// yet reached another terminal state.
+	//   "JOB_STATE_UPDATED" - `JOB_STATE_UPDATED` indicates that the job
+	// was successfully updated,
+	// meaning that this job was stopped and another job was started,
+	// inheriting
+	// state from this one. This is a terminal job state. This state may
+	// only be
+	// set by the Cloud Dataflow service, and only as a transition
+	// from
+	// `JOB_STATE_RUNNING`.
+	//   "JOB_STATE_DRAINING" - `JOB_STATE_DRAINING` indicates that the job
+	// is in the process of draining.
+	// A draining job has stopped pulling from its input sources and is
+	// processing
+	// any data that remains in-flight. This state may be set via a Cloud
+	// Dataflow
+	// `UpdateJob` call, but only as a transition from `JOB_STATE_RUNNING`.
+	// Jobs
+	// that are draining may only transition to
+	// `JOB_STATE_DRAINED`,
+	// `JOB_STATE_CANCELLED`, or `JOB_STATE_FAILED`.
+	//   "JOB_STATE_DRAINED" - `JOB_STATE_DRAINED` indicates that the job
+	// has been drained.
+	// A drained job terminated by stopping pulling from its input sources
+	// and
+	// processing any data that remained in-flight when draining was
+	// requested.
+	// This state is a terminal state, may only be set by the Cloud
+	// Dataflow
+	// service, and only as a transition from `JOB_STATE_DRAINING`.
 	CurrentState string `json:"currentState,omitempty"`
 
 	// CurrentStateTime: The timestamp associated with the current state.
@@ -1483,27 +1679,39 @@
 	// run the job.
 	ExecutionInfo *JobExecutionInfo `json:"executionInfo,omitempty"`
 
-	// Id: The unique ID of this job. This field is set by the Cloud
-	// Dataflow service when the Job is created, and is immutable for the
-	// life of the job.
+	// Id: The unique ID of this job.
+	//
+	// This field is set by the Cloud Dataflow service when the Job
+	// is
+	// created, and is immutable for the life of the job.
 	Id string `json:"id,omitempty"`
 
-	// Labels: User-defined labels for this job. The labels map can contain
-	// no more than 64 entries. Entries of the labels map are UTF8 strings
-	// that comply with the following restrictions: * Keys must conform to
-	// regexp: \p{Ll}\p{Lo}{0,62} * Values must conform to regexp:
-	// [\p{Ll}\p{Lo}\p{N}_-]{0,63} * Both keys and values are additionally
-	// constrained to be <= 128 bytes in size.
+	// Labels: User-defined labels for this job.
+	//
+	// The labels map can contain no more than 64 entries.  Entries of the
+	// labels
+	// map are UTF8 strings that comply with the following restrictions:
+	//
+	// * Keys must conform to regexp:  \p{Ll}\p{Lo}{0,62}
+	// * Values must conform to regexp:  [\p{Ll}\p{Lo}\p{N}_-]{0,63}
+	// * Both keys and values are additionally constrained to be <= 128
+	// bytes in
+	// size.
 	Labels map[string]string `json:"labels,omitempty"`
 
 	// Location: The location that contains this job.
 	Location string `json:"location,omitempty"`
 
-	// Name: The user-specified Cloud Dataflow job name. Only one Job with a
-	// given name may exist in a project at any given time. If a caller
-	// attempts to create a Job with the same name as an already-existing
-	// Job, the attempt returns the existing Job. The name must match the
-	// regular expression `[a-z]([-a-z0-9]{0,38}[a-z0-9])?`
+	// Name: The user-specified Cloud Dataflow job name.
+	//
+	// Only one Job with a given name may exist in a project at any
+	// given time. If a caller attempts to create a Job with the same
+	// name as an already-existing Job, the attempt returns the
+	// existing Job.
+	//
+	// The name must match the regular
+	// expression
+	// `[a-z]([-a-z0-9]{0,38}[a-z0-9])?`
 	Name string `json:"name,omitempty"`
 
 	// ProjectId: The ID of the Cloud Platform project that the job belongs
@@ -1511,57 +1719,125 @@
 	ProjectId string `json:"projectId,omitempty"`
 
 	// ReplaceJobId: If this job is an update of an existing job, this field
-	// is the job ID of the job it replaced. When sending a
-	// `CreateJobRequest`, you can update a job by specifying it here. The
-	// job named here is stopped, and its intermediate state is transferred
-	// to this job.
+	// is the job ID
+	// of the job it replaced.
+	//
+	// When sending a `CreateJobRequest`, you can update a job by specifying
+	// it
+	// here. The job named here is stopped, and its intermediate state
+	// is
+	// transferred to this job.
 	ReplaceJobId string `json:"replaceJobId,omitempty"`
 
 	// ReplacedByJobId: If another job is an update of this job (and thus,
-	// this job is in `JOB_STATE_UPDATED`), this field contains the ID of
-	// that job.
+	// this job is in
+	// `JOB_STATE_UPDATED`), this field contains the ID of that job.
 	ReplacedByJobId string `json:"replacedByJobId,omitempty"`
 
-	// RequestedState: The job's requested state. `UpdateJob` may be used to
-	// switch between the `JOB_STATE_STOPPED` and `JOB_STATE_RUNNING`
-	// states, by setting requested_state. `UpdateJob` may also be used to
-	// directly set a job's requested state to `JOB_STATE_CANCELLED` or
-	// `JOB_STATE_DONE`, irrevocably terminating the job if it has not
-	// already reached a terminal state.
+	// RequestedState: The job's requested state.
+	//
+	// `UpdateJob` may be used to switch between the `JOB_STATE_STOPPED`
+	// and
+	// `JOB_STATE_RUNNING` states, by setting requested_state.  `UpdateJob`
+	// may
+	// also be used to directly set a job's requested state
+	// to
+	// `JOB_STATE_CANCELLED` or `JOB_STATE_DONE`, irrevocably terminating
+	// the
+	// job if it has not already reached a terminal state.
 	//
 	// Possible values:
-	//   "JOB_STATE_UNKNOWN"
-	//   "JOB_STATE_STOPPED"
-	//   "JOB_STATE_RUNNING"
-	//   "JOB_STATE_DONE"
-	//   "JOB_STATE_FAILED"
-	//   "JOB_STATE_CANCELLED"
-	//   "JOB_STATE_UPDATED"
-	//   "JOB_STATE_DRAINING"
-	//   "JOB_STATE_DRAINED"
+	//   "JOB_STATE_UNKNOWN" - The job's run state isn't specified.
+	//   "JOB_STATE_STOPPED" - `JOB_STATE_STOPPED` indicates that the job
+	// has not
+	// yet started to run.
+	//   "JOB_STATE_RUNNING" - `JOB_STATE_RUNNING` indicates that the job is
+	// currently running.
+	//   "JOB_STATE_DONE" - `JOB_STATE_DONE` indicates that the job has
+	// successfully completed.
+	// This is a terminal job state.  This state may be set by the Cloud
+	// Dataflow
+	// service, as a transition from `JOB_STATE_RUNNING`. It may also be set
+	// via a
+	// Cloud Dataflow `UpdateJob` call, if the job has not yet reached a
+	// terminal
+	// state.
+	//   "JOB_STATE_FAILED" - `JOB_STATE_FAILED` indicates that the job has
+	// failed.  This is a
+	// terminal job state.  This state may only be set by the Cloud
+	// Dataflow
+	// service, and only as a transition from `JOB_STATE_RUNNING`.
+	//   "JOB_STATE_CANCELLED" - `JOB_STATE_CANCELLED` indicates that the
+	// job has been explicitly
+	// cancelled. This is a terminal job state. This state may only be
+	// set via a Cloud Dataflow `UpdateJob` call, and only if the job has
+	// not
+	// yet reached another terminal state.
+	//   "JOB_STATE_UPDATED" - `JOB_STATE_UPDATED` indicates that the job
+	// was successfully updated,
+	// meaning that this job was stopped and another job was started,
+	// inheriting
+	// state from this one. This is a terminal job state. This state may
+	// only be
+	// set by the Cloud Dataflow service, and only as a transition
+	// from
+	// `JOB_STATE_RUNNING`.
+	//   "JOB_STATE_DRAINING" - `JOB_STATE_DRAINING` indicates that the job
+	// is in the process of draining.
+	// A draining job has stopped pulling from its input sources and is
+	// processing
+	// any data that remains in-flight. This state may be set via a Cloud
+	// Dataflow
+	// `UpdateJob` call, but only as a transition from `JOB_STATE_RUNNING`.
+	// Jobs
+	// that are draining may only transition to
+	// `JOB_STATE_DRAINED`,
+	// `JOB_STATE_CANCELLED`, or `JOB_STATE_FAILED`.
+	//   "JOB_STATE_DRAINED" - `JOB_STATE_DRAINED` indicates that the job
+	// has been drained.
+	// A drained job terminated by stopping pulling from its input sources
+	// and
+	// processing any data that remained in-flight when draining was
+	// requested.
+	// This state is a terminal state, may only be set by the Cloud
+	// Dataflow
+	// service, and only as a transition from `JOB_STATE_DRAINING`.
 	RequestedState string `json:"requestedState,omitempty"`
 
 	// Steps: The top-level steps that constitute the entire job.
 	Steps []*Step `json:"steps,omitempty"`
 
-	// TempFiles: A set of files the system should be aware of that are used
-	// for temporary storage. These temporary files will be removed on job
-	// completion. No duplicates are allowed. No file patterns are
-	// supported. The supported files are: Google Cloud Storage:
-	// storage.googleapis.com/{bucket}/{object}
-	// bucket.storage.googleapis.com/{object}
+	// TempFiles: A set of files the system should be aware of that are
+	// used
+	// for temporary storage. These temporary files will be
+	// removed on job completion.
+	// No duplicates are allowed.
+	// No file patterns are supported.
+	//
+	// The supported files are:
+	//
+	// Google Cloud Storage:
+	//
+	//    storage.googleapis.com/{bucket}/{object}
+	//    bucket.storage.googleapis.com/{object}
 	TempFiles []string `json:"tempFiles,omitempty"`
 
 	// TransformNameMapping: The map of transform name prefixes of the job
-	// to be replaced to the corresponding name prefixes of the new job.
+	// to be replaced to the
+	// corresponding name prefixes of the new job.
 	TransformNameMapping map[string]string `json:"transformNameMapping,omitempty"`
 
 	// Type: The type of Cloud Dataflow job.
 	//
 	// Possible values:
-	//   "JOB_TYPE_UNKNOWN"
-	//   "JOB_TYPE_BATCH"
-	//   "JOB_TYPE_STREAMING"
+	//   "JOB_TYPE_UNKNOWN" - The type of the job is unspecified, or
+	// unknown.
+	//   "JOB_TYPE_BATCH" - A batch job with a well-defined end point: data
+	// is read, data is
+	// processed, data is written, and the job is done.
+	//   "JOB_TYPE_STREAMING" - A continuously streaming job with no end:
+	// data is read,
+	// processed, and written continuously.
 	Type string `json:"type,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -1593,7 +1869,8 @@
 }
 
 // JobExecutionInfo: Additional information about how a Cloud Dataflow
-// job will be executed that isn't contained in the submitted job.
+// job will be executed that
+// isn't contained in the submitted job.
 type JobExecutionInfo struct {
 	// Stages: A mapping from each stage to the information about that
 	// stage.
@@ -1622,12 +1899,13 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// JobExecutionStageInfo: Contains information about how a particular
+// JobExecutionStageInfo: Contains information about how a
+// particular
 // google.dataflow.v1beta3.Step will be executed.
 type JobExecutionStageInfo struct {
-	// StepName: The steps associated with the execution stage. Note that
-	// stages may have several steps, and that a given step might be run by
-	// more than one stage.
+	// StepName: The steps associated with the execution stage.
+	// Note that stages may have several steps, and that a given step
+	// might be run by more than one stage.
 	StepName []string `json:"stepName,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "StepName") to
@@ -1655,19 +1933,48 @@
 
 // JobMessage: A particular message pertaining to a Dataflow job.
 type JobMessage struct {
-	// Id: Identifies the message. This is automatically generated by the
+	// Id: Identifies the message.  This is automatically generated by
+	// the
 	// service; the caller should treat it as an opaque string.
 	Id string `json:"id,omitempty"`
 
 	// MessageImportance: Importance level of the message.
 	//
 	// Possible values:
-	//   "JOB_MESSAGE_IMPORTANCE_UNKNOWN"
-	//   "JOB_MESSAGE_DEBUG"
-	//   "JOB_MESSAGE_DETAILED"
-	//   "JOB_MESSAGE_BASIC"
-	//   "JOB_MESSAGE_WARNING"
-	//   "JOB_MESSAGE_ERROR"
+	//   "JOB_MESSAGE_IMPORTANCE_UNKNOWN" - The message importance isn't
+	// specified, or is unknown.
+	//   "JOB_MESSAGE_DEBUG" - The message is at the 'debug' level:
+	// typically only useful for
+	// software engineers working on the code the job is running.
+	// Typically, Dataflow pipeline runners do not display log messages
+	// at this level by default.
+	//   "JOB_MESSAGE_DETAILED" - The message is at the 'detailed' level:
+	// somewhat verbose, but
+	// potentially useful to users.  Typically, Dataflow pipeline
+	// runners do not display log messages at this level by default.
+	// These messages are displayed by default in the Dataflow
+	// monitoring UI.
+	//   "JOB_MESSAGE_BASIC" - The message is at the 'basic' level: useful
+	// for keeping
+	// track of the execution of a Dataflow pipeline.  Typically,
+	// Dataflow pipeline runners display log messages at this level
+	// by
+	// default, and these messages are displayed by default in the
+	// Dataflow monitoring UI.
+	//   "JOB_MESSAGE_WARNING" - The message is at the 'warning' level:
+	// indicating a condition
+	// pertaining to a job which may require human intervention.
+	// Typically, Dataflow pipeline runners display log messages at
+	// this
+	// level by default, and these messages are displayed by default in
+	// the Dataflow monitoring UI.
+	//   "JOB_MESSAGE_ERROR" - The message is at the 'error' level:
+	// indicating a condition
+	// preventing a job from succeeding.  Typically, Dataflow
+	// pipeline
+	// runners display log messages at this level by default, and
+	// these
+	// messages are displayed by default in the Dataflow monitoring UI.
 	MessageImportance string `json:"messageImportance,omitempty"`
 
 	// MessageText: The text of the message.
@@ -1700,11 +2007,16 @@
 }
 
 // JobMetrics: JobMetrics contains a collection of metrics descibing the
-// detailed progress of a Dataflow job. Metrics correspond to
-// user-defined and system-defined metrics in the job. This resource
-// captures only the most recent values of each metric; time-series data
-// can be queried for them (under the same metric names) from Cloud
-// Monitoring.
+// detailed progress
+// of a Dataflow job. Metrics correspond to user-defined and
+// system-defined
+// metrics in the job.
+//
+// This resource captures only the most recent values of each
+// metric;
+// time-series data can be queried for them (under the same metric
+// names)
+// from Cloud Monitoring.
 type JobMetrics struct {
 	// MetricTime: Timestamp as of which metric values are current.
 	MetricTime string `json:"metricTime,omitempty"`
@@ -1740,12 +2052,18 @@
 }
 
 // KeyRangeDataDiskAssignment: Data disk assignment information for a
-// specific key-range of a sharded computation. Currently we only
-// support UTF-8 character splits to simplify encoding into JSON.
+// specific key-range of a sharded
+// computation.
+// Currently we only support UTF-8 character splits to simplify encoding
+// into
+// JSON.
 type KeyRangeDataDiskAssignment struct {
 	// DataDisk: The name of the data disk where data for this range is
-	// stored. This name is local to the Google Cloud Platform project and
-	// uniquely identifies the disk within that project, for example
+	// stored.
+	// This name is local to the Google Cloud Platform project and
+	// uniquely
+	// identifies the disk within that project, for
+	// example
 	// "myproject-1014-104817-4c2-harness-0-disk-1".
 	DataDisk string `json:"dataDisk,omitempty"`
 
@@ -1779,24 +2097,31 @@
 }
 
 // KeyRangeLocation: Location information for a specific key-range of a
-// sharded computation. Currently we only support UTF-8 character splits
-// to simplify encoding into JSON.
+// sharded computation.
+// Currently we only support UTF-8 character splits to simplify encoding
+// into
+// JSON.
 type KeyRangeLocation struct {
 	// DataDisk: The name of the data disk where data for this range is
-	// stored. This name is local to the Google Cloud Platform project and
-	// uniquely identifies the disk within that project, for example
+	// stored.
+	// This name is local to the Google Cloud Platform project and
+	// uniquely
+	// identifies the disk within that project, for
+	// example
 	// "myproject-1014-104817-4c2-harness-0-disk-1".
 	DataDisk string `json:"dataDisk,omitempty"`
 
 	// DeliveryEndpoint: The physical location of this range assignment to
-	// be used for streaming computation cross-worker message delivery.
+	// be used for
+	// streaming computation cross-worker message delivery.
 	DeliveryEndpoint string `json:"deliveryEndpoint,omitempty"`
 
 	// End: The end (exclusive) of the key range.
 	End string `json:"end,omitempty"`
 
 	// PersistentDirectory: The location of the persistent state for this
-	// range, as a persistent directory in the worker local filesystem.
+	// range, as a
+	// persistent directory in the worker local filesystem.
 	PersistentDirectory string `json:"persistentDirectory,omitempty"`
 
 	// Start: The start (inclusive) of the key range.
@@ -1840,11 +2165,13 @@
 	WorkItemTypes []string `json:"workItemTypes,omitempty"`
 
 	// WorkerCapabilities: Worker capabilities. WorkItems might be limited
-	// to workers with specific capabilities.
+	// to workers with specific
+	// capabilities.
 	WorkerCapabilities []string `json:"workerCapabilities,omitempty"`
 
 	// WorkerId: Identifies the worker leasing work -- typically the ID of
-	// the virtual machine running the worker.
+	// the
+	// virtual machine running the worker.
 	WorkerId string `json:"workerId,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "CurrentWorkerTime")
@@ -1940,8 +2267,8 @@
 }
 
 // ListJobsResponse: Response to a request to list Cloud Dataflow jobs.
-// This may be a partial response, depending on the page size in the
-// ListJobsRequest.
+// This may be a partial
+// response, depending on the page size in the ListJobsRequest.
 type ListJobsResponse struct {
 	// FailedLocation: Zero or more messages describing locations that
 	// failed to respond.
@@ -1983,20 +2310,25 @@
 }
 
 // MapTask: MapTask consists of an ordered set of instructions, each of
-// which describes one particular low-level operation for the worker to
-// perform in order to accomplish the MapTask's WorkItem. Each
-// instruction must appear in the list before any instructions which
+// which
+// describes one particular low-level operation for the worker
+// to
+// perform in order to accomplish the MapTask's WorkItem.
+//
+// Each instruction must appear in the list before any instructions
+// which
 // depends on its output.
 type MapTask struct {
 	// Instructions: The instructions in the MapTask.
 	Instructions []*ParallelInstruction `json:"instructions,omitempty"`
 
-	// StageName: System-defined name of the stage containing this MapTask.
+	// StageName: System-defined name of the stage containing this
+	// MapTask.
 	// Unique across the workflow.
 	StageName string `json:"stageName,omitempty"`
 
-	// SystemName: System-defined name of this MapTask. Unique across the
-	// workflow.
+	// SystemName: System-defined name of this MapTask.
+	// Unique across the workflow.
 	SystemName string `json:"systemName,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Instructions") to
@@ -2023,10 +2355,11 @@
 }
 
 // MetricShortId: The metric short id is returned to the user alongside
-// an offset into ReportWorkItemStatusRequest
+// an offset into
+// ReportWorkItemStatusRequest
 type MetricShortId struct {
-	// MetricIndex: The index of the corresponding metric in the
-	// ReportWorkItemStatusRequest. Required.
+	// MetricIndex: The index of the corresponding metric in
+	// the ReportWorkItemStatusRequest. Required.
 	MetricIndex int64 `json:"metricIndex,omitempty"`
 
 	// ShortId: The service-generated short identifier for the metric.
@@ -2056,22 +2389,28 @@
 }
 
 // MetricStructuredName: Identifies a metric, by describing the source
-// which generated the metric.
+// which generated the
+// metric.
 type MetricStructuredName struct {
 	// Context: Zero or more labeled fields which identify the part of the
-	// job this metric is associated with, such as the name of a step or
-	// collection. For example, built-in counters associated with steps will
-	// have context['step'] = . Counters associated with PCollections in the
-	// SDK will have context['pcollection'] =
-	// .
+	// job this
+	// metric is associated with, such as the name of a step or
+	// collection.
+	//
+	// For example, built-in counters associated with steps will
+	// have
+	// context['step'] = <step-name>. Counters associated with
+	// PCollections
+	// in the SDK will have context['pcollection'] = <pcollection-name>.
 	Context map[string]string `json:"context,omitempty"`
 
 	// Name: Worker-defined metric name.
 	Name string `json:"name,omitempty"`
 
 	// Origin: Origin (namespace) of metric name. May be blank for
-	// user-define metrics; will be "dataflow" for metrics defined by the
-	// Dataflow service or SDK.
+	// user-define metrics;
+	// will be "dataflow" for metrics defined by the Dataflow service or
+	// SDK.
 	Origin string `json:"origin,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Context") to
@@ -2100,50 +2439,66 @@
 // MetricUpdate: Describes the state of a metric.
 type MetricUpdate struct {
 	// Cumulative: True if this metric is reported as the total cumulative
-	// aggregate value accumulated since the worker started working on this
-	// WorkItem. By default this is false, indicating that this metric is
-	// reported as a delta that is not associated with any WorkItem.
+	// aggregate
+	// value accumulated since the worker started working on this
+	// WorkItem.
+	// By default this is false, indicating that this metric is reported
+	// as a delta that is not associated with any WorkItem.
 	Cumulative bool `json:"cumulative,omitempty"`
 
 	// Internal: Worker-computed aggregate value for internal use by the
-	// Dataflow service.
+	// Dataflow
+	// service.
 	Internal interface{} `json:"internal,omitempty"`
 
-	// Kind: Metric aggregation kind. The possible metric aggregation kinds
-	// are "Sum", "Max", "Min", "Mean", "Set", "And", and "Or". The
-	// specified aggregation kind is case-insensitive. If omitted, this is
-	// not an aggregated value but instead a single metric sample value.
+	// Kind: Metric aggregation kind.  The possible metric aggregation kinds
+	// are
+	// "Sum", "Max", "Min", "Mean", "Set", "And", and "Or".
+	// The specified aggregation kind is case-insensitive.
+	//
+	// If omitted, this is not an aggregated value but instead
+	// a single metric sample value.
 	Kind string `json:"kind,omitempty"`
 
 	// MeanCount: Worker-computed aggregate value for the "Mean" aggregation
-	// kind. This holds the count of the aggregated values and is used in
-	// combination with mean_sum above to obtain the actual mean aggregate
-	// value. The only possible value type is Long.
+	// kind.
+	// This holds the count of the aggregated values and is used in
+	// combination
+	// with mean_sum above to obtain the actual mean aggregate value.
+	// The only possible value type is Long.
 	MeanCount interface{} `json:"meanCount,omitempty"`
 
 	// MeanSum: Worker-computed aggregate value for the "Mean" aggregation
-	// kind. This holds the sum of the aggregated values and is used in
-	// combination with mean_count below to obtain the actual mean aggregate
-	// value. The only possible value types are Long and Double.
+	// kind.
+	// This holds the sum of the aggregated values and is used in
+	// combination
+	// with mean_count below to obtain the actual mean aggregate value.
+	// The only possible value types are Long and Double.
 	MeanSum interface{} `json:"meanSum,omitempty"`
 
 	// Name: Name of the metric.
 	Name *MetricStructuredName `json:"name,omitempty"`
 
 	// Scalar: Worker-computed aggregate value for aggregation kinds "Sum",
-	// "Max", "Min", "And", and "Or". The possible value types are Long,
-	// Double, and Boolean.
+	// "Max", "Min",
+	// "And", and "Or".  The possible value types are Long, Double, and
+	// Boolean.
 	Scalar interface{} `json:"scalar,omitempty"`
 
 	// Set: Worker-computed aggregate value for the "Set" aggregation kind.
-	// The only possible value type is a list of Values whose type can be
-	// Long, Double, or String, according to the metric's type. All Values
-	// in the list must be of the same type.
+	// The only
+	// possible value type is a list of Values whose type can be Long,
+	// Double,
+	// or String, according to the metric's type.  All Values in the list
+	// must
+	// be of the same type.
 	Set interface{} `json:"set,omitempty"`
 
 	// UpdateTime: Timestamp associated with the metric value. Optional when
-	// workers are reporting work progress; it will be filled in responses
-	// from the metrics API.
+	// workers are
+	// reporting work progress; it will be filled in responses from
+	// the
+	// metrics API.
 	UpdateTime string `json:"updateTime,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Cumulative") to
@@ -2171,9 +2526,12 @@
 
 // MountedDataDisk: Describes mounted data disk.
 type MountedDataDisk struct {
-	// DataDisk: The name of the data disk. This name is local to the Google
-	// Cloud Platform project and uniquely identifies the disk within that
-	// project, for example "myproject-1014-104817-4c2-harness-0-disk-1".
+	// DataDisk: The name of the data disk.
+	// This name is local to the Google Cloud Platform project and
+	// uniquely
+	// identifies the disk within that project, for
+	// example
+	// "myproject-1014-104817-4c2-harness-0-disk-1".
 	DataDisk string `json:"dataDisk,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "DataDisk") to
@@ -2202,7 +2560,8 @@
 // MultiOutputInfo: Information about an output of a multi-output DoFn.
 type MultiOutputInfo struct {
 	// Tag: The id of the tag the user code will emit to this output by;
-	// this should correspond to the tag of some SideInputInfo.
+	// this
+	// should correspond to the tag of some SideInputInfo.
 	Tag string `json:"tag,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Tag") to
@@ -2233,15 +2592,18 @@
 	// Kind: Counter aggregation kind.
 	//
 	// Possible values:
-	//   "INVALID"
-	//   "SUM"
-	//   "MAX"
-	//   "MIN"
-	//   "MEAN"
-	//   "OR"
-	//   "AND"
-	//   "SET"
-	//   "DISTRIBUTION"
+	//   "INVALID" - Counter aggregation kind was not set.
+	//   "SUM" - Aggregated value is the sum of all contributed values.
+	//   "MAX" - Aggregated value is the max of all contributed values.
+	//   "MIN" - Aggregated value is the min of all contributed values.
+	//   "MEAN" - Aggregated value is the mean of all contributed values.
+	//   "OR" - Aggregated value represents the logical 'or' of all
+	// contributed values.
+	//   "AND" - Aggregated value represents the logical 'and' of all
+	// contributed values.
+	//   "SET" - Aggregated value is a set of unique contributed values.
+	//   "DISTRIBUTION" - Aggregated value captures statistics about a
+	// distribution.
 	Kind string `json:"kind,omitempty"`
 
 	// Name: Name of the counter.
@@ -2271,16 +2633,28 @@
 }
 
 // Package: The packages that must be installed in order for a worker to
-// run the steps of the Cloud Dataflow job that will be assigned to its
-// worker pool. This is the mechanism by which the Cloud Dataflow SDK
-// causes code to be loaded onto the workers. For example, the Cloud
-// Dataflow Java SDK might use this to install jars containing the
-// user's code and all of the various dependencies (libraries, data
-// files, etc.) required in order for that code to run.
+// run the
+// steps of the Cloud Dataflow job that will be assigned to its
+// worker
+// pool.
+//
+// This is the mechanism by which the Cloud Dataflow SDK causes code
+// to
+// be loaded onto the workers. For example, the Cloud Dataflow Java
+// SDK
+// might use this to install jars containing the user's code and all of
+// the
+// various dependencies (libraries, data files, etc.) required in
+// order
+// for that code to run.
 type Package struct {
 	// Location: The resource to read the package from. The supported
-	// resource type is: Google Cloud Storage:
-	// storage.googleapis.com/{bucket} bucket.storage.googleapis.com/
+	// resource type is:
+	//
+	// Google Cloud Storage:
+	//
+	//   storage.googleapis.com/{bucket}
+	//   bucket.storage.googleapis.com/
 	Location string `json:"location,omitempty"`
 
 	// Name: The name of the package.
@@ -2309,15 +2683,16 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// ParDoInstruction: An instruction that does a ParDo operation. Takes
-// one main input and zero or more side inputs, and produces zero or
-// more outputs. Runs user code.
+// ParDoInstruction: An instruction that does a ParDo operation.
+// Takes one main input and zero or more side inputs, and produces
+// zero or more outputs.
+// Runs user code.
 type ParDoInstruction struct {
 	// Input: The input.
 	Input *InstructionInput `json:"input,omitempty"`
 
 	// MultiOutputInfos: Information about each of the outputs, if user_fn
-	// is a MultiDoFn.
+	// is a  MultiDoFn.
 	MultiOutputInfos []*MultiOutputInfo `json:"multiOutputInfos,omitempty"`
 
 	// NumOutputs: The number of outputs.
@@ -2378,8 +2753,8 @@
 	// Read: Additional information for Read instructions.
 	Read *ReadInstruction `json:"read,omitempty"`
 
-	// SystemName: System-defined name of this operation. Unique across the
-	// workflow.
+	// SystemName: System-defined name of this operation.
+	// Unique across the workflow.
 	SystemName string `json:"systemName,omitempty"`
 
 	// Write: Additional information for Write instructions.
@@ -2409,7 +2784,8 @@
 }
 
 // PartialGroupByKeyInstruction: An instruction that does a partial
-// group-by-key. One input and one output.
+// group-by-key.
+// One input and one output.
 type PartialGroupByKeyInstruction struct {
 	// Input: Describes the input to the partial group-by-key instruction.
 	Input *InstructionInput `json:"input,omitempty"`
@@ -2419,13 +2795,13 @@
 	InputElementCodec googleapi.RawMessage `json:"inputElementCodec,omitempty"`
 
 	// OriginalCombineValuesInputStoreName: If this instruction includes a
-	// combining function this is the name of the intermediate store between
-	// the GBK and the CombineValues.
+	// combining function this is the name of the
+	// intermediate store between the GBK and the CombineValues.
 	OriginalCombineValuesInputStoreName string `json:"originalCombineValuesInputStoreName,omitempty"`
 
 	// OriginalCombineValuesStepName: If this instruction includes a
-	// combining function, this is the name of the CombineValues instruction
-	// lifted into this instruction.
+	// combining function, this is the name of the
+	// CombineValues instruction lifted into this instruction.
 	OriginalCombineValuesStepName string `json:"originalCombineValuesStepName,omitempty"`
 
 	// SideInputs: Zero or more side inputs.
@@ -2458,7 +2834,9 @@
 }
 
 // Position: Position defines a position within a collection of data.
-// The value can be either the end position, a key (used with ordered
+// The value
+// can be either the end position, a key (used with
+// ordered
 // collections), a byte offset, or a record index.
 type Position struct {
 	// ByteOffset: Position is a byte offset.
@@ -2467,7 +2845,8 @@
 	// ConcatPosition: CloudPosition is a concat position.
 	ConcatPosition *ConcatPosition `json:"concatPosition,omitempty"`
 
-	// End: Position is past all other positions. Also useful for the end
+	// End: Position is past all other positions. Also useful for the
+	// end
 	// position of an unbounded range.
 	End bool `json:"end,omitempty"`
 
@@ -2478,7 +2857,8 @@
 	RecordIndex int64 `json:"recordIndex,omitempty,string"`
 
 	// ShufflePosition: CloudPosition is a base64 encoded
-	// BatchShufflePosition (with FIXED sharding).
+	// BatchShufflePosition (with FIXED
+	// sharding).
 	ShufflePosition string `json:"shufflePosition,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ByteOffset") to
@@ -2505,35 +2885,37 @@
 }
 
 // PubsubLocation: Identifies a pubsub location to use for transferring
-// data into or out of a streaming Dataflow job.
+// data into or
+// out of a streaming Dataflow job.
 type PubsubLocation struct {
 	// DropLateData: Indicates whether the pipeline allows late-arriving
 	// data.
 	DropLateData bool `json:"dropLateData,omitempty"`
 
 	// IdLabel: If set, contains a pubsub label from which to extract record
-	// ids. If left empty, record deduplication will be strictly best
-	// effort.
+	// ids.
+	// If left empty, record deduplication will be strictly best effort.
 	IdLabel string `json:"idLabel,omitempty"`
 
-	// Subscription: A pubsub subscription, in the form of
-	// "pubsub.googleapis.com/subscriptions/
-	// /"
+	// Subscription: A pubsub subscription, in the form
+	// of
+	// "pubsub.googleapis.com/subscriptions/<project-id>/<subscription-nam
+	// e>"
 	Subscription string `json:"subscription,omitempty"`
 
 	// TimestampLabel: If set, contains a pubsub label from which to extract
-	// record timestamps. If left empty, record timestamps will be generated
-	// upon arrival.
+	// record timestamps.
+	// If left empty, record timestamps will be generated upon arrival.
 	TimestampLabel string `json:"timestampLabel,omitempty"`
 
-	// Topic: A pubsub topic, in the form of
-	// "pubsub.googleapis.com/topics/
-	// /"
+	// Topic: A pubsub topic, in the form
+	// of
+	// "pubsub.googleapis.com/topics/<project-id>/<topic-name>"
 	Topic string `json:"topic,omitempty"`
 
 	// TrackingSubscription: If set, specifies the pubsub subscription that
-	// will be used for tracking custom time timestamps for watermark
-	// estimation.
+	// will be used for tracking
+	// custom time timestamps for watermark estimation.
 	TrackingSubscription string `json:"trackingSubscription,omitempty"`
 
 	// WithAttributes: If true, then the client has requested to get pubsub
@@ -2563,8 +2945,8 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// ReadInstruction: An instruction that reads records. Takes no inputs,
-// produces one output.
+// ReadInstruction: An instruction that reads records.
+// Takes no inputs, produces one output.
 type ReadInstruction struct {
 	// Source: The source to read from.
 	Source *Source `json:"source,omitempty"`
@@ -2602,14 +2984,18 @@
 	Location string `json:"location,omitempty"`
 
 	// WorkItemStatuses: The order is unimportant, except that the order of
-	// the WorkItemServiceState messages in the ReportWorkItemStatusResponse
+	// the
+	// WorkItemServiceState messages in the
+	// ReportWorkItemStatusResponse
 	// corresponds to the order of WorkItemStatus messages here.
 	WorkItemStatuses []*WorkItemStatus `json:"workItemStatuses,omitempty"`
 
-	// WorkerId: The ID of the worker reporting the WorkItem status. If this
-	// does not match the ID of the worker which the Dataflow service
-	// believes currently has the lease on the WorkItem, the report will be
-	// dropped (with an error response).
+	// WorkerId: The ID of the worker reporting the WorkItem status.  If
+	// this
+	// does not match the ID of the worker which the Dataflow
+	// service
+	// believes currently has the lease on the WorkItem, the report
+	// will be dropped (with an error response).
 	WorkerId string `json:"workerId,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "CurrentWorkerTime")
@@ -2640,9 +3026,12 @@
 // status of WorkItems.
 type ReportWorkItemStatusResponse struct {
 	// WorkItemServiceStates: A set of messages indicating the service-side
-	// state for each WorkItem whose status was reported, in the same order
-	// as the WorkItemStatus messages in the ReportWorkItemStatusRequest
-	// which resulting in this response.
+	// state for each
+	// WorkItem whose status was reported, in the same order as
+	// the
+	// WorkItemStatus messages in the ReportWorkItemStatusRequest
+	// which
+	// resulting in this response.
 	WorkItemServiceStates []*WorkItemServiceState `json:"workItemServiceStates,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -2675,13 +3064,19 @@
 }
 
 // ReportedParallelism: Represents the level of parallelism in a
-// WorkItem's input, reported by the worker.
+// WorkItem's input,
+// reported by the worker.
 type ReportedParallelism struct {
 	// IsInfinite: Specifies whether the parallelism is infinite. If true,
-	// "value" is ignored. Infinite parallelism means the service will
-	// assume that the work item can always be split into more non-empty
-	// work items by dynamic splitting. This is a work-around for lack of
-	// support for infinity by the current JSON-based Java RPC stack.
+	// "value" is
+	// ignored.
+	// Infinite parallelism means the service will assume that the work
+	// item
+	// can always be split into more non-empty work items by dynamic
+	// splitting.
+	// This is a work-around for lack of support for infinity by the
+	// current
+	// JSON-based Java RPC stack.
 	IsInfinite bool `json:"isInfinite,omitempty"`
 
 	// Value: Specifies the level of parallelism in case it is finite.
@@ -2725,17 +3120,15 @@
 }
 
 // ResourceUtilizationReport: Worker metrics exported from workers. This
-// contains resource utilization metrics accumulated from a variety of
-// sources. For more information, see go/df-resource-signals. Note that
-// this proto closely follows the structure of its DFE siblings in its
-// contents.
+// contains resource utilization
+// metrics accumulated from a variety of sources. For more information,
+// see
+// go/df-resource-signals.
 type ResourceUtilizationReport struct {
-	// Metrics: Each Struct must parallel DFE worker metrics protos (eg.,
-	// cpu_time metric will have nested values “timestamp_ms, total_ms,
-	// rate”).
-	Metrics []googleapi.RawMessage `json:"metrics,omitempty"`
+	// CpuTime: CPU utilization samples.
+	CpuTime []*CPUTime `json:"cpuTime,omitempty"`
 
-	// ForceSendFields is a list of field names (e.g. "Metrics") to
+	// ForceSendFields is a list of field names (e.g. "CpuTime") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
 	// non-interface field appearing in ForceSendFields will be sent to the
@@ -2743,7 +3136,7 @@
 	// used to include empty fields in Patch requests.
 	ForceSendFields []string `json:"-"`
 
-	// NullFields is a list of field names (e.g. "Metrics") to include in
+	// NullFields is a list of field names (e.g. "CpuTime") to include in
 	// API requests with the JSON null value. By default, fields with empty
 	// values are omitted from API requests. However, any field with an
 	// empty value appearing in NullFields will be sent to the server as
@@ -2766,24 +3159,27 @@
 // RuntimeEnvironment: The environment values to set at runtime.
 type RuntimeEnvironment struct {
 	// BypassTempDirValidation: Whether to bypass the safety checks for the
-	// job's temporary directory. Use with caution.
+	// job's temporary directory.
+	// Use with caution.
 	BypassTempDirValidation bool `json:"bypassTempDirValidation,omitempty"`
 
 	// MaxWorkers: The maximum number of Google Compute Engine instances to
-	// be made available to your pipeline during execution, from 1 to 1000.
+	// be made
+	// available to your pipeline during execution, from 1 to 1000.
 	MaxWorkers int64 `json:"maxWorkers,omitempty"`
 
 	// ServiceAccountEmail: The email address of the service account to run
 	// the job as.
 	ServiceAccountEmail string `json:"serviceAccountEmail,omitempty"`
 
-	// TempLocation: The Cloud Storage path to use for temporary files. Must
-	// be a valid Cloud Storage URL, beginning with `gs://`.
+	// TempLocation: The Cloud Storage path to use for temporary files.
+	// Must be a valid Cloud Storage URL, beginning with `gs://`.
 	TempLocation string `json:"tempLocation,omitempty"`
 
 	// Zone: The Compute Engine [availability
 	// zone](https://cloud.google.com/compute/docs/regions-zones/regions-zone
-	// s) for launching worker instances to run your pipeline.
+	// s)
+	// for launching worker instances to run your pipeline.
 	Zone string `json:"zone,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g.
@@ -2846,7 +3242,8 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// SendDebugCaptureResponse: Response to a send capture request. nothing
+// SendDebugCaptureResponse: Response to a send capture request.
+// nothing
 type SendDebugCaptureResponse struct {
 	// ServerResponse contains the HTTP response code and headers from the
 	// server.
@@ -2929,11 +3326,12 @@
 	OutputInfos []*SeqMapTaskOutputInfo `json:"outputInfos,omitempty"`
 
 	// StageName: System-defined name of the stage containing the SeqDo
-	// operation. Unique across the workflow.
+	// operation.
+	// Unique across the workflow.
 	StageName string `json:"stageName,omitempty"`
 
-	// SystemName: System-defined name of the SeqDo operation. Unique across
-	// the workflow.
+	// SystemName: System-defined name of the SeqDo operation.
+	// Unique across the workflow.
 	SystemName string `json:"systemName,omitempty"`
 
 	// UserFn: The user function to invoke.
@@ -3033,12 +3431,15 @@
 	Kind googleapi.RawMessage `json:"kind,omitempty"`
 
 	// Sources: The source(s) to read element(s) from to get the value of
-	// this side input. If more than one source, then the elements are taken
-	// from the sources, in the specified order if order matters. At least
-	// one source is required.
+	// this side input.
+	// If more than one source, then the elements are taken from
+	// the
+	// sources, in the specified order if order matters.
+	// At least one source is required.
 	Sources []*Source `json:"sources,omitempty"`
 
-	// Tag: The id of the tag the user code will access this side input by;
+	// Tag: The id of the tag the user code will access this side input
+	// by;
 	// this should correspond to the tag of some MultiOutputInfo.
 	Tag string `json:"tag,omitempty"`
 
@@ -3098,39 +3499,55 @@
 
 // Source: A source that records can be read and decoded from.
 type Source struct {
-	// BaseSpecs: While splitting, sources may specify the produced bundles
-	// as differences against another source, in order to save backend-side
-	// memory and allow bigger jobs. For details, see SourceSplitRequest. To
-	// support this use case, the full set of parameters of the source is
-	// logically obtained by taking the latest explicitly specified value of
-	// each parameter in the order: base_specs (later items win), spec
-	// (overrides anything in base_specs).
+	// BaseSpecs: While splitting, sources may specify the produced
+	// bundles
+	// as differences against another source, in order to save
+	// backend-side
+	// memory and allow bigger jobs. For details, see SourceSplitRequest.
+	// To support this use case, the full set of parameters of the source
+	// is logically obtained by taking the latest explicitly specified
+	// value
+	// of each parameter in the order:
+	// base_specs (later items win), spec (overrides anything in
+	// base_specs).
 	BaseSpecs []googleapi.RawMessage `json:"baseSpecs,omitempty"`
 
 	// Codec: The codec to use to decode data read from the source.
 	Codec googleapi.RawMessage `json:"codec,omitempty"`
 
 	// DoesNotNeedSplitting: Setting this value to true hints to the
-	// framework that the source doesn't need splitting, and using
-	// SourceSplitRequest on it would yield
-	// SOURCE_SPLIT_OUTCOME_USE_CURRENT. E.g. a file splitter may set this
-	// to true when splitting a single file into a set of byte ranges of
-	// appropriate size, and set this to false when splitting a filepattern
-	// into individual files. However, for efficiency, a file splitter may
-	// decide to produce file subranges directly from the filepattern to
-	// avoid a splitting round-trip. See SourceSplitRequest for an overview
-	// of the splitting process. This field is meaningful only in the Source
-	// objects populated by the user (e.g. when filling in a DerivedSource).
-	// Source objects supplied by the framework to the user don't have this
-	// field populated.
+	// framework that the source
+	// doesn't need splitting, and using SourceSplitRequest on it
+	// would
+	// yield SOURCE_SPLIT_OUTCOME_USE_CURRENT.
+	//
+	// E.g. a file splitter may set this to true when splitting a single
+	// file
+	// into a set of byte ranges of appropriate size, and set this
+	// to false when splitting a filepattern into individual files.
+	// However, for efficiency, a file splitter may decide to produce
+	// file subranges directly from the filepattern to avoid a
+	// splitting
+	// round-trip.
+	//
+	// See SourceSplitRequest for an overview of the splitting
+	// process.
+	//
+	// This field is meaningful only in the Source objects populated
+	// by the user (e.g. when filling in a DerivedSource).
+	// Source objects supplied by the framework to the user don't have
+	// this field populated.
 	DoesNotNeedSplitting bool `json:"doesNotNeedSplitting,omitempty"`
 
 	// Metadata: Optionally, metadata for this source can be supplied right
-	// away, avoiding a SourceGetMetadataOperation roundtrip (see
-	// SourceOperationRequest). This field is meaningful only in the Source
-	// objects populated by the user (e.g. when filling in a DerivedSource).
-	// Source objects supplied by the framework to the user don't have this
-	// field populated.
+	// away,
+	// avoiding a SourceGetMetadataOperation roundtrip
+	// (see SourceOperationRequest).
+	//
+	// This field is meaningful only in the Source objects populated
+	// by the user (e.g. when filling in a DerivedSource).
+	// Source objects supplied by the framework to the user don't have
+	// this field populated.
 	Metadata *SourceMetadata `json:"metadata,omitempty"`
 
 	// Spec: The source to read from, plus its parameters.
@@ -3256,20 +3673,25 @@
 }
 
 // SourceMetadata: Metadata about a Source useful for automatically
-// optimizing and tuning the pipeline, etc.
+// optimizing
+// and tuning the pipeline, etc.
 type SourceMetadata struct {
 	// EstimatedSizeBytes: An estimate of the total size (in bytes) of the
-	// data that would be read from this source. This estimate is in terms
-	// of external storage size, before any decompression or other
-	// processing done by the reader.
+	// data that would be
+	// read from this source.  This estimate is in terms of external
+	// storage
+	// size, before any decompression or other processing done by the
+	// reader.
 	EstimatedSizeBytes int64 `json:"estimatedSizeBytes,omitempty,string"`
 
 	// Infinite: Specifies that the size of this source is known to be
-	// infinite (this is a streaming source).
+	// infinite
+	// (this is a streaming source).
 	Infinite bool `json:"infinite,omitempty"`
 
 	// ProducesSortedKeys: Whether this source is known to produce key/value
-	// pairs with the (encoded) keys in lexicographically sorted order.
+	// pairs with
+	// the (encoded) keys in lexicographically sorted order.
 	ProducesSortedKeys bool `json:"producesSortedKeys,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "EstimatedSizeBytes")
@@ -3297,8 +3719,8 @@
 }
 
 // SourceOperationRequest: A work item that represents the different
-// operations that can be performed on a user-defined Source
-// specification.
+// operations that can be
+// performed on a user-defined Source specification.
 type SourceOperationRequest struct {
 	// GetMetadata: Information about a request to get metadata about a
 	// source.
@@ -3331,8 +3753,9 @@
 }
 
 // SourceOperationResponse: The result of a SourceOperationRequest,
-// specified in ReportWorkItemStatusRequest.source_operation when the
-// work item is completed.
+// specified in
+// ReportWorkItemStatusRequest.source_operation when the work item
+// is completed.
 type SourceOperationResponse struct {
 	// GetMetadata: A response to a request to get metadata about a source.
 	GetMetadata *SourceGetMetadataResponse `json:"getMetadata,omitempty"`
@@ -3364,11 +3787,12 @@
 }
 
 // SourceSplitOptions: Hints for splitting a Source into bundles (parts
-// for parallel processing) using SourceSplitRequest.
+// for parallel
+// processing) using SourceSplitRequest.
 type SourceSplitOptions struct {
 	// DesiredBundleSizeBytes: The source should be split into a set of
-	// bundles where the estimated size of each is approximately this many
-	// bytes.
+	// bundles where the estimated size
+	// of each is approximately this many bytes.
 	DesiredBundleSizeBytes int64 `json:"desiredBundleSizeBytes,omitempty,string"`
 
 	// DesiredShardSizeBytes: DEPRECATED in favor of
@@ -3401,17 +3825,28 @@
 }
 
 // SourceSplitRequest: Represents the operation to split a high-level
-// Source specification into bundles (parts for parallel processing). At
-// a high level, splitting of a source into bundles happens as follows:
-// SourceSplitRequest is applied to the source. If it returns
+// Source specification
+// into bundles (parts for parallel processing).
+//
+// At a high level, splitting of a source into bundles happens as
+// follows:
+// SourceSplitRequest is applied to the source. If it
+// returns
 // SOURCE_SPLIT_OUTCOME_USE_CURRENT, no further splitting happens and
-// the source is used "as is". Otherwise, splitting is applied
-// recursively to each produced DerivedSource. As an optimization, for
-// any Source, if its does_not_need_splitting is true, the framework
-// assumes that splitting this source would return
+// the source
+// is used "as is". Otherwise, splitting is applied recursively to
+// each
+// produced DerivedSource.
+//
+// As an optimization, for any Source, if its does_not_need_splitting
+// is
+// true, the framework assumes that splitting this source would
+// return
 // SOURCE_SPLIT_OUTCOME_USE_CURRENT, and doesn't initiate a
-// SourceSplitRequest. This applies both to the initial source being
-// split and to bundles produced from it.
+// SourceSplitRequest.
+// This applies both to the initial source being split and to
+// bundles
+// produced from it.
 type SourceSplitRequest struct {
 	// Options: Hints for tuning the splitting process.
 	Options *SourceSplitOptions `json:"options,omitempty"`
@@ -3445,21 +3880,29 @@
 // SourceSplitResponse: The response to a SourceSplitRequest.
 type SourceSplitResponse struct {
 	// Bundles: If outcome is SPLITTING_HAPPENED, then this is a list of
-	// bundles into which the source was split. Otherwise this field is
-	// ignored. This list can be empty, which means the source represents an
-	// empty input.
+	// bundles
+	// into which the source was split. Otherwise this field is
+	// ignored.
+	// This list can be empty, which means the source represents an empty
+	// input.
 	Bundles []*DerivedSource `json:"bundles,omitempty"`
 
 	// Outcome: Indicates whether splitting happened and produced a list of
-	// bundles. If this is USE_CURRENT_SOURCE_AS_IS, the current source
-	// should be processed "as is" without splitting. "bundles" is ignored
-	// in this case. If this is SPLITTING_HAPPENED, then "bundles" contains
-	// a list of bundles into which the source was split.
+	// bundles.
+	// If this is USE_CURRENT_SOURCE_AS_IS, the current source should
+	// be processed "as is" without splitting. "bundles" is ignored in this
+	// case.
+	// If this is SPLITTING_HAPPENED, then "bundles" contains a list
+	// of
+	// bundles into which the source was split.
 	//
 	// Possible values:
-	//   "SOURCE_SPLIT_OUTCOME_UNKNOWN"
-	//   "SOURCE_SPLIT_OUTCOME_USE_CURRENT"
-	//   "SOURCE_SPLIT_OUTCOME_SPLITTING_HAPPENED"
+	//   "SOURCE_SPLIT_OUTCOME_UNKNOWN" - The source split outcome is
+	// unknown, or unspecified.
+	//   "SOURCE_SPLIT_OUTCOME_USE_CURRENT" - The current source should be
+	// processed "as is" without splitting.
+	//   "SOURCE_SPLIT_OUTCOME_SPLITTING_HAPPENED" - Splitting produced a
+	// list of bundles.
 	Outcome string `json:"outcome,omitempty"`
 
 	// Shards: DEPRECATED in favor of bundles.
@@ -3493,10 +3936,14 @@
 	// DerivationMode: DEPRECATED
 	//
 	// Possible values:
-	//   "SOURCE_DERIVATION_MODE_UNKNOWN"
-	//   "SOURCE_DERIVATION_MODE_INDEPENDENT"
-	//   "SOURCE_DERIVATION_MODE_CHILD_OF_CURRENT"
-	//   "SOURCE_DERIVATION_MODE_SIBLING_OF_CURRENT"
+	//   "SOURCE_DERIVATION_MODE_UNKNOWN" - The source derivation is
+	// unknown, or unspecified.
+	//   "SOURCE_DERIVATION_MODE_INDEPENDENT" - Produce a completely
+	// independent Source with no base.
+	//   "SOURCE_DERIVATION_MODE_CHILD_OF_CURRENT" - Produce a Source based
+	// on the Source being split.
+	//   "SOURCE_DERIVATION_MODE_SIBLING_OF_CURRENT" - Produce a Source
+	// based on the base of the Source being split.
 	DerivationMode string `json:"derivationMode,omitempty"`
 
 	// Source: DEPRECATED
@@ -3527,7 +3974,8 @@
 }
 
 // SplitInt64: A representation of an int64, n, that is immune to
-// precision loss when encoded in JSON.
+// precision loss when
+// encoded in JSON.
 type SplitInt64 struct {
 	// HighBits: The high order bits, including the sign: n >> 32.
 	HighBits int64 `json:"highBits,omitempty"`
@@ -3590,53 +4038,99 @@
 }
 
 // Status: The `Status` type defines a logical error model that is
-// suitable for different programming environments, including REST APIs
-// and RPC APIs. It is used by [gRPC](https://github.com/grpc). The
-// error model is designed to be: - Simple to use and understand for
-// most users - Flexible enough to meet unexpected needs # Overview The
-// `Status` message contains three pieces of data: error code, error
-// message, and error details. The error code should be an enum value of
+// suitable for different
+// programming environments, including REST APIs and RPC APIs. It is
+// used by
+// [gRPC](https://github.com/grpc). The error model is designed to
+// be:
+//
+// - Simple to use and understand for most users
+// - Flexible enough to meet unexpected needs
+//
+// # Overview
+//
+// The `Status` message contains three pieces of data: error code, error
+// message,
+// and error details. The error code should be an enum value
+// of
 // google.rpc.Code, but it may accept additional error codes if needed.
-// The error message should be a developer-facing English message that
-// helps developers *understand* and *resolve* the error. If a localized
-// user-facing error message is needed, put the localized message in the
-// error details or localize it in the client. The optional error
-// details may contain arbitrary information about the error. There is a
-// predefined set of error detail types in the package `google.rpc`
-// which can be used for common error conditions. # Language mapping The
-// `Status` message is the logical representation of the error model,
-// but it is not necessarily the actual wire format. When the `Status`
-// message is exposed in different client libraries and different wire
-// protocols, it can be mapped differently. For example, it will likely
-// be mapped to some exceptions in Java, but more likely mapped to some
-// error codes in C. # Other uses The error model and the `Status`
-// message can be used in a variety of environments, either with or
-// without APIs, to provide a consistent developer experience across
-// different environments. Example uses of this error model include: -
-// Partial errors. If a service needs to return partial errors to the
-// client, it may embed the `Status` in the normal response to indicate
-// the partial errors. - Workflow errors. A typical workflow has
-// multiple steps. Each step may have a `Status` message for error
-// reporting purpose. - Batch operations. If a client uses batch request
-// and batch response, the `Status` message should be used directly
-// inside batch response, one for each error sub-response. -
-// Asynchronous operations. If an API call embeds asynchronous operation
-// results in its response, the status of those operations should be
-// represented directly using the `Status` message. - Logging. If some
-// API errors are stored in logs, the message `Status` could be used
-// directly after any stripping needed for security/privacy reasons.
+// The
+// error message should be a developer-facing English message that
+// helps
+// developers *understand* and *resolve* the error. If a localized
+// user-facing
+// error message is needed, put the localized message in the error
+// details or
+// localize it in the client. The optional error details may contain
+// arbitrary
+// information about the error. There is a predefined set of error
+// detail types
+// in the package `google.rpc` which can be used for common error
+// conditions.
+//
+// # Language mapping
+//
+// The `Status` message is the logical representation of the error
+// model, but it
+// is not necessarily the actual wire format. When the `Status` message
+// is
+// exposed in different client libraries and different wire protocols,
+// it can be
+// mapped differently. For example, it will likely be mapped to some
+// exceptions
+// in Java, but more likely mapped to some error codes in C.
+//
+// # Other uses
+//
+// The error model and the `Status` message can be used in a variety
+// of
+// environments, either with or without APIs, to provide a
+// consistent developer experience across different
+// environments.
+//
+// Example uses of this error model include:
+//
+// - Partial errors. If a service needs to return partial errors to the
+// client,
+//     it may embed the `Status` in the normal response to indicate the
+// partial
+//     errors.
+//
+// - Workflow errors. A typical workflow has multiple steps. Each step
+// may
+//     have a `Status` message for error reporting purpose.
+//
+// - Batch operations. If a client uses batch request and batch
+// response, the
+//     `Status` message should be used directly inside batch response,
+// one for
+//     each error sub-response.
+//
+// - Asynchronous operations. If an API call embeds asynchronous
+// operation
+//     results in its response, the status of those operations should
+// be
+//     represented directly using the `Status` message.
+//
+// - Logging. If some API errors are stored in logs, the message
+// `Status` could
+//     be used directly after any stripping needed for security/privacy
+// reasons.
 type Status struct {
 	// Code: The status code, which should be an enum value of
 	// google.rpc.Code.
 	Code int64 `json:"code,omitempty"`
 
-	// Details: A list of messages that carry the error details. There will
-	// be a common set of message types for APIs to use.
+	// Details: A list of messages that carry the error details.  There will
+	// be a
+	// common set of message types for APIs to use.
 	Details []googleapi.RawMessage `json:"details,omitempty"`
 
 	// Message: A developer-facing error message, which should be in
-	// English. Any user-facing error message should be localized and sent
-	// in the google.rpc.Status.details field, or localized by the client.
+	// English. Any
+	// user-facing error message should be localized and sent in
+	// the
+	// google.rpc.Status.details field, or localized by the client.
 	Message string `json:"message,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Code") to
@@ -3662,28 +4156,46 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// Step: Defines a particular step within a Cloud Dataflow job. A job
-// consists of multiple steps, each of which performs some specific
-// operation as part of the overall job. Data is typically passed from
-// one step to another as part of the job. Here's an example of a
-// sequence of steps which together implement a Map-Reduce job: * Read a
-// collection of data from some source, parsing the collection's
-// elements. * Validate the elements. * Apply a user-defined function to
-// map each element to some value and extract an element-specific key
-// value. * Group elements with the same key into a single element with
-// that key, transforming a multiply-keyed collection into a
-// uniquely-keyed collection. * Write the elements out to some data
-// sink. Note that the Cloud Dataflow service may be used to run many
-// different types of jobs, not just Map-Reduce.
+// Step: Defines a particular step within a Cloud Dataflow job.
+//
+// A job consists of multiple steps, each of which performs
+// some
+// specific operation as part of the overall job.  Data is
+// typically
+// passed from one step to another as part of the job.
+//
+// Here's an example of a sequence of steps which together implement
+// a
+// Map-Reduce job:
+//
+//   * Read a collection of data from some source, parsing the
+//     collection's elements.
+//
+//   * Validate the elements.
+//
+//   * Apply a user-defined function to map each element to some value
+//     and extract an element-specific key value.
+//
+//   * Group elements with the same key into a single element with
+//     that key, transforming a multiply-keyed collection into a
+//     uniquely-keyed collection.
+//
+//   * Write the elements out to some data sink.
+//
+// Note that the Cloud Dataflow service may be used to run many
+// different
+// types of jobs, not just Map-Reduce.
 type Step struct {
 	// Kind: The kind of step in the Cloud Dataflow job.
 	Kind string `json:"kind,omitempty"`
 
-	// Name: The name that identifies the step. This must be unique for each
+	// Name: The name that identifies the step. This must be unique for
+	// each
 	// step with respect to all other steps in the Cloud Dataflow job.
 	Name string `json:"name,omitempty"`
 
-	// Properties: Named properties associated with the step. Each kind of
+	// Properties: Named properties associated with the step. Each kind
+	// of
 	// predefined step has its own required set of properties.
 	Properties googleapi.RawMessage `json:"properties,omitempty"`
 
@@ -3711,7 +4223,8 @@
 }
 
 // StreamLocation: Describes a stream of data, either as input to be
-// processed or as output of a streaming Dataflow job.
+// processed or as
+// output of a streaming Dataflow job.
 type StreamLocation struct {
 	// CustomSourceLocation: The stream is a custom source.
 	CustomSourceLocation *CustomSourceLocation `json:"customSourceLocation,omitempty"`
@@ -3723,7 +4236,8 @@
 	SideInputLocation *StreamingSideInputLocation `json:"sideInputLocation,omitempty"`
 
 	// StreamingStageLocation: The stream is part of another computation
-	// within the current streaming Dataflow job.
+	// within the current
+	// streaming Dataflow job.
 	StreamingStageLocation *StreamingStageLocation `json:"streamingStageLocation,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g.
@@ -3790,7 +4304,8 @@
 }
 
 // StreamingComputationRanges: Describes full or partial data disk
-// assignment information of the computation ranges.
+// assignment information of the computation
+// ranges.
 type StreamingComputationRanges struct {
 	// ComputationId: The ID of the computation.
 	ComputationId string `json:"computationId,omitempty"`
@@ -3823,7 +4338,8 @@
 }
 
 // StreamingComputationTask: A task which describes what action should
-// be performed for the specified streaming computation ranges.
+// be performed for the specified
+// streaming computation ranges.
 type StreamingComputationTask struct {
 	// ComputationRanges: Contains ranges of a streaming computation this
 	// task should apply to.
@@ -3835,9 +4351,12 @@
 	// TaskType: A type of streaming computation task.
 	//
 	// Possible values:
-	//   "STREAMING_COMPUTATION_TASK_UNKNOWN"
-	//   "STREAMING_COMPUTATION_TASK_STOP"
-	//   "STREAMING_COMPUTATION_TASK_START"
+	//   "STREAMING_COMPUTATION_TASK_UNKNOWN" - The streaming computation
+	// task is unknown, or unspecified.
+	//   "STREAMING_COMPUTATION_TASK_STOP" - Stop processing specified
+	// streaming computation range(s).
+	//   "STREAMING_COMPUTATION_TASK_START" - Start processing specified
+	// streaming computation range(s).
 	TaskType string `json:"taskType,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ComputationRanges")
@@ -3907,7 +4426,8 @@
 	Drain bool `json:"drain,omitempty"`
 
 	// ReceiveWorkPort: The TCP port on which the worker should listen for
-	// messages from other streaming computation workers.
+	// messages from
+	// other streaming computation workers.
 	ReceiveWorkPort int64 `json:"receiveWorkPort,omitempty"`
 
 	// StreamingComputationTopology: The global topology of the streaming
@@ -3915,7 +4435,8 @@
 	StreamingComputationTopology *TopologyConfig `json:"streamingComputationTopology,omitempty"`
 
 	// WorkerHarnessPort: The TCP port used by the worker to communicate
-	// with the Dataflow worker harness.
+	// with the Dataflow
+	// worker harness.
 	WorkerHarnessPort int64 `json:"workerHarnessPort,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Drain") to
@@ -3976,10 +4497,12 @@
 }
 
 // StreamingStageLocation: Identifies the location of a streaming
-// computation stage, for stage-to-stage communication.
+// computation stage, for
+// stage-to-stage communication.
 type StreamingStageLocation struct {
 	// StreamId: Identifies the particular stream within the streaming
-	// Dataflow job.
+	// Dataflow
+	// job.
 	StreamId string `json:"streamId,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "StreamId") to
@@ -4043,12 +4566,18 @@
 	BaseTaskDir string `json:"baseTaskDir,omitempty"`
 
 	// BaseUrl: The base URL for the taskrunner to use when accessing Google
-	// Cloud APIs. When workers access Google Cloud APIs, they logically do
-	// so via relative URLs. If this field is specified, it supplies the
-	// base URL to use for resolving these relative URLs. The normative
-	// algorithm used is defined by RFC 1808, "Relative Uniform Resource
-	// Locators". If not specified, the default value is
-	// "http://www.googleapis.com/"
+	// Cloud APIs.
+	//
+	// When workers access Google Cloud APIs, they logically do so
+	// via
+	// relative URLs.  If this field is specified, it supplies the base
+	// URL to use for resolving these relative URLs.  The
+	// normative
+	// algorithm used is defined by RFC 1808, "Relative Uniform
+	// Resource
+	// Locators".
+	//
+	// If not specified, the default value is "http://www.googleapis.com/"
 	BaseUrl string `json:"baseUrl,omitempty"`
 
 	// CommandlinesFileName: The file to store preprocessing commands in.
@@ -4071,17 +4600,24 @@
 	LogDir string `json:"logDir,omitempty"`
 
 	// LogToSerialconsole: Whether to send taskrunner log info to Google
-	// Compute Engine VM serial console.
+	// Compute Engine VM serial
+	// console.
 	LogToSerialconsole bool `json:"logToSerialconsole,omitempty"`
 
-	// LogUploadLocation: Indicates where to put logs. If this is not
-	// specified, the logs will not be uploaded. The supported resource type
-	// is: Google Cloud Storage: storage.googleapis.com/{bucket}/{object}
-	// bucket.storage.googleapis.com/{object}
+	// LogUploadLocation: Indicates where to put logs.  If this is not
+	// specified, the logs
+	// will not be uploaded.
+	//
+	// The supported resource type is:
+	//
+	// Google Cloud Storage:
+	//   storage.googleapis.com/{bucket}/{object}
+	//   bucket.storage.googleapis.com/{object}
 	LogUploadLocation string `json:"logUploadLocation,omitempty"`
 
 	// OauthScopes: The OAuth2 scopes to be requested by the taskrunner in
-	// order to access the Cloud Dataflow API.
+	// order to
+	// access the Cloud Dataflow API.
 	OauthScopes []string `json:"oauthScopes,omitempty"`
 
 	// ParallelWorkerSettings: The settings to pass to the parallel worker
@@ -4092,17 +4628,24 @@
 	StreamingWorkerMainClass string `json:"streamingWorkerMainClass,omitempty"`
 
 	// TaskGroup: The UNIX group ID on the worker VM to use for tasks
-	// launched by taskrunner; e.g. "wheel".
+	// launched by
+	// taskrunner; e.g. "wheel".
 	TaskGroup string `json:"taskGroup,omitempty"`
 
 	// TaskUser: The UNIX user ID on the worker VM to use for tasks launched
-	// by taskrunner; e.g. "root".
+	// by
+	// taskrunner; e.g. "root".
 	TaskUser string `json:"taskUser,omitempty"`
 
 	// TempStoragePrefix: The prefix of the resources the taskrunner should
-	// use for temporary storage. The supported resource type is: Google
-	// Cloud Storage: storage.googleapis.com/{bucket}/{object}
-	// bucket.storage.googleapis.com/{object}
+	// use for
+	// temporary storage.
+	//
+	// The supported resource type is:
+	//
+	// Google Cloud Storage:
+	//   storage.googleapis.com/{bucket}/{object}
+	//   bucket.storage.googleapis.com/{object}
 	TempStoragePrefix string `json:"tempStoragePrefix,omitempty"`
 
 	// VmId: The ID string of the VM.
@@ -4136,7 +4679,8 @@
 }
 
 // TopologyConfig: Global topology of the streaming Dataflow job,
-// including all computations and their sharded locations.
+// including all
+// computations and their sharded locations.
 type TopologyConfig struct {
 	// Computations: The computations associated with a streaming Dataflow
 	// job.
@@ -4180,7 +4724,8 @@
 }
 
 // WorkItem: WorkItem represents basic information about a WorkItem to
-// be executed in the cloud.
+// be executed
+// in the cloud.
 type WorkItem struct {
 	// Configuration: Work item-specific configuration as an opaque blob.
 	Configuration string `json:"configuration,omitempty"`
@@ -4202,7 +4747,8 @@
 	MapTask *MapTask `json:"mapTask,omitempty"`
 
 	// Packages: Any required packages that need to be fetched in order to
-	// execute this WorkItem.
+	// execute
+	// this WorkItem.
 	Packages []*Package `json:"packages,omitempty"`
 
 	// ProjectId: Identifies the cloud project this WorkItem belongs to.
@@ -4257,33 +4803,41 @@
 }
 
 // WorkItemServiceState: The Dataflow service's idea of the current
-// state of a WorkItem being processed by a worker.
+// state of a WorkItem
+// being processed by a worker.
 type WorkItemServiceState struct {
 	// HarnessData: Other data returned by the service, specific to the
-	// particular worker harness.
+	// particular
+	// worker harness.
 	HarnessData googleapi.RawMessage `json:"harnessData,omitempty"`
 
 	// LeaseExpireTime: Time at which the current lease will expire.
 	LeaseExpireTime string `json:"leaseExpireTime,omitempty"`
 
 	// MetricShortId: The short ids that workers should use in subsequent
-	// metric updates. Workers should strive to use short ids whenever
-	// possible, but it is ok to request the short_id again if a worker lost
-	// track of it (e.g. if the worker is recovering from a crash). NOTE: it
-	// is possible that the response may have short ids for a subset of the
-	// metrics.
+	// metric updates.
+	// Workers should strive to use short ids whenever possible, but it is
+	// ok
+	// to request the short_id again if a worker lost track of it
+	// (e.g. if the worker is recovering from a crash).
+	// NOTE: it is possible that the response may have short ids for a
+	// subset
+	// of the metrics.
 	MetricShortId []*MetricShortId `json:"metricShortId,omitempty"`
 
 	// NextReportIndex: The index value to use for the next report sent by
-	// the worker. Note: If the report call fails for whatever reason, the
-	// worker should reuse this index for subsequent report attempts.
+	// the worker.
+	// Note: If the report call fails for whatever reason, the worker
+	// should
+	// reuse this index for subsequent report attempts.
 	NextReportIndex int64 `json:"nextReportIndex,omitempty,string"`
 
 	// ReportStatusInterval: New recommended reporting interval.
 	ReportStatusInterval string `json:"reportStatusInterval,omitempty"`
 
 	// SplitRequest: The progress point in the WorkItem where the Dataflow
-	// service suggests that the worker truncate the task.
+	// service
+	// suggests that the worker truncate the task.
 	SplitRequest *ApproximateSplitRequest `json:"splitRequest,omitempty"`
 
 	// SuggestedStopPoint: DEPRECATED in favor of split_request.
@@ -4328,8 +4882,9 @@
 	// DynamicSourceSplit: See documentation of stop_position.
 	DynamicSourceSplit *DynamicSourceSplit `json:"dynamicSourceSplit,omitempty"`
 
-	// Errors: Specifies errors which occurred during processing. If errors
-	// are provided, and completed = true, then the WorkItem is considered
+	// Errors: Specifies errors which occurred during processing.  If errors
+	// are
+	// provided, and completed = true, then the WorkItem is considered
 	// to have failed.
 	Errors []*Status `json:"errors,omitempty"`
 
@@ -4339,17 +4894,24 @@
 	// Progress: DEPRECATED in favor of reported_progress.
 	Progress *ApproximateProgress `json:"progress,omitempty"`
 
-	// ReportIndex: The report index. When a WorkItem is leased, the lease
-	// will contain an initial report index. When a WorkItem's status is
-	// reported to the system, the report should be sent with that report
-	// index, and the response will contain the index the worker should use
-	// for the next report. Reports received with unexpected index values
-	// will be rejected by the service. In order to preserve idempotency,
-	// the worker should not alter the contents of a report, even if the
-	// worker must submit the same report multiple times before getting back
-	// a response. The worker should not submit a subsequent report until
-	// the response for the previous report had been received from the
-	// service.
+	// ReportIndex: The report index.  When a WorkItem is leased, the lease
+	// will
+	// contain an initial report index.  When a WorkItem's status
+	// is
+	// reported to the system, the report should be sent with
+	// that report index, and the response will contain the index the
+	// worker should use for the next report.  Reports received
+	// with
+	// unexpected index values will be rejected by the service.
+	//
+	// In order to preserve idempotency, the worker should not alter
+	// the
+	// contents of a report, even if the worker must submit the same
+	// report multiple times before getting back a response.  The
+	// worker
+	// should not submit a subsequent report until the response for
+	// the
+	// previous report had been received from the service.
 	ReportIndex int64 `json:"reportIndex,omitempty,string"`
 
 	// ReportedProgress: The worker's progress through this WorkItem.
@@ -4363,35 +4925,51 @@
 	SourceFork *SourceFork `json:"sourceFork,omitempty"`
 
 	// SourceOperationResponse: If the work item represented a
-	// SourceOperationRequest, and the work is completed, contains the
-	// result of the operation.
+	// SourceOperationRequest, and the work
+	// is completed, contains the result of the operation.
 	SourceOperationResponse *SourceOperationResponse `json:"sourceOperationResponse,omitempty"`
 
 	// StopPosition: A worker may split an active map task in two parts,
-	// "primary" and "residual", continuing to process the primary part and
-	// returning the residual part into the pool of available work. This
-	// event is called a "dynamic split" and is critical to the dynamic work
-	// rebalancing feature. The two obtained sub-tasks are called "parts" of
-	// the split. The parts, if concatenated, must represent the same input
-	// as would be read by the current task if the split did not happen. The
-	// exact way in which the original task is decomposed into the two parts
-	// is specified either as a position demarcating them (stop_position),
-	// or explicitly as two DerivedSources, if this task consumes a
-	// user-defined source type (dynamic_source_split). The "current" task
-	// is adjusted as a result of the split: after a task with range [A, B)
-	// sends a stop_position update at C, its range is considered to be [A,
-	// C), e.g.: * Progress should be interpreted relative to the new range,
-	// e.g. "75% completed" means "75% of [A, C) completed" * The worker
-	// should interpret proposed_stop_position relative to the new range,
-	// e.g. "split at 68%" should be interpreted as "split at 68% of [A,
-	// C)". * If the worker chooses to split again using stop_position, only
-	// stop_positions in [A, C) will be accepted. * Etc.
-	// dynamic_source_split has similar semantics: e.g., if a task with
-	// source S splits using dynamic_source_split into {P, R} (where P and R
-	// must be together equivalent to S), then subsequent progress and
-	// proposed_stop_position should be interpreted relative to P, and in a
-	// potential subsequent dynamic_source_split into {P', R'}, P' and R'
-	// must be together equivalent to P, etc.
+	// "primary" and
+	// "residual", continuing to process the primary part and returning
+	// the
+	// residual part into the pool of available work.
+	// This event is called a "dynamic split" and is critical to the
+	// dynamic
+	// work rebalancing feature. The two obtained sub-tasks are
+	// called
+	// "parts" of the split.
+	// The parts, if concatenated, must represent the same input as would
+	// be read by the current task if the split did not happen.
+	// The exact way in which the original task is decomposed into the
+	// two
+	// parts is specified either as a position demarcating
+	// them
+	// (stop_position), or explicitly as two DerivedSources, if this
+	// task consumes a user-defined source type (dynamic_source_split).
+	//
+	// The "current" task is adjusted as a result of the split: after a
+	// task
+	// with range [A, B) sends a stop_position update at C, its range
+	// is
+	// considered to be [A, C), e.g.:
+	// * Progress should be interpreted relative to the new range, e.g.
+	//   "75% completed" means "75% of [A, C) completed"
+	// * The worker should interpret proposed_stop_position relative to the
+	//   new range, e.g. "split at 68%" should be interpreted as
+	//   "split at 68% of [A, C)".
+	// * If the worker chooses to split again using stop_position, only
+	//   stop_positions in [A, C) will be accepted.
+	// * Etc.
+	// dynamic_source_split has similar semantics: e.g., if a task
+	// with
+	// source S splits using dynamic_source_split into {P, R}
+	// (where P and R must be together equivalent to S), then
+	// subsequent
+	// progress and proposed_stop_position should be interpreted relative
+	// to P, and in a potential subsequent dynamic_source_split into {P',
+	// R'},
+	// P' and R' must be together equivalent to P, etc.
 	StopPosition *Position `json:"stopPosition,omitempty"`
 
 	// WorkItemId: Identifies the WorkItem.
@@ -4421,17 +4999,27 @@
 }
 
 // WorkerHealthReport: WorkerHealthReport contains information about the
-// health of a worker. The VM should be identified by the labels
-// attached to the WorkerMessage that this health ping belongs to.
+// health of a worker.
+//
+// The VM should be identified by the labels attached to the
+// WorkerMessage that
+// this health ping belongs to.
 type WorkerHealthReport struct {
-	// Pods: The pods running on the worker. See:
-	// http://kubernetes.io/v1.1/docs/api-reference/v1/definitions.html#_v1_pod This field is used by the worker to send the status of the indvidual containers running on each
-	// worker.
+	// Pods: The pods running on the worker.
+	// See:
+	// http://kubernetes.io/v1.1/docs/api-reference/v1/definitions.html#
+	// _v1_pod
+	//
+	// This field is used by the worker to send the status of the
+	// indvidual
+	// containers running on each worker.
 	Pods []googleapi.RawMessage `json:"pods,omitempty"`
 
 	// ReportInterval: The interval at which the worker is sending health
-	// reports. The default value of 0 should be interpreted as the field is
-	// not being explicitly set by the worker.
+	// reports.
+	// The default value of 0 should be interpreted as the field is not
+	// being
+	// explicitly set by the worker.
 	ReportInterval string `json:"reportInterval,omitempty"`
 
 	// VmIsHealthy: Whether the VM is healthy.
@@ -4464,11 +5052,16 @@
 }
 
 // WorkerHealthReportResponse: WorkerHealthReportResponse contains
-// information returned to the worker in response to a health ping.
+// information returned to the worker
+// in response to a health ping.
 type WorkerHealthReportResponse struct {
 	// ReportInterval: A positive value indicates the worker should change
-	// its reporting interval to the specified value. The default value of
-	// zero means no change in report rate is requested by the server.
+	// its reporting interval
+	// to the specified value.
+	//
+	// The default value of zero means no change in report rate is requested
+	// by
+	// the server.
 	ReportInterval string `json:"reportInterval,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ReportInterval") to
@@ -4498,13 +5091,18 @@
 // WorkerMessage: WorkerMessage provides information to the backend
 // about a worker.
 type WorkerMessage struct {
-	// Labels: Labels are used to group WorkerMessages. For example, a
-	// worker_message about a particular container might have the labels: {
-	// "JOB_ID": "2015-04-22", "WORKER_ID": "wordcount-vm-2015…"
-	// "CONTAINER_TYPE": "worker", "CONTAINER_ID": "ac1234def"} Label tags
-	// typically correspond to Label enum values. However, for ease of
-	// development other strings can be used as tags. LABEL_UNSPECIFIED
-	// should not be used here.
+	// Labels: Labels are used to group WorkerMessages.
+	// For example, a worker_message about a particular container
+	// might have the labels:
+	// { "JOB_ID": "2015-04-22",
+	//   "WORKER_ID": "wordcount-vm-2015…"
+	//   "CONTAINER_TYPE": "worker",
+	//   "CONTAINER_ID": "ac1234def"}
+	// Label tags typically correspond to Label enum values. However, for
+	// ease
+	// of development other strings can be used as tags. LABEL_UNSPECIFIED
+	// should
+	// not be used here.
 	Labels map[string]string `json:"labels,omitempty"`
 
 	// Time: The timestamp of the worker_message.
@@ -4543,34 +5141,65 @@
 }
 
 // WorkerMessageCode: A message code is used to report status and error
-// messages to the service. The message codes are intended to be machine
-// readable. The service will take care of translating these into user
-// understandable messages if necessary. Example use cases: 1. Worker
-// processes reporting successful startup. 2. Worker processes reporting
-// specific errors (e.g. package staging failure).
+// messages to the service.
+// The message codes are intended to be machine readable. The service
+// will
+// take care of translating these into user understandable messages
+// if
+// necessary.
+//
+// Example use cases:
+//   1. Worker processes reporting successful startup.
+//   2. Worker processes reporting specific errors (e.g. package
+// staging
+//      failure).
 type WorkerMessageCode struct {
 	// Code: The code is a string intended for consumption by a machine that
-	// identifies the type of message being sent. Examples: 1.
-	// "HARNESS_STARTED" might be used to indicate the worker harness has
-	// started. 2. "GCS_DOWNLOAD_ERROR" might be used to indicate an error
-	// downloading a GCS file as part of the boot process of one of the
-	// worker containers. This is a string and not an enum to make it easy
-	// to add new codes without waiting for an API change.
+	// identifies
+	// the type of message being sent.
+	// Examples:
+	//  1. "HARNESS_STARTED" might be used to indicate the worker harness
+	// has
+	//      started.
+	//  2. "GCS_DOWNLOAD_ERROR" might be used to indicate an error
+	// downloading
+	//     a GCS file as part of the boot process of one of the worker
+	// containers.
+	//
+	// This is a string and not an enum to make it easy to add new codes
+	// without
+	// waiting for an API change.
 	Code string `json:"code,omitempty"`
 
-	// Parameters: Parameters contains specific information about the code.
-	// This is a struct to allow parameters of different types. Examples: 1.
-	// For a "HARNESS_STARTED" message parameters might provide the name of
-	// the worker and additional data like timing information. 2. For a
-	// "GCS_DOWNLOAD_ERROR" parameters might contain fields listing the GCS
-	// objects being downloaded and fields containing errors. In general
-	// complex data structures should be avoided. If a worker needs to send
-	// a specific and complicated data structure then please consider
-	// defining a new proto and adding it to the data oneof in
-	// WorkerMessageResponse. Conventions: Parameters should only be used
-	// for information that isn't typically passed as a label. hostname and
-	// other worker identifiers should almost always be passed as labels
-	// since they will be included on most messages.
+	// Parameters: Parameters contains specific information about the
+	// code.
+	//
+	// This is a struct to allow parameters of different types.
+	//
+	// Examples:
+	//  1. For a "HARNESS_STARTED" message parameters might provide the
+	// name
+	//     of the worker and additional data like timing information.
+	//  2. For a "GCS_DOWNLOAD_ERROR" parameters might contain fields
+	// listing
+	//     the GCS objects being downloaded and fields containing
+	// errors.
+	//
+	// In general complex data structures should be avoided. If a
+	// worker
+	// needs to send a specific and complicated data structure then
+	// please
+	// consider defining a new proto and adding it to the data oneof
+	// in
+	// WorkerMessageResponse.
+	//
+	// Conventions:
+	//  Parameters should only be used for information that isn't typically
+	// passed
+	//  as a label.
+	//  hostname and other worker identifiers should almost always be
+	// passed
+	//  as labels since they will be included on most messages.
 	Parameters googleapi.RawMessage `json:"parameters,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Code") to
@@ -4597,7 +5226,8 @@
 }
 
 // WorkerMessageResponse: A worker_message response allows the server to
-// pass information to the sender.
+// pass information to the
+// sender.
 type WorkerMessageResponse struct {
 	// WorkerHealthReportResponse: The service's response to a worker's
 	// health report.
@@ -4633,9 +5263,13 @@
 }
 
 // WorkerPool: Describes one particular pool of Cloud Dataflow workers
-// to be instantiated by the Cloud Dataflow service in order to perform
-// the computations required by a job. Note that a workflow job may use
-// multiple pools, in order to match the various computational
+// to be
+// instantiated by the Cloud Dataflow service in order to perform
+// the
+// computations required by a job.  Note that a workflow job may
+// use
+// multiple pools, in order to match the various
+// computational
 // requirements of the various stages of the job.
 type WorkerPool struct {
 	// AutoscalingSettings: Settings for autoscaling of this WorkerPool.
@@ -4644,64 +5278,80 @@
 	// DataDisks: Data disks that are used by a VM in this workflow.
 	DataDisks []*Disk `json:"dataDisks,omitempty"`
 
-	// DefaultPackageSet: The default package set to install. This allows
-	// the service to select a default set of packages which are useful to
-	// worker harnesses written in a particular language.
+	// DefaultPackageSet: The default package set to install.  This allows
+	// the service to
+	// select a default set of packages which are useful to worker
+	// harnesses written in a particular language.
 	//
 	// Possible values:
-	//   "DEFAULT_PACKAGE_SET_UNKNOWN"
-	//   "DEFAULT_PACKAGE_SET_NONE"
-	//   "DEFAULT_PACKAGE_SET_JAVA"
-	//   "DEFAULT_PACKAGE_SET_PYTHON"
+	//   "DEFAULT_PACKAGE_SET_UNKNOWN" - The default set of packages to
+	// stage is unknown, or unspecified.
+	//   "DEFAULT_PACKAGE_SET_NONE" - Indicates that no packages should be
+	// staged at the worker unless
+	// explicitly specified by the job.
+	//   "DEFAULT_PACKAGE_SET_JAVA" - Stage packages typically useful to
+	// workers written in Java.
+	//   "DEFAULT_PACKAGE_SET_PYTHON" - Stage pacakges typically useful to
+	// workers written in Python.
 	DefaultPackageSet string `json:"defaultPackageSet,omitempty"`
 
-	// DiskSizeGb: Size of root disk for VMs, in GB. If zero or unspecified,
-	// the service will attempt to choose a reasonable default.
+	// DiskSizeGb: Size of root disk for VMs, in GB.  If zero or
+	// unspecified, the service will
+	// attempt to choose a reasonable default.
 	DiskSizeGb int64 `json:"diskSizeGb,omitempty"`
 
 	// DiskSourceImage: Fully qualified source image for disks.
 	DiskSourceImage string `json:"diskSourceImage,omitempty"`
 
-	// DiskType: Type of root disk for VMs. If empty or unspecified, the
-	// service will attempt to choose a reasonable default.
+	// DiskType: Type of root disk for VMs.  If empty or unspecified, the
+	// service will
+	// attempt to choose a reasonable default.
 	DiskType string `json:"diskType,omitempty"`
 
 	// IpConfiguration: Configuration for VM IPs.
 	//
 	// Possible values:
-	//   "WORKER_IP_UNSPECIFIED"
-	//   "WORKER_IP_PUBLIC"
-	//   "WORKER_IP_PRIVATE"
+	//   "WORKER_IP_UNSPECIFIED" - The configuration is unknown, or
+	// unspecified.
+	//   "WORKER_IP_PUBLIC" - Workers should have public IP addresses.
+	//   "WORKER_IP_PRIVATE" - Workers should have private IP addresses.
 	IpConfiguration string `json:"ipConfiguration,omitempty"`
 
 	// Kind: The kind of the worker pool; currently only `harness` and
-	// `shuffle` are supported.
+	// `shuffle`
+	// are supported.
 	Kind string `json:"kind,omitempty"`
 
-	// MachineType: Machine type (e.g. "n1-standard-1"). If empty or
-	// unspecified, the service will attempt to choose a reasonable default.
+	// MachineType: Machine type (e.g. "n1-standard-1").  If empty or
+	// unspecified, the
+	// service will attempt to choose a reasonable default.
 	MachineType string `json:"machineType,omitempty"`
 
 	// Metadata: Metadata to set on the Google Compute Engine VMs.
 	Metadata map[string]string `json:"metadata,omitempty"`
 
-	// Network: Network to which VMs will be assigned. If empty or
-	// unspecified, the service will use the network "default".
+	// Network: Network to which VMs will be assigned.  If empty or
+	// unspecified,
+	// the service will use the network "default".
 	Network string `json:"network,omitempty"`
 
 	// NumThreadsPerWorker: The number of threads per worker harness. If
-	// empty or unspecified, the service will choose a number of threads
-	// (according to the number of cores on the selected machine type for
-	// batch, or 1 by convention for streaming).
+	// empty or unspecified, the
+	// service will choose a number of threads (according to the number of
+	// cores
+	// on the selected machine type for batch, or 1 by convention for
+	// streaming).
 	NumThreadsPerWorker int64 `json:"numThreadsPerWorker,omitempty"`
 
 	// NumWorkers: Number of Google Compute Engine workers in this pool
-	// needed to execute the job. If zero or unspecified, the service will
+	// needed to
+	// execute the job.  If zero or unspecified, the service will
 	// attempt to choose a reasonable default.
 	NumWorkers int64 `json:"numWorkers,omitempty"`
 
 	// OnHostMaintenance: The action to take on host maintenance, as defined
-	// by the Google Compute Engine API.
+	// by the Google
+	// Compute Engine API.
 	OnHostMaintenance string `json:"onHostMaintenance,omitempty"`
 
 	// Packages: Packages to be installed on workers.
@@ -4711,41 +5361,61 @@
 	PoolArgs googleapi.RawMessage `json:"poolArgs,omitempty"`
 
 	// Subnetwork: Subnetwork to which VMs will be assigned, if desired.
-	// Expected to be of the form "regions/REGION/subnetworks/SUBNETWORK".
+	// Expected to be of
+	// the form "regions/REGION/subnetworks/SUBNETWORK".
 	Subnetwork string `json:"subnetwork,omitempty"`
 
 	// TaskrunnerSettings: Settings passed through to Google Compute Engine
-	// workers when using the standard Dataflow task runner. Users should
-	// ignore this field.
+	// workers when
+	// using the standard Dataflow task runner.  Users should ignore
+	// this field.
 	TaskrunnerSettings *TaskRunnerSettings `json:"taskrunnerSettings,omitempty"`
 
 	// TeardownPolicy: Sets the policy for determining when to turndown
-	// worker pool. Allowed values are: `TEARDOWN_ALWAYS`,
-	// `TEARDOWN_ON_SUCCESS`, and `TEARDOWN_NEVER`. `TEARDOWN_ALWAYS` means
-	// workers are always torn down regardless of whether the job succeeds.
-	// `TEARDOWN_ON_SUCCESS` means workers are torn down if the job
-	// succeeds. `TEARDOWN_NEVER` means the workers are never torn down. If
-	// the workers are not torn down by the service, they will continue to
-	// run and use Google Compute Engine VM resources in the user's project
-	// until they are explicitly terminated by the user. Because of this,
-	// Google recommends using the `TEARDOWN_ALWAYS` policy except for
-	// small, manually supervised test jobs. If unknown or unspecified, the
-	// service will attempt to choose a reasonable default.
+	// worker pool.
+	// Allowed values are: `TEARDOWN_ALWAYS`, `TEARDOWN_ON_SUCCESS`,
+	// and
+	// `TEARDOWN_NEVER`.
+	// `TEARDOWN_ALWAYS` means workers are always torn down regardless of
+	// whether
+	// the job succeeds. `TEARDOWN_ON_SUCCESS` means workers are torn
+	// down
+	// if the job succeeds. `TEARDOWN_NEVER` means the workers are never
+	// torn
+	// down.
+	//
+	// If the workers are not torn down by the service, they will
+	// continue to run and use Google Compute Engine VM resources in
+	// the
+	// user's project until they are explicitly terminated by the
+	// user.
+	// Because of this, Google recommends using the `TEARDOWN_ALWAYS`
+	// policy except for small, manually supervised test jobs.
+	//
+	// If unknown or unspecified, the service will attempt to choose a
+	// reasonable
+	// default.
 	//
 	// Possible values:
-	//   "TEARDOWN_POLICY_UNKNOWN"
-	//   "TEARDOWN_ALWAYS"
-	//   "TEARDOWN_ON_SUCCESS"
-	//   "TEARDOWN_NEVER"
+	//   "TEARDOWN_POLICY_UNKNOWN" - The teardown policy isn't specified, or
+	// is unknown.
+	//   "TEARDOWN_ALWAYS" - Always teardown the resource.
+	//   "TEARDOWN_ON_SUCCESS" - Teardown the resource on success. This is
+	// useful for debugging
+	// failures.
+	//   "TEARDOWN_NEVER" - Never teardown the resource. This is useful for
+	// debugging and
+	// development.
 	TeardownPolicy string `json:"teardownPolicy,omitempty"`
 
 	// WorkerHarnessContainerImage: Required. Docker container image that
-	// executes the Cloud Dataflow worker harness, residing in Google
-	// Container Registry.
+	// executes the Cloud Dataflow worker
+	// harness, residing in Google Container Registry.
 	WorkerHarnessContainerImage string `json:"workerHarnessContainerImage,omitempty"`
 
-	// Zone: Zone to run the worker pools in. If empty or unspecified, the
-	// service will attempt to choose a reasonable default.
+	// Zone: Zone to run the worker pools in.  If empty or unspecified, the
+	// service
+	// will attempt to choose a reasonable default.
 	Zone string `json:"zone,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "AutoscalingSettings")
@@ -4774,12 +5444,18 @@
 
 // WorkerSettings: Provides data to pass through to the worker harness.
 type WorkerSettings struct {
-	// BaseUrl: The base URL for accessing Google Cloud APIs. When workers
-	// access Google Cloud APIs, they logically do so via relative URLs. If
-	// this field is specified, it supplies the base URL to use for
-	// resolving these relative URLs. The normative algorithm used is
-	// defined by RFC 1808, "Relative Uniform Resource Locators". If not
-	// specified, the default value is "http://www.googleapis.com/"
+	// BaseUrl: The base URL for accessing Google Cloud APIs.
+	//
+	// When workers access Google Cloud APIs, they logically do so
+	// via
+	// relative URLs.  If this field is specified, it supplies the base
+	// URL to use for resolving these relative URLs.  The
+	// normative
+	// algorithm used is defined by RFC 1808, "Relative Uniform
+	// Resource
+	// Locators".
+	//
+	// If not specified, the default value is "http://www.googleapis.com/"
 	BaseUrl string `json:"baseUrl,omitempty"`
 
 	// ReportingEnabled: Whether to send work progress updates to the
@@ -4787,17 +5463,25 @@
 	ReportingEnabled bool `json:"reportingEnabled,omitempty"`
 
 	// ServicePath: The Cloud Dataflow service path relative to the root
-	// URL, for example, "dataflow/v1b3/projects".
+	// URL, for example,
+	// "dataflow/v1b3/projects".
 	ServicePath string `json:"servicePath,omitempty"`
 
 	// ShuffleServicePath: The Shuffle service path relative to the root
-	// URL, for example, "shuffle/v1beta1".
+	// URL, for example,
+	// "shuffle/v1beta1".
 	ShuffleServicePath string `json:"shuffleServicePath,omitempty"`
 
 	// TempStoragePrefix: The prefix of the resources the system should use
-	// for temporary storage. The supported resource type is: Google Cloud
-	// Storage: storage.googleapis.com/{bucket}/{object}
-	// bucket.storage.googleapis.com/{object}
+	// for temporary
+	// storage.
+	//
+	// The supported resource type is:
+	//
+	// Google Cloud Storage:
+	//
+	//   storage.googleapis.com/{bucket}/{object}
+	//   bucket.storage.googleapis.com/{object}
 	TempStoragePrefix string `json:"tempStoragePrefix,omitempty"`
 
 	// WorkerId: The ID of the worker running this pipeline.
@@ -4826,8 +5510,8 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// WriteInstruction: An instruction that writes records. Takes one
-// input, produces no outputs.
+// WriteInstruction: An instruction that writes records.
+// Takes one input, produces no outputs.
 type WriteInstruction struct {
 	// Input: The input.
 	Input *InstructionInput `json:"input,omitempty"`
@@ -4908,6 +5592,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.sendworkermessagesrequest)
 	if err != nil {
@@ -4964,6 +5649,7 @@
 	return ret, nil
 	// {
 	//   "description": "Send a worker_message to the service.",
+	//   "flatPath": "v1b3/projects/{projectId}/WorkerMessages",
 	//   "httpMethod": "POST",
 	//   "id": "dataflow.projects.workerMessages",
 	//   "parameterOrder": [
@@ -5068,6 +5754,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.job)
 	if err != nil {
@@ -5124,6 +5811,7 @@
 	return ret, nil
 	// {
 	//   "description": "Creates a Cloud Dataflow job.",
+	//   "flatPath": "v1b3/projects/{projectId}/jobs",
 	//   "httpMethod": "POST",
 	//   "id": "dataflow.projects.jobs.create",
 	//   "parameterOrder": [
@@ -5252,6 +5940,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5307,6 +5996,7 @@
 	return ret, nil
 	// {
 	//   "description": "Gets the state of the specified Cloud Dataflow job.",
+	//   "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}",
 	//   "httpMethod": "GET",
 	//   "id": "dataflow.projects.jobs.get",
 	//   "parameterOrder": [
@@ -5382,8 +6072,8 @@
 }
 
 // StartTime sets the optional parameter "startTime": Return only metric
-// data that has changed since this time. Default is to return all
-// information about all metrics for the job.
+// data that has changed since this time.
+// Default is to return all information about all metrics for the job.
 func (c *ProjectsJobsGetMetricsCall) StartTime(startTime string) *ProjectsJobsGetMetricsCall {
 	c.urlParams_.Set("startTime", startTime)
 	return c
@@ -5430,6 +6120,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5485,6 +6176,7 @@
 	return ret, nil
 	// {
 	//   "description": "Request the job status.",
+	//   "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}/metrics",
 	//   "httpMethod": "GET",
 	//   "id": "dataflow.projects.jobs.getMetrics",
 	//   "parameterOrder": [
@@ -5510,7 +6202,8 @@
 	//       "type": "string"
 	//     },
 	//     "startTime": {
-	//       "description": "Return only metric data that has changed since this time. Default is to return all information about all metrics for the job.",
+	//       "description": "Return only metric data that has changed since this time.\nDefault is to return all information about all metrics for the job.",
+	//       "format": "google-datetime",
 	//       "location": "query",
 	//       "type": "string"
 	//     }
@@ -5566,17 +6259,18 @@
 }
 
 // PageSize sets the optional parameter "pageSize": If there are many
-// jobs, limit response to at most this many. The actual number of jobs
-// returned will be the lesser of max_responses and an unspecified
-// server-defined limit.
+// jobs, limit response to at most this many.
+// The actual number of jobs returned will be the lesser of
+// max_responses
+// and an unspecified server-defined limit.
 func (c *ProjectsJobsListCall) PageSize(pageSize int64) *ProjectsJobsListCall {
 	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
 	return c
 }
 
 // PageToken sets the optional parameter "pageToken": Set this to the
-// 'next_page_token' field of a previous response to request additional
-// results in a long list.
+// 'next_page_token' field of a previous response
+// to request additional results in a long list.
 func (c *ProjectsJobsListCall) PageToken(pageToken string) *ProjectsJobsListCall {
 	c.urlParams_.Set("pageToken", pageToken)
 	return c
@@ -5635,6 +6329,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5689,6 +6384,7 @@
 	return ret, nil
 	// {
 	//   "description": "List the jobs of a project.",
+	//   "flatPath": "v1b3/projects/{projectId}/jobs",
 	//   "httpMethod": "GET",
 	//   "id": "dataflow.projects.jobs.list",
 	//   "parameterOrder": [
@@ -5712,13 +6408,13 @@
 	//       "type": "string"
 	//     },
 	//     "pageSize": {
-	//       "description": "If there are many jobs, limit response to at most this many. The actual number of jobs returned will be the lesser of max_responses and an unspecified server-defined limit.",
+	//       "description": "If there are many jobs, limit response to at most this many.\nThe actual number of jobs returned will be the lesser of max_responses\nand an unspecified server-defined limit.",
 	//       "format": "int32",
 	//       "location": "query",
 	//       "type": "integer"
 	//     },
 	//     "pageToken": {
-	//       "description": "Set this to the 'next_page_token' field of a previous response to request additional results in a long list.",
+	//       "description": "Set this to the 'next_page_token' field of a previous response\nto request additional results in a long list.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -5831,6 +6527,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.job)
 	if err != nil {
@@ -5888,6 +6585,7 @@
 	return ret, nil
 	// {
 	//   "description": "Updates the state of an existing Cloud Dataflow job.",
+	//   "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}",
 	//   "httpMethod": "PUT",
 	//   "id": "dataflow.projects.jobs.update",
 	//   "parameterOrder": [
@@ -5981,6 +6679,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.getdebugconfigrequest)
 	if err != nil {
@@ -6038,6 +6737,7 @@
 	return ret, nil
 	// {
 	//   "description": "Get encoded debug configuration for component. Not cacheable.",
+	//   "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}/debug/getConfig",
 	//   "httpMethod": "POST",
 	//   "id": "dataflow.projects.jobs.debug.getConfig",
 	//   "parameterOrder": [
@@ -6125,6 +6825,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.senddebugcapturerequest)
 	if err != nil {
@@ -6182,6 +6883,7 @@
 	return ret, nil
 	// {
 	//   "description": "Send encoded debug capture data for component.",
+	//   "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}/debug/sendCapture",
 	//   "httpMethod": "POST",
 	//   "id": "dataflow.projects.jobs.debug.sendCapture",
 	//   "parameterOrder": [
@@ -6238,8 +6940,8 @@
 }
 
 // EndTime sets the optional parameter "endTime": Return only messages
-// with timestamps < end_time. The default is now (i.e. return up to the
-// latest messages available).
+// with timestamps < end_time. The default is now
+// (i.e. return up to the latest messages available).
 func (c *ProjectsJobsMessagesListCall) EndTime(endTime string) *ProjectsJobsMessagesListCall {
 	c.urlParams_.Set("endTime", endTime)
 	return c
@@ -6268,25 +6970,27 @@
 }
 
 // PageSize sets the optional parameter "pageSize": If specified,
-// determines the maximum number of messages to return. If unspecified,
-// the service may choose an appropriate default, or may return an
-// arbitrarily large number of results.
+// determines the maximum number of messages to
+// return.  If unspecified, the service may choose an
+// appropriate
+// default, or may return an arbitrarily large number of results.
 func (c *ProjectsJobsMessagesListCall) PageSize(pageSize int64) *ProjectsJobsMessagesListCall {
 	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
 	return c
 }
 
 // PageToken sets the optional parameter "pageToken": If supplied, this
-// should be the value of next_page_token returned by an earlier call.
-// This will cause the next page of results to be returned.
+// should be the value of next_page_token returned
+// by an earlier call. This will cause the next page of results to
+// be returned.
 func (c *ProjectsJobsMessagesListCall) PageToken(pageToken string) *ProjectsJobsMessagesListCall {
 	c.urlParams_.Set("pageToken", pageToken)
 	return c
 }
 
 // StartTime sets the optional parameter "startTime": If specified,
-// return only messages with timestamps >= start_time. The default is
-// the job creation time (i.e. beginning of messages).
+// return only messages with timestamps >= start_time.
+// The default is the job creation time (i.e. beginning of messages).
 func (c *ProjectsJobsMessagesListCall) StartTime(startTime string) *ProjectsJobsMessagesListCall {
 	c.urlParams_.Set("startTime", startTime)
 	return c
@@ -6333,6 +7037,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6388,6 +7093,7 @@
 	return ret, nil
 	// {
 	//   "description": "Request the job status.",
+	//   "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}/messages",
 	//   "httpMethod": "GET",
 	//   "id": "dataflow.projects.jobs.messages.list",
 	//   "parameterOrder": [
@@ -6396,7 +7102,8 @@
 	//   ],
 	//   "parameters": {
 	//     "endTime": {
-	//       "description": "Return only messages with timestamps \u003c end_time. The default is now (i.e. return up to the latest messages available).",
+	//       "description": "Return only messages with timestamps \u003c end_time. The default is now\n(i.e. return up to the latest messages available).",
+	//       "format": "google-datetime",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -6425,13 +7132,13 @@
 	//       "type": "string"
 	//     },
 	//     "pageSize": {
-	//       "description": "If specified, determines the maximum number of messages to return. If unspecified, the service may choose an appropriate default, or may return an arbitrarily large number of results.",
+	//       "description": "If specified, determines the maximum number of messages to\nreturn.  If unspecified, the service may choose an appropriate\ndefault, or may return an arbitrarily large number of results.",
 	//       "format": "int32",
 	//       "location": "query",
 	//       "type": "integer"
 	//     },
 	//     "pageToken": {
-	//       "description": "If supplied, this should be the value of next_page_token returned by an earlier call. This will cause the next page of results to be returned.",
+	//       "description": "If supplied, this should be the value of next_page_token returned\nby an earlier call. This will cause the next page of results to\nbe returned.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -6442,7 +7149,8 @@
 	//       "type": "string"
 	//     },
 	//     "startTime": {
-	//       "description": "If specified, return only messages with timestamps \u003e= start_time. The default is the job creation time (i.e. beginning of messages).",
+	//       "description": "If specified, return only messages with timestamps \u003e= start_time.\nThe default is the job creation time (i.e. beginning of messages).",
+	//       "format": "google-datetime",
 	//       "location": "query",
 	//       "type": "string"
 	//     }
@@ -6532,6 +7240,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.leaseworkitemrequest)
 	if err != nil {
@@ -6589,6 +7298,7 @@
 	return ret, nil
 	// {
 	//   "description": "Leases a dataflow WorkItem to run.",
+	//   "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}/workItems:lease",
 	//   "httpMethod": "POST",
 	//   "id": "dataflow.projects.jobs.workItems.lease",
 	//   "parameterOrder": [
@@ -6677,6 +7387,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.reportworkitemstatusrequest)
 	if err != nil {
@@ -6734,6 +7445,7 @@
 	return ret, nil
 	// {
 	//   "description": "Reports the status of dataflow WorkItems leased by a worker.",
+	//   "flatPath": "v1b3/projects/{projectId}/jobs/{jobId}/workItems:reportStatus",
 	//   "httpMethod": "POST",
 	//   "id": "dataflow.projects.jobs.workItems.reportStatus",
 	//   "parameterOrder": [
@@ -6840,6 +7552,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.job)
 	if err != nil {
@@ -6897,6 +7610,7 @@
 	return ret, nil
 	// {
 	//   "description": "Creates a Cloud Dataflow job.",
+	//   "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs",
 	//   "httpMethod": "POST",
 	//   "id": "dataflow.projects.locations.jobs.create",
 	//   "parameterOrder": [
@@ -7022,6 +7736,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7078,6 +7793,7 @@
 	return ret, nil
 	// {
 	//   "description": "Gets the state of the specified Cloud Dataflow job.",
+	//   "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}",
 	//   "httpMethod": "GET",
 	//   "id": "dataflow.projects.locations.jobs.get",
 	//   "parameterOrder": [
@@ -7150,8 +7866,8 @@
 }
 
 // StartTime sets the optional parameter "startTime": Return only metric
-// data that has changed since this time. Default is to return all
-// information about all metrics for the job.
+// data that has changed since this time.
+// Default is to return all information about all metrics for the job.
 func (c *ProjectsLocationsJobsGetMetricsCall) StartTime(startTime string) *ProjectsLocationsJobsGetMetricsCall {
 	c.urlParams_.Set("startTime", startTime)
 	return c
@@ -7198,6 +7914,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7254,6 +7971,7 @@
 	return ret, nil
 	// {
 	//   "description": "Request the job status.",
+	//   "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/metrics",
 	//   "httpMethod": "GET",
 	//   "id": "dataflow.projects.locations.jobs.getMetrics",
 	//   "parameterOrder": [
@@ -7281,7 +7999,8 @@
 	//       "type": "string"
 	//     },
 	//     "startTime": {
-	//       "description": "Return only metric data that has changed since this time. Default is to return all information about all metrics for the job.",
+	//       "description": "Return only metric data that has changed since this time.\nDefault is to return all information about all metrics for the job.",
+	//       "format": "google-datetime",
 	//       "location": "query",
 	//       "type": "string"
 	//     }
@@ -7332,17 +8051,18 @@
 }
 
 // PageSize sets the optional parameter "pageSize": If there are many
-// jobs, limit response to at most this many. The actual number of jobs
-// returned will be the lesser of max_responses and an unspecified
-// server-defined limit.
+// jobs, limit response to at most this many.
+// The actual number of jobs returned will be the lesser of
+// max_responses
+// and an unspecified server-defined limit.
 func (c *ProjectsLocationsJobsListCall) PageSize(pageSize int64) *ProjectsLocationsJobsListCall {
 	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
 	return c
 }
 
 // PageToken sets the optional parameter "pageToken": Set this to the
-// 'next_page_token' field of a previous response to request additional
-// results in a long list.
+// 'next_page_token' field of a previous response
+// to request additional results in a long list.
 func (c *ProjectsLocationsJobsListCall) PageToken(pageToken string) *ProjectsLocationsJobsListCall {
 	c.urlParams_.Set("pageToken", pageToken)
 	return c
@@ -7401,6 +8121,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7456,6 +8177,7 @@
 	return ret, nil
 	// {
 	//   "description": "List the jobs of a project.",
+	//   "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs",
 	//   "httpMethod": "GET",
 	//   "id": "dataflow.projects.locations.jobs.list",
 	//   "parameterOrder": [
@@ -7481,13 +8203,13 @@
 	//       "type": "string"
 	//     },
 	//     "pageSize": {
-	//       "description": "If there are many jobs, limit response to at most this many. The actual number of jobs returned will be the lesser of max_responses and an unspecified server-defined limit.",
+	//       "description": "If there are many jobs, limit response to at most this many.\nThe actual number of jobs returned will be the lesser of max_responses\nand an unspecified server-defined limit.",
 	//       "format": "int32",
 	//       "location": "query",
 	//       "type": "integer"
 	//     },
 	//     "pageToken": {
-	//       "description": "Set this to the 'next_page_token' field of a previous response to request additional results in a long list.",
+	//       "description": "Set this to the 'next_page_token' field of a previous response\nto request additional results in a long list.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -7595,6 +8317,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.job)
 	if err != nil {
@@ -7653,6 +8376,7 @@
 	return ret, nil
 	// {
 	//   "description": "Updates the state of an existing Cloud Dataflow job.",
+	//   "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}",
 	//   "httpMethod": "PUT",
 	//   "id": "dataflow.projects.locations.jobs.update",
 	//   "parameterOrder": [
@@ -7718,8 +8442,8 @@
 }
 
 // EndTime sets the optional parameter "endTime": Return only messages
-// with timestamps < end_time. The default is now (i.e. return up to the
-// latest messages available).
+// with timestamps < end_time. The default is now
+// (i.e. return up to the latest messages available).
 func (c *ProjectsLocationsJobsMessagesListCall) EndTime(endTime string) *ProjectsLocationsJobsMessagesListCall {
 	c.urlParams_.Set("endTime", endTime)
 	return c
@@ -7741,25 +8465,27 @@
 }
 
 // PageSize sets the optional parameter "pageSize": If specified,
-// determines the maximum number of messages to return. If unspecified,
-// the service may choose an appropriate default, or may return an
-// arbitrarily large number of results.
+// determines the maximum number of messages to
+// return.  If unspecified, the service may choose an
+// appropriate
+// default, or may return an arbitrarily large number of results.
 func (c *ProjectsLocationsJobsMessagesListCall) PageSize(pageSize int64) *ProjectsLocationsJobsMessagesListCall {
 	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
 	return c
 }
 
 // PageToken sets the optional parameter "pageToken": If supplied, this
-// should be the value of next_page_token returned by an earlier call.
-// This will cause the next page of results to be returned.
+// should be the value of next_page_token returned
+// by an earlier call. This will cause the next page of results to
+// be returned.
 func (c *ProjectsLocationsJobsMessagesListCall) PageToken(pageToken string) *ProjectsLocationsJobsMessagesListCall {
 	c.urlParams_.Set("pageToken", pageToken)
 	return c
 }
 
 // StartTime sets the optional parameter "startTime": If specified,
-// return only messages with timestamps >= start_time. The default is
-// the job creation time (i.e. beginning of messages).
+// return only messages with timestamps >= start_time.
+// The default is the job creation time (i.e. beginning of messages).
 func (c *ProjectsLocationsJobsMessagesListCall) StartTime(startTime string) *ProjectsLocationsJobsMessagesListCall {
 	c.urlParams_.Set("startTime", startTime)
 	return c
@@ -7806,6 +8532,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7862,6 +8589,7 @@
 	return ret, nil
 	// {
 	//   "description": "Request the job status.",
+	//   "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/messages",
 	//   "httpMethod": "GET",
 	//   "id": "dataflow.projects.locations.jobs.messages.list",
 	//   "parameterOrder": [
@@ -7871,7 +8599,8 @@
 	//   ],
 	//   "parameters": {
 	//     "endTime": {
-	//       "description": "Return only messages with timestamps \u003c end_time. The default is now (i.e. return up to the latest messages available).",
+	//       "description": "Return only messages with timestamps \u003c end_time. The default is now\n(i.e. return up to the latest messages available).",
+	//       "format": "google-datetime",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -7901,13 +8630,13 @@
 	//       "type": "string"
 	//     },
 	//     "pageSize": {
-	//       "description": "If specified, determines the maximum number of messages to return. If unspecified, the service may choose an appropriate default, or may return an arbitrarily large number of results.",
+	//       "description": "If specified, determines the maximum number of messages to\nreturn.  If unspecified, the service may choose an appropriate\ndefault, or may return an arbitrarily large number of results.",
 	//       "format": "int32",
 	//       "location": "query",
 	//       "type": "integer"
 	//     },
 	//     "pageToken": {
-	//       "description": "If supplied, this should be the value of next_page_token returned by an earlier call. This will cause the next page of results to be returned.",
+	//       "description": "If supplied, this should be the value of next_page_token returned\nby an earlier call. This will cause the next page of results to\nbe returned.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -7918,7 +8647,8 @@
 	//       "type": "string"
 	//     },
 	//     "startTime": {
-	//       "description": "If specified, return only messages with timestamps \u003e= start_time. The default is the job creation time (i.e. beginning of messages).",
+	//       "description": "If specified, return only messages with timestamps \u003e= start_time.\nThe default is the job creation time (i.e. beginning of messages).",
+	//       "format": "google-datetime",
 	//       "location": "query",
 	//       "type": "string"
 	//     }
@@ -8010,6 +8740,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.leaseworkitemrequest)
 	if err != nil {
@@ -8068,6 +8799,7 @@
 	return ret, nil
 	// {
 	//   "description": "Leases a dataflow WorkItem to run.",
+	//   "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/workItems:lease",
 	//   "httpMethod": "POST",
 	//   "id": "dataflow.projects.locations.jobs.workItems.lease",
 	//   "parameterOrder": [
@@ -8165,6 +8897,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.reportworkitemstatusrequest)
 	if err != nil {
@@ -8223,6 +8956,7 @@
 	return ret, nil
 	// {
 	//   "description": "Reports the status of dataflow WorkItems leased by a worker.",
+	//   "flatPath": "v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/workItems:reportStatus",
 	//   "httpMethod": "POST",
 	//   "id": "dataflow.projects.locations.jobs.workItems.reportStatus",
 	//   "parameterOrder": [
@@ -8315,6 +9049,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.createjobfromtemplaterequest)
 	if err != nil {
@@ -8371,6 +9106,7 @@
 	return ret, nil
 	// {
 	//   "description": "Creates a Cloud Dataflow job from a template.",
+	//   "flatPath": "v1b3/projects/{projectId}/templates",
 	//   "httpMethod": "POST",
 	//   "id": "dataflow.projects.templates.create",
 	//   "parameterOrder": [
diff --git a/dataproc/v1/dataproc-api.json b/dataproc/v1/dataproc-api.json
index 0c6e38c..70f5dc9 100644
--- a/dataproc/v1/dataproc-api.json
+++ b/dataproc/v1/dataproc-api.json
@@ -1,1797 +1,1963 @@
 {
- "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/UWIx0i13luZLKjW6gmDu2evUqDA\"",
- "discoveryVersion": "v1",
- "id": "dataproc:v1",
- "name": "dataproc",
- "version": "v1",
- "revision": "20161102",
- "title": "Google Cloud Dataproc API",
- "description": "An API for managing Hadoop-based clusters and jobs on Google Cloud Platform.",
- "ownerDomain": "google.com",
- "ownerName": "Google",
- "icons": {
-  "x16": "http://www.google.com/images/icons/product/search-16.gif",
-  "x32": "http://www.google.com/images/icons/product/search-32.gif"
- },
- "documentationLink": "https://cloud.google.com/dataproc/",
- "protocol": "rest",
- "baseUrl": "https://dataproc.googleapis.com/",
- "basePath": "",
- "rootUrl": "https://dataproc.googleapis.com/",
- "servicePath": "",
- "batchPath": "batch",
- "parameters": {
-  "access_token": {
-   "type": "string",
-   "description": "OAuth access token.",
-   "location": "query"
-  },
-  "alt": {
-   "type": "string",
-   "description": "Data format for response.",
-   "default": "json",
-   "enumDescriptions": [
-    "Responses with Content-Type of application/json",
-    "Media download with context-dependent Content-Type",
-    "Responses with Content-Type of application/x-protobuf"
-   ],
-   "location": "query"
-  },
-  "bearer_token": {
-   "type": "string",
-   "description": "OAuth bearer token.",
-   "location": "query"
-  },
-  "callback": {
-   "type": "string",
-   "description": "JSONP",
-   "location": "query"
-  },
-  "fields": {
-   "type": "string",
-   "description": "Selector specifying which fields to include in a partial response.",
-   "location": "query"
-  },
-  "key": {
-   "type": "string",
-   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-   "location": "query"
-  },
-  "oauth_token": {
-   "type": "string",
-   "description": "OAuth 2.0 token for the current user.",
-   "location": "query"
-  },
-  "pp": {
-   "type": "boolean",
-   "description": "Pretty-print response.",
-   "default": "true",
-   "location": "query"
-  },
-  "prettyPrint": {
-   "type": "boolean",
-   "description": "Returns response with indentations and line breaks.",
-   "default": "true",
-   "location": "query"
-  },
-  "quotaUser": {
-   "type": "string",
-   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-   "location": "query"
-  },
-  "upload_protocol": {
-   "type": "string",
-   "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-   "location": "query"
-  },
-  "uploadType": {
-   "type": "string",
-   "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-   "location": "query"
-  },
-  "$.xgafv": {
-   "type": "string",
-   "description": "V1 error format.",
-   "enumDescriptions": [
-    "v1 error format",
-    "v2 error format"
-   ],
-   "location": "query"
-  }
- },
- "auth": {
-  "oauth2": {
-   "scopes": {
-    "https://www.googleapis.com/auth/cloud-platform": {
-     "description": "View and manage your data across Google Cloud Platform services"
-    }
-   }
-  }
- },
- "schemas": {
-  "Cluster": {
-   "id": "Cluster",
-   "type": "object",
-   "description": "Describes the identifying information, config, and status of a cluster of Google Compute Engine instances.",
-   "properties": {
-    "projectId": {
-     "type": "string",
-     "description": "[Required] The Google Cloud Platform project ID that the cluster belongs to."
-    },
-    "clusterName": {
-     "type": "string",
-     "description": "[Required] The cluster name. Cluster names within a project must be unique. Names of deleted clusters can be reused."
-    },
-    "config": {
-     "$ref": "ClusterConfig",
-     "description": "[Required] The cluster config. Note that Cloud Dataproc may set default values, and values may change when clusters are updated."
-    },
-    "labels": {
-     "type": "object",
-     "description": "[Optional] The labels to associate with this cluster. Label **keys** must contain 1 to 63 characters, and must conform to [RFC 1035](https://www.ietf.org/rfc/rfc1035.txt). Label **values** may be empty, but, if present, must contain 1 to 63 characters, and must conform to [RFC 1035](https://www.ietf.org/rfc/rfc1035.txt). No more than 32 labels can be associated with a cluster.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "status": {
-     "$ref": "ClusterStatus",
-     "description": "[Output-only] Cluster status."
-    },
-    "statusHistory": {
-     "type": "array",
-     "description": "[Output-only] The previous cluster status.",
-     "items": {
-      "$ref": "ClusterStatus"
-     }
-    },
-    "clusterUuid": {
-     "type": "string",
-     "description": "[Output-only] A cluster UUID (Unique Universal Identifier). Cloud Dataproc generates this value when it creates the cluster."
-    },
-    "metrics": {
-     "$ref": "ClusterMetrics",
-     "description": "Contains cluster daemon metrics such as HDFS and YARN stats. **Beta Feature**: This report is available for testing purposes only. It may be changed before final release."
-    }
-   }
-  },
-  "ClusterConfig": {
-   "id": "ClusterConfig",
-   "type": "object",
-   "description": "The cluster config.",
-   "properties": {
-    "configBucket": {
-     "type": "string",
-     "description": "[Optional] A Google Cloud Storage staging bucket used for sharing generated SSH keys and config. If you do not specify a staging bucket, Cloud Dataproc will determine an appropriate Cloud Storage location (US, ASIA, or EU) for your cluster's staging bucket according to the Google Compute Engine zone where your cluster is deployed, and then it will create and manage this project-level, per-location bucket for you."
-    },
-    "gceClusterConfig": {
-     "$ref": "GceClusterConfig",
-     "description": "[Required] The shared Google Compute Engine config settings for all instances in a cluster."
-    },
-    "masterConfig": {
-     "$ref": "InstanceGroupConfig",
-     "description": "[Optional] The Google Compute Engine config settings for the master instance in a cluster."
-    },
-    "workerConfig": {
-     "$ref": "InstanceGroupConfig",
-     "description": "[Optional] The Google Compute Engine config settings for worker instances in a cluster."
-    },
-    "secondaryWorkerConfig": {
-     "$ref": "InstanceGroupConfig",
-     "description": "[Optional] The Google Compute Engine config settings for additional worker instances in a cluster."
-    },
-    "softwareConfig": {
-     "$ref": "SoftwareConfig",
-     "description": "[Optional] The config settings for software inside the cluster."
-    },
-    "initializationActions": {
-     "type": "array",
-     "description": "[Optional] Commands to execute on each node after config is completed. By default, executables are run on master and all worker nodes. You can test a node's role metadata to run an executable on a master or worker node, as shown below using `curl` (you can also use `wget`): ROLE=$(curl -H Metadata-Flavor:Google http://metadata/computeMetadata/v1/instance/attributes/dataproc-role) if [[ \"${ROLE}\" == 'Master' ]]; then ... master specific actions ... else ... worker specific actions ... fi",
-     "items": {
-      "$ref": "NodeInitializationAction"
-     }
-    }
-   }
-  },
-  "GceClusterConfig": {
-   "id": "GceClusterConfig",
-   "type": "object",
-   "description": "Common config settings for resources of Google Compute Engine cluster instances, applicable to all instances in the cluster.",
-   "properties": {
-    "zoneUri": {
-     "type": "string",
-     "description": "[Required] The zone where the Google Compute Engine cluster will be located. Example: `https://www.googleapis.com/compute/v1/projects/[project_id]/zones/[zone]`."
-    },
-    "networkUri": {
-     "type": "string",
-     "description": "[Optional] The Google Compute Engine network to be used for machine communications. Cannot be specified with subnetwork_uri. If neither `network_uri` nor `subnetwork_uri` is specified, the \"default\" network of the project is used, if it exists. Cannot be a \"Custom Subnet Network\" (see [Using Subnetworks](/compute/docs/subnetworks) for more information). Example: `https://www.googleapis.com/compute/v1/projects/[project_id]/regions/global/default`."
-    },
-    "subnetworkUri": {
-     "type": "string",
-     "description": "[Optional] The Google Compute Engine subnetwork to be used for machine communications. Cannot be specified with network_uri. Example: `https://www.googleapis.com/compute/v1/projects/[project_id]/regions/us-east1/sub0`."
-    },
-    "internalIpOnly": {
-     "type": "boolean",
-     "description": "[Optional] If true, all instances in the cluster will only have internal IP addresses. By default, clusters are not restricted to internal IP addresses, and will have ephemeral external IP addresses assigned to each instance. This `internal_ip_only` restriction can only be enabled for subnetwork enabled networks, and all off-cluster dependencies must be configured to be accessible without external IP addresses."
-    },
-    "serviceAccountScopes": {
-     "type": "array",
-     "description": "[Optional] The URIs of service account scopes to be included in Google Compute Engine instances. The following base set of scopes is always included: * https://www.googleapis.com/auth/cloud.useraccounts.readonly * https://www.googleapis.com/auth/devstorage.read_write * https://www.googleapis.com/auth/logging.write If no scopes are specified, the following defaults are also provided: * https://www.googleapis.com/auth/bigquery * https://www.googleapis.com/auth/bigtable.admin.table * https://www.googleapis.com/auth/bigtable.data * https://www.googleapis.com/auth/devstorage.full_control",
-     "items": {
-      "type": "string"
-     }
-    },
-    "tags": {
-     "type": "array",
-     "description": "The Google Compute Engine tags to add to all instances (see [Tagging instances](/compute/docs/label-or-tag-resources#tags)).",
-     "items": {
-      "type": "string"
-     }
-    },
-    "metadata": {
-     "type": "object",
-     "description": "The Google Compute Engine metadata entries to add to all instances (see [Project and instance metadata](https://cloud.google.com/compute/docs/storing-retrieving-metadata#project_and_instance_metadata)).",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "InstanceGroupConfig": {
-   "id": "InstanceGroupConfig",
-   "type": "object",
-   "description": "[Optional] The config settings for Google Compute Engine resources in an instance group, such as a master or worker group.",
-   "properties": {
-    "numInstances": {
-     "type": "integer",
-     "description": "[Required] The number of VM instances in the instance group. For master instance groups, must be set to 1.",
-     "format": "int32"
-    },
-    "instanceNames": {
-     "type": "array",
-     "description": "[Optional] The list of instance names. Cloud Dataproc derives the names from `cluster_name`, `num_instances`, and the instance group if not set by user (recommended practice is to let Cloud Dataproc derive the name).",
-     "items": {
-      "type": "string"
-     }
-    },
-    "imageUri": {
-     "type": "string",
-     "description": "[Output-only] The Google Compute Engine image resource used for cluster instances. Inferred from `SoftwareConfig.image_version`."
-    },
-    "machineTypeUri": {
-     "type": "string",
-     "description": "[Required] The Google Compute Engine machine type used for cluster instances. Example: `https://www.googleapis.com/compute/v1/projects/[project_id]/zones/us-east1-a/machineTypes/n1-standard-2`."
-    },
-    "diskConfig": {
-     "$ref": "DiskConfig",
-     "description": "[Optional] Disk option config settings."
-    },
-    "isPreemptible": {
-     "type": "boolean",
-     "description": "[Optional] Specifies that this instance group contains preemptible instances."
-    },
-    "managedGroupConfig": {
-     "$ref": "ManagedGroupConfig",
-     "description": "[Output-only] The config for Google Compute Engine Instance Group Manager that manages this group. This is only used for preemptible instance groups."
-    }
-   }
-  },
-  "DiskConfig": {
-   "id": "DiskConfig",
-   "type": "object",
-   "description": "Specifies the config of disk options for a group of VM instances.",
-   "properties": {
-    "bootDiskSizeGb": {
-     "type": "integer",
-     "description": "[Optional] Size in GB of the boot disk (default is 500GB).",
-     "format": "int32"
-    },
-    "numLocalSsds": {
-     "type": "integer",
-     "description": "[Optional] Number of attached SSDs, from 0 to 4 (default is 0). If SSDs are not attached, the boot disk is used to store runtime logs and [HDFS](https://hadoop.apache.org/docs/r1.2.1/hdfs_user_guide.html) data. If one or more SSDs are attached, this runtime bulk data is spread across them, and the boot disk contains only basic config and installed binaries.",
-     "format": "int32"
-    }
-   }
-  },
-  "ManagedGroupConfig": {
-   "id": "ManagedGroupConfig",
-   "type": "object",
-   "description": "Specifies the resources used to actively manage an instance group.",
-   "properties": {
-    "instanceTemplateName": {
-     "type": "string",
-     "description": "[Output-only] The name of the Instance Template used for the Managed Instance Group."
-    },
-    "instanceGroupManagerName": {
-     "type": "string",
-     "description": "[Output-only] The name of the Instance Group Manager for this group."
-    }
-   }
-  },
-  "SoftwareConfig": {
-   "id": "SoftwareConfig",
-   "type": "object",
-   "description": "Specifies the selection and config of software inside the cluster.",
-   "properties": {
-    "imageVersion": {
-     "type": "string",
-     "description": "[Optional] The version of software inside the cluster. It must match the regular expression `[0-9]+\\.[0-9]+`. If unspecified, it defaults to the latest version (see [Cloud Dataproc Versioning](/dataproc/versioning))."
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] The properties to set on daemon config files. Property keys are specified in `prefix:property` format, such as `core:fs.defaultFS`. The following are supported prefixes and their mappings: * core: `core-site.xml` * hdfs: `hdfs-site.xml` * mapred: `mapred-site.xml` * yarn: `yarn-site.xml` * hive: `hive-site.xml` * pig: `pig.properties` * spark: `spark-defaults.conf`",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "NodeInitializationAction": {
-   "id": "NodeInitializationAction",
-   "type": "object",
-   "description": "Specifies an executable to run on a fully configured node and a timeout period for executable completion.",
-   "properties": {
-    "executableFile": {
-     "type": "string",
-     "description": "[Required] Google Cloud Storage URI of executable file."
-    },
-    "executionTimeout": {
-     "type": "string",
-     "description": "[Optional] Amount of time executable has to complete. Default is 10 minutes. Cluster creation fails with an explanatory error message (the name of the executable that caused the error and the exceeded timeout period) if the executable is not completed at end of the timeout period."
-    }
-   }
-  },
-  "ClusterStatus": {
-   "id": "ClusterStatus",
-   "type": "object",
-   "description": "The status of a cluster and its instances.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "[Output-only] The cluster's state.",
-     "enum": [
-      "UNKNOWN",
-      "CREATING",
-      "RUNNING",
-      "ERROR",
-      "DELETING",
-      "UPDATING"
-     ]
-    },
-    "detail": {
-     "type": "string",
-     "description": "[Output-only] Optional details of cluster's state."
-    },
-    "stateStartTime": {
-     "type": "string",
-     "description": "[Output-only] Time when this state was entered."
-    }
-   }
-  },
-  "ClusterMetrics": {
-   "id": "ClusterMetrics",
-   "type": "object",
-   "description": "Contains cluster daemon metrics, such as HDFS and YARN stats. **Beta Feature**: This report is available for testing purposes only. It may be changed before final release.",
-   "properties": {
-    "hdfsMetrics": {
-     "type": "object",
-     "description": "The HDFS metrics.",
-     "additionalProperties": {
-      "type": "string",
-      "format": "int64"
-     }
-    },
-    "yarnMetrics": {
-     "type": "object",
-     "description": "The YARN metrics.",
-     "additionalProperties": {
-      "type": "string",
-      "format": "int64"
-     }
-    }
-   }
-  },
-  "Operation": {
-   "id": "Operation",
-   "type": "object",
-   "description": "This resource represents a long-running operation that is the result of a network API call.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should have the format of `operations/some/unique/name`."
-    },
-    "metadata": {
-     "type": "object",
-     "description": "Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object. Contains field @type with type URL."
-     }
-    },
-    "done": {
-     "type": "boolean",
-     "description": "If the value is `false`, it means the operation is still in progress. If true, the operation is completed, and either `error` or `response` is available."
-    },
-    "error": {
-     "$ref": "Status",
-     "description": "The error result of the operation in case of failure or cancellation."
-    },
-    "response": {
-     "type": "object",
-     "description": "The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object. Contains field @type with type URL."
-     }
-    }
-   }
-  },
-  "Status": {
-   "id": "Status",
-   "type": "object",
-   "description": "The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). The error model is designed to be: - Simple to use and understand for most users - Flexible enough to meet unexpected needs # Overview The `Status` message contains three pieces of data: error code, error message, and error details. The error code should be an enum value of google.rpc.Code, but it may accept additional error codes if needed. The error message should be a developer-facing English message that helps developers *understand* and *resolve* the error. If a localized user-facing error message is needed, put the localized message in the error details or localize it in the client. The optional error details may contain arbitrary information about the error. There is a predefined set of error detail types in the package `google.rpc` which can be used for common error conditions. # Language mapping The `Status` message is the logical representation of the error model, but it is not necessarily the actual wire format. When the `Status` message is exposed in different client libraries and different wire protocols, it can be mapped differently. For example, it will likely be mapped to some exceptions in Java, but more likely mapped to some error codes in C. # Other uses The error model and the `Status` message can be used in a variety of environments, either with or without APIs, to provide a consistent developer experience across different environments. Example uses of this error model include: - Partial errors. If a service needs to return partial errors to the client, it may embed the `Status` in the normal response to indicate the partial errors. - Workflow errors. A typical workflow has multiple steps. Each step may have a `Status` message for error reporting purpose. - Batch operations. If a client uses batch request and batch response, the `Status` message should be used directly inside batch response, one for each error sub-response. - Asynchronous operations. If an API call embeds asynchronous operation results in its response, the status of those operations should be represented directly using the `Status` message. - Logging. If some API errors are stored in logs, the message `Status` could be used directly after any stripping needed for security/privacy reasons.",
-   "properties": {
-    "code": {
-     "type": "integer",
-     "description": "The status code, which should be an enum value of google.rpc.Code.",
-     "format": "int32"
-    },
-    "message": {
-     "type": "string",
-     "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client."
-    },
-    "details": {
-     "type": "array",
-     "description": "A list of messages that carry the error details. There will be a common set of message types for APIs to use.",
-     "items": {
-      "type": "object",
-      "additionalProperties": {
-       "type": "any",
-       "description": "Properties of the object. Contains field @type with type URL."
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
       }
-     }
     }
-   }
   },
-  "ListClustersResponse": {
-   "id": "ListClustersResponse",
-   "type": "object",
-   "description": "The list of all clusters in a project.",
-   "properties": {
-    "clusters": {
-     "type": "array",
-     "description": "[Output-only] The clusters in the project.",
-     "items": {
-      "$ref": "Cluster"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "[Output-only] This token is included in the response if there are more results to fetch. To fetch additional results, provide this value as the `page_token` in a subsequent ListClustersRequest."
+  "servicePath": "",
+  "description": "Manages Hadoop-based clusters and jobs on Google Cloud Platform.",
+  "kind": "discovery#restDescription",
+  "rootUrl": "https://dataproc.googleapis.com/",
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "dataproc",
+  "batchPath": "batch",
+  "id": "dataproc:v1",
+  "documentationLink": "https://cloud.google.com/dataproc/",
+  "revision": "20170207",
+  "title": "Google Cloud Dataproc API",
+  "ownerName": "Google",
+  "discoveryVersion": "v1",
+  "resources": {
+    "projects": {
+      "resources": {
+        "regions": {
+          "resources": {
+            "operations": {
+              "methods": {
+                "cancel": {
+                  "httpMethod": "POST",
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "response": {
+                    "$ref": "Empty"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "description": "The name of the operation resource to be cancelled.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/regions/[^/]+/operations/[^/]+$",
+                      "location": "path"
+                    }
+                  },
+                  "flatPath": "v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:cancel",
+                  "id": "dataproc.projects.regions.operations.cancel",
+                  "path": "v1/{+name}:cancel",
+                  "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns google.rpc.Code.UNIMPLEMENTED. Clients can use Operations.GetOperation or other methods to check whether the cancellation succeeded or whether the operation completed despite cancellation. On successful cancellation, the operation is not deleted; instead, it becomes an operation with an Operation.error value with a google.rpc.Status.code of 1, corresponding to Code.CANCELLED."
+                },
+                "delete": {
+                  "description": "Deletes a long-running operation. This method indicates that the client is no longer interested in the operation result. It does not cancel the operation. If the server doesn't support this method, it returns google.rpc.Code.UNIMPLEMENTED.",
+                  "httpMethod": "DELETE",
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "response": {
+                    "$ref": "Empty"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "pattern": "^projects/[^/]+/regions/[^/]+/operations/[^/]+$",
+                      "location": "path",
+                      "description": "The name of the operation resource to be deleted.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}",
+                  "id": "dataproc.projects.regions.operations.delete",
+                  "path": "v1/{+name}"
+                },
+                "list": {
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "response": {
+                    "$ref": "ListOperationsResponse"
+                  },
+                  "httpMethod": "GET",
+                  "parameters": {
+                    "name": {
+                      "pattern": "^projects/[^/]+/regions/[^/]+/operations$",
+                      "location": "path",
+                      "description": "The name of the operation collection.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "pageToken": {
+                      "location": "query",
+                      "description": "The standard list page token.",
+                      "type": "string"
+                    },
+                    "pageSize": {
+                      "location": "query",
+                      "description": "The standard list page size.",
+                      "format": "int32",
+                      "type": "integer"
+                    },
+                    "filter": {
+                      "description": "The standard list filter.",
+                      "type": "string",
+                      "location": "query"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1/projects/{projectsId}/regions/{regionsId}/operations",
+                  "path": "v1/{+name}",
+                  "id": "dataproc.projects.regions.operations.list",
+                  "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns UNIMPLEMENTED.NOTE: the name binding below allows API services to override the binding to use different resource name schemes, such as users/*/operations."
+                },
+                "get": {
+                  "parameters": {
+                    "name": {
+                      "pattern": "^projects/[^/]+/regions/[^/]+/operations/[^/]+$",
+                      "location": "path",
+                      "description": "The name of the operation resource.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}",
+                  "id": "dataproc.projects.regions.operations.get",
+                  "path": "v1/{+name}",
+                  "description": "Gets the latest state of a long-running operation. Clients can use this method to poll the operation result at intervals as recommended by the API service.",
+                  "httpMethod": "GET",
+                  "response": {
+                    "$ref": "Operation"
+                  },
+                  "parameterOrder": [
+                    "name"
+                  ]
+                }
+              }
+            },
+            "jobs": {
+              "methods": {
+                "submit": {
+                  "id": "dataproc.projects.regions.jobs.submit",
+                  "path": "v1/projects/{projectId}/regions/{region}/jobs:submit",
+                  "description": "Submits a job to a cluster.",
+                  "request": {
+                    "$ref": "SubmitJobRequest"
+                  },
+                  "httpMethod": "POST",
+                  "parameterOrder": [
+                    "projectId",
+                    "region"
+                  ],
+                  "response": {
+                    "$ref": "Job"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "region": {
+                      "location": "path",
+                      "description": "Required The Cloud Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1/projects/{projectId}/regions/{region}/jobs:submit"
+                },
+                "delete": {
+                  "path": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}",
+                  "id": "dataproc.projects.regions.jobs.delete",
+                  "description": "Deletes the job from the project. If the job is active, the delete fails, and the response returns FAILED_PRECONDITION.",
+                  "response": {
+                    "$ref": "Empty"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "jobId"
+                  ],
+                  "httpMethod": "DELETE",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "projectId": {
+                      "location": "path",
+                      "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "jobId": {
+                      "description": "Required The job ID.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "region": {
+                      "location": "path",
+                      "description": "Required The Cloud Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}"
+                },
+                "list": {
+                  "path": "v1/projects/{projectId}/regions/{region}/jobs",
+                  "id": "dataproc.projects.regions.jobs.list",
+                  "description": "Lists regions/{region}/jobs in a project.",
+                  "response": {
+                    "$ref": "ListJobsResponse"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region"
+                  ],
+                  "httpMethod": "GET",
+                  "parameters": {
+                    "clusterName": {
+                      "location": "query",
+                      "description": "Optional If set, the returned jobs list includes only jobs that were submitted to the named cluster.",
+                      "type": "string"
+                    },
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "filter": {
+                      "location": "query",
+                      "description": "Optional A filter constraining the jobs to list. Filters are case-sensitive and have the following syntax:field = value AND field = value ...where field is status.state or labels.[KEY], and [KEY] is a label key. value can be * to match all values. status.state can be either ACTIVE or INACTIVE. Only the logical AND operator is supported; space-separated items are treated as having an implicit AND operator.Example filter:status.state = ACTIVE AND labels.env = staging AND labels.starred = *",
+                      "type": "string"
+                    },
+                    "jobStateMatcher": {
+                      "description": "Optional Specifies enumerated categories of jobs to list (default = match ALL jobs).",
+                      "type": "string",
+                      "location": "query",
+                      "enum": [
+                        "ALL",
+                        "ACTIVE",
+                        "NON_ACTIVE"
+                      ]
+                    },
+                    "pageToken": {
+                      "location": "query",
+                      "description": "Optional The page token, returned by a previous call, to request the next page of results.",
+                      "type": "string"
+                    },
+                    "pageSize": {
+                      "location": "query",
+                      "description": "Optional The number of results to return in each response.",
+                      "format": "int32",
+                      "type": "integer"
+                    },
+                    "region": {
+                      "description": "Required The Cloud Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1/projects/{projectId}/regions/{region}/jobs"
+                },
+                "cancel": {
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "region": {
+                      "location": "path",
+                      "description": "Required The Cloud Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "projectId": {
+                      "location": "path",
+                      "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "jobId": {
+                      "location": "path",
+                      "description": "Required The job ID.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}:cancel",
+                  "path": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}:cancel",
+                  "id": "dataproc.projects.regions.jobs.cancel",
+                  "description": "Starts a job cancellation request. To access the job resource after cancellation, call regions/{region}/jobs.list or regions/{region}/jobs.get.",
+                  "request": {
+                    "$ref": "CancelJobRequest"
+                  },
+                  "response": {
+                    "$ref": "Job"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "jobId"
+                  ],
+                  "httpMethod": "POST"
+                },
+                "get": {
+                  "response": {
+                    "$ref": "Job"
+                  },
+                  "httpMethod": "GET",
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "jobId"
+                  ],
+                  "parameters": {
+                    "region": {
+                      "description": "Required The Cloud Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "projectId": {
+                      "location": "path",
+                      "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "jobId": {
+                      "description": "Required The job ID.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}",
+                  "path": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}",
+                  "id": "dataproc.projects.regions.jobs.get",
+                  "description": "Gets the resource representation for a job in a project."
+                },
+                "patch": {
+                  "id": "dataproc.projects.regions.jobs.patch",
+                  "path": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}",
+                  "request": {
+                    "$ref": "Job"
+                  },
+                  "description": "Updates a job in a project.",
+                  "httpMethod": "PATCH",
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "jobId"
+                  ],
+                  "response": {
+                    "$ref": "Job"
+                  },
+                  "parameters": {
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "jobId": {
+                      "description": "Required The job ID.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "region": {
+                      "description": "Required The Cloud Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "updateMask": {
+                      "location": "query",
+                      "description": "Required Specifies the path, relative to \u003ccode\u003eJob\u003c/code\u003e, of the field to update. For example, to update the labels of a Job the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be specified as \u003ccode\u003elabels\u003c/code\u003e, and the PATCH request body would specify the new value. \u003cstrong\u003eNote:\u003c/strong\u003e Currently, \u003ccode\u003elabels\u003c/code\u003e is the only field that can be updated.",
+                      "format": "google-fieldmask",
+                      "type": "string"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}"
+                }
+              }
+            },
+            "clusters": {
+              "methods": {
+                "diagnose": {
+                  "description": "Gets cluster diagnostic information. After the operation completes, the Operation.response field contains DiagnoseClusterOutputLocation.",
+                  "request": {
+                    "$ref": "DiagnoseClusterRequest"
+                  },
+                  "response": {
+                    "$ref": "Operation"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "clusterName"
+                  ],
+                  "httpMethod": "POST",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "clusterName": {
+                      "location": "path",
+                      "description": "Required The cluster name.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "region": {
+                      "description": "Required The Cloud Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "flatPath": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}:diagnose",
+                  "path": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}:diagnose",
+                  "id": "dataproc.projects.regions.clusters.diagnose"
+                },
+                "delete": {
+                  "parameters": {
+                    "clusterName": {
+                      "location": "path",
+                      "description": "Required The cluster name.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "projectId": {
+                      "location": "path",
+                      "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "region": {
+                      "description": "Required The Cloud Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
+                  "path": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
+                  "id": "dataproc.projects.regions.clusters.delete",
+                  "description": "Deletes a cluster in a project.",
+                  "response": {
+                    "$ref": "Operation"
+                  },
+                  "httpMethod": "DELETE",
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "clusterName"
+                  ]
+                },
+                "list": {
+                  "description": "Lists all regions/{region}/clusters in a project.",
+                  "httpMethod": "GET",
+                  "parameterOrder": [
+                    "projectId",
+                    "region"
+                  ],
+                  "response": {
+                    "$ref": "ListClustersResponse"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "pageToken": {
+                      "location": "query",
+                      "description": "Optional The standard List page token.",
+                      "type": "string"
+                    },
+                    "pageSize": {
+                      "description": "Optional The standard List page size.",
+                      "format": "int32",
+                      "type": "integer",
+                      "location": "query"
+                    },
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "region": {
+                      "location": "path",
+                      "description": "Required The Cloud Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "filter": {
+                      "location": "query",
+                      "description": "Optional A filter constraining the clusters to list. Filters are case-sensitive and have the following syntax:field = value AND field = value ...where field is one of status.state, clusterName, or labels.[KEY], and [KEY] is a label key. value can be * to match all values. status.state can be one of the following: ACTIVE, INACTIVE, CREATING, RUNNING, ERROR, DELETING, or UPDATING. ACTIVE contains the CREATING, UPDATING, and RUNNING states. INACTIVE contains the DELETING and ERROR states. clusterName is the name of the cluster provided at creation time. Only the logical AND operator is supported; space-separated items are treated as having an implicit AND operator.Example filter:status.state = ACTIVE AND clusterName = mycluster AND labels.env = staging AND labels.starred = *",
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1/projects/{projectId}/regions/{region}/clusters",
+                  "id": "dataproc.projects.regions.clusters.list",
+                  "path": "v1/projects/{projectId}/regions/{region}/clusters"
+                },
+                "create": {
+                  "description": "Creates a cluster in a project.",
+                  "request": {
+                    "$ref": "Cluster"
+                  },
+                  "response": {
+                    "$ref": "Operation"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region"
+                  ],
+                  "httpMethod": "POST",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "region": {
+                      "location": "path",
+                      "description": "Required The Cloud Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "projectId": {
+                      "location": "path",
+                      "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1/projects/{projectId}/regions/{region}/clusters",
+                  "path": "v1/projects/{projectId}/regions/{region}/clusters",
+                  "id": "dataproc.projects.regions.clusters.create"
+                },
+                "get": {
+                  "parameters": {
+                    "clusterName": {
+                      "description": "Required The cluster name.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "region": {
+                      "description": "Required The Cloud Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
+                  "path": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
+                  "id": "dataproc.projects.regions.clusters.get",
+                  "description": "Gets the resource representation for a cluster in a project.",
+                  "response": {
+                    "$ref": "Cluster"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "clusterName"
+                  ],
+                  "httpMethod": "GET"
+                },
+                "patch": {
+                  "httpMethod": "PATCH",
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "clusterName"
+                  ],
+                  "response": {
+                    "$ref": "Operation"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "region": {
+                      "location": "path",
+                      "description": "Required The Cloud Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "updateMask": {
+                      "description": "Required Specifies the path, relative to \u003ccode\u003eCluster\u003c/code\u003e, of the field to update. For example, to change the number of workers in a cluster to 5, the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be specified as \u003ccode\u003econfig.worker_config.num_instances\u003c/code\u003e, and the PATCH request body would specify the new value, as follows:\n{\n  \"config\":{\n    \"workerConfig\":{\n      \"numInstances\":\"5\"\n    }\n  }\n}\nSimilarly, to change the number of preemptible workers in a cluster to 5, the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be \u003ccode\u003econfig.secondary_worker_config.num_instances\u003c/code\u003e, and the PATCH request body would be set as follows:\n{\n  \"config\":{\n    \"secondaryWorkerConfig\":{\n      \"numInstances\":\"5\"\n    }\n  }\n}\n\u003cstrong\u003eNote:\u003c/strong\u003e Currently, \u003ccode\u003econfig.worker_config.num_instances\u003c/code\u003e and \u003ccode\u003econfig.secondary_worker_config.num_instances\u003c/code\u003e are the only fields that can be updated.",
+                      "format": "google-fieldmask",
+                      "type": "string",
+                      "location": "query"
+                    },
+                    "clusterName": {
+                      "location": "path",
+                      "description": "Required The cluster name.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project the cluster belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "flatPath": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
+                  "id": "dataproc.projects.regions.clusters.patch",
+                  "path": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
+                  "description": "Updates a cluster in a project.",
+                  "request": {
+                    "$ref": "Cluster"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
     }
-   }
   },
-  "DiagnoseClusterRequest": {
-   "id": "DiagnoseClusterRequest",
-   "type": "object",
-   "description": "A request to collect cluster diagnostic information."
-  },
-  "SubmitJobRequest": {
-   "id": "SubmitJobRequest",
-   "type": "object",
-   "description": "A request to submit a job.",
-   "properties": {
-    "job": {
-     "$ref": "Job",
-     "description": "[Required] The job resource."
-    }
-   }
-  },
-  "Job": {
-   "id": "Job",
-   "type": "object",
-   "description": "A Cloud Dataproc job resource.",
-   "properties": {
-    "reference": {
-     "$ref": "JobReference",
-     "description": "[Optional] The fully qualified reference to the job, which can be used to obtain the equivalent REST path of the job resource. If this property is not specified when a job is created, the server generates a job_id."
-    },
-    "placement": {
-     "$ref": "JobPlacement",
-     "description": "[Required] Job information, including how, when, and where to run the job."
-    },
-    "hadoopJob": {
-     "$ref": "HadoopJob",
-     "description": "Job is a Hadoop job."
-    },
-    "sparkJob": {
-     "$ref": "SparkJob",
-     "description": "Job is a Spark job."
-    },
-    "pysparkJob": {
-     "$ref": "PySparkJob",
-     "description": "Job is a Pyspark job."
-    },
-    "hiveJob": {
-     "$ref": "HiveJob",
-     "description": "Job is a Hive job."
-    },
-    "pigJob": {
-     "$ref": "PigJob",
-     "description": "Job is a Pig job."
-    },
-    "sparkSqlJob": {
-     "$ref": "SparkSqlJob",
-     "description": "Job is a SparkSql job."
-    },
-    "status": {
-     "$ref": "JobStatus",
-     "description": "[Output-only] The job status. Additional application-specific status information may be contained in the type_job and yarn_applications fields."
-    },
-    "statusHistory": {
-     "type": "array",
-     "description": "[Output-only] The previous job status.",
-     "items": {
-      "$ref": "JobStatus"
-     }
-    },
-    "yarnApplications": {
-     "type": "array",
-     "description": "[Output-only] The collection of YARN applications spun up by this job. **Beta** Feature: This report is available for testing purposes only. It may be changed before final release.",
-     "items": {
-      "$ref": "YarnApplication"
-     }
-    },
-    "driverOutputResourceUri": {
-     "type": "string",
-     "description": "[Output-only] A URI pointing to the location of the stdout of the job's driver program."
-    },
-    "driverControlFilesUri": {
-     "type": "string",
-     "description": "[Output-only] If present, the location of miscellaneous control files which may be used as part of job setup and handling. If not present, control files may be placed in the same location as `driver_output_uri`."
-    },
-    "labels": {
-     "type": "object",
-     "description": "[Optional] The labels to associate with this job. Label **keys** must contain 1 to 63 characters, and must conform to [RFC 1035](https://www.ietf.org/rfc/rfc1035.txt). Label **values** may be empty, but, if present, must contain 1 to 63 characters, and must conform to [RFC 1035](https://www.ietf.org/rfc/rfc1035.txt). No more than 32 labels can be associated with a job.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "JobReference": {
-   "id": "JobReference",
-   "type": "object",
-   "description": "Encapsulates the full scoping used to reference a job.",
-   "properties": {
-    "projectId": {
-     "type": "string",
-     "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to."
-    },
-    "jobId": {
-     "type": "string",
-     "description": "[Optional] The job ID, which must be unique within the project. The job ID is generated by the server upon job submission or provided by the user as a means to perform retries without creating duplicate jobs. The ID must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), or hyphens (-). The maximum length is 512 characters."
-    }
-   }
-  },
-  "JobPlacement": {
-   "id": "JobPlacement",
-   "type": "object",
-   "description": "Cloud Dataproc job config.",
-   "properties": {
-    "clusterName": {
-     "type": "string",
-     "description": "[Required] The name of the cluster where the job will be submitted."
-    },
-    "clusterUuid": {
-     "type": "string",
-     "description": "[Output-only] A cluster UUID generated by the Cloud Dataproc service when the job is submitted."
-    }
-   }
-  },
-  "HadoopJob": {
-   "id": "HadoopJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running [Apache Hadoop MapReduce](https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html) jobs on [Apache Hadoop YARN](https://hadoop.apache.org/docs/r2.7.1/hadoop-yarn/hadoop-yarn-site/YARN.html).",
-   "properties": {
-    "mainJarFileUri": {
-     "type": "string",
-     "description": "The HCFS URI of the jar file containing the main class. Examples: 'gs://foo-bucket/analytics-binaries/extract-useful-metrics-mr.jar' 'hdfs:/tmp/test-samples/custom-wordcount.jar' 'file:///home/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar'"
-    },
-    "mainClass": {
-     "type": "string",
-     "description": "The name of the driver's main class. The jar file containing the class must be in the default CLASSPATH or specified in `jar_file_uris`."
-    },
-    "args": {
-     "type": "array",
-     "description": "[Optional] The arguments to pass to the driver. Do not include arguments, such as `-libjars` or `-Dfoo=bar`, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] Jar file URIs to add to the CLASSPATHs of the Hadoop driver and tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "fileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS (Hadoop Compatible Filesystem) URIs of files to be copied to the working directory of Hadoop drivers and distributed tasks. Useful for naively parallel tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "archiveUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of archives to be extracted in the working directory of Hadoop drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, or .zip.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure Hadoop. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "loggingConfig": {
-     "$ref": "LoggingConfig",
-     "description": "[Optional] The runtime log config for job execution."
-    }
-   }
-  },
-  "LoggingConfig": {
-   "id": "LoggingConfig",
-   "type": "object",
-   "description": "The runtime logging config of the job.",
-   "properties": {
-    "driverLogLevels": {
-     "type": "object",
-     "description": "The per-package log levels for the driver. This may include \"root\" package name to configure rootLogger. Examples: 'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'",
-     "additionalProperties": {
+  "parameters": {
+    "bearer_token": {
+      "description": "OAuth bearer token.",
       "type": "string",
+      "location": "query"
+    },
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
+    },
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "prettyPrint": {
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string",
+      "location": "query"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
       "enum": [
-       "LEVEL_UNSPECIFIED",
-       "ALL",
-       "TRACE",
-       "DEBUG",
-       "INFO",
-       "WARN",
-       "ERROR",
-       "FATAL",
-       "OFF"
-      ]
-     }
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "alt": {
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string",
+      "location": "query"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string",
+      "location": "query"
+    },
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
     }
-   }
   },
-  "SparkJob": {
-   "id": "SparkJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running [Apache Spark](http://spark.apache.org/) applications on YARN.",
-   "properties": {
-    "mainJarFileUri": {
-     "type": "string",
-     "description": "The HCFS URI of the jar file that contains the main class."
-    },
-    "mainClass": {
-     "type": "string",
-     "description": "The name of the driver's main class. The jar file that contains the class must be in the default CLASSPATH or specified in `jar_file_uris`."
-    },
-    "args": {
-     "type": "array",
-     "description": "[Optional] The arguments to pass to the driver. Do not include arguments, such as `--conf`, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to add to the CLASSPATHs of the Spark driver and tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "fileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of files to be copied to the working directory of Spark drivers and distributed tasks. Useful for naively parallel tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "archiveUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of archives to be extracted in the working directory of Spark drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, and .zip.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure Spark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "loggingConfig": {
-     "$ref": "LoggingConfig",
-     "description": "[Optional] The runtime log config for job execution."
-    }
-   }
-  },
-  "PySparkJob": {
-   "id": "PySparkJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running [Apache PySpark](https://spark.apache.org/docs/0.9.0/python-programming-guide.html) applications on YARN.",
-   "properties": {
-    "mainPythonFileUri": {
-     "type": "string",
-     "description": "[Required] The HCFS URI of the main Python file to use as the driver. Must be a .py file."
-    },
-    "args": {
-     "type": "array",
-     "description": "[Optional] The arguments to pass to the driver. Do not include arguments, such as `--conf`, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "pythonFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS file URIs of Python files to pass to the PySpark framework. Supported file types: .py, .egg, and .zip.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to add to the CLASSPATHs of the Python driver and tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "fileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of files to be copied to the working directory of Python drivers and distributed tasks. Useful for naively parallel tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "archiveUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of archives to be extracted in the working directory of .jar, .tar, .tar.gz, .tgz, and .zip.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure PySpark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "loggingConfig": {
-     "$ref": "LoggingConfig",
-     "description": "[Optional] The runtime log config for job execution."
-    }
-   }
-  },
-  "HiveJob": {
-   "id": "HiveJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running [Apache Hive](https://hive.apache.org/) queries on YARN.",
-   "properties": {
-    "queryFileUri": {
-     "type": "string",
-     "description": "The HCFS URI of the script that contains Hive queries."
-    },
-    "queryList": {
-     "$ref": "QueryList",
-     "description": "A list of queries."
-    },
-    "continueOnFailure": {
-     "type": "boolean",
-     "description": "[Optional] Whether to continue executing queries if a query fails. The default value is `false`. Setting to `true` can be useful when executing independent parallel queries."
-    },
-    "scriptVariables": {
-     "type": "object",
-     "description": "[Optional] Mapping of query variable names to values (equivalent to the Hive command: `SET name=\"value\";`).",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names and values, used to configure Hive. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/hive/conf/hive-site.xml, and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to add to the CLASSPATH of the Hive server and Hadoop MapReduce (MR) tasks. Can contain Hive SerDes and UDFs.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "QueryList": {
-   "id": "QueryList",
-   "type": "object",
-   "description": "A list of queries to run on a cluster.",
-   "properties": {
-    "queries": {
-     "type": "array",
-     "description": "[Required] The queries to execute. You do not need to terminate a query with a semicolon. Multiple queries can be specified in one string by separating each with a semicolon. Here is an example of an Cloud Dataproc API snippet that uses a QueryList to specify a HiveJob: \"hiveJob\": { \"queryList\": { \"queries\": [ \"query1\", \"query2\", \"query3;query4\", ] } }",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "PigJob": {
-   "id": "PigJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running [Apache Pig](https://pig.apache.org/) queries on YARN.",
-   "properties": {
-    "queryFileUri": {
-     "type": "string",
-     "description": "The HCFS URI of the script that contains the Pig queries."
-    },
-    "queryList": {
-     "$ref": "QueryList",
-     "description": "A list of queries."
-    },
-    "continueOnFailure": {
-     "type": "boolean",
-     "description": "[Optional] Whether to continue executing queries if a query fails. The default value is `false`. Setting to `true` can be useful when executing independent parallel queries."
-    },
-    "scriptVariables": {
-     "type": "object",
-     "description": "[Optional] Mapping of query variable names to values (equivalent to the Pig command: `name=[value]`).",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure Pig. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/pig/conf/pig.properties, and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to add to the CLASSPATH of the Pig Client and Hadoop MapReduce (MR) tasks. Can contain Pig UDFs.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "loggingConfig": {
-     "$ref": "LoggingConfig",
-     "description": "[Optional] The runtime log config for job execution."
-    }
-   }
-  },
-  "SparkSqlJob": {
-   "id": "SparkSqlJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running [Apache Spark SQL](http://spark.apache.org/sql/) queries.",
-   "properties": {
-    "queryFileUri": {
-     "type": "string",
-     "description": "The HCFS URI of the script that contains SQL queries."
-    },
-    "queryList": {
-     "$ref": "QueryList",
-     "description": "A list of queries."
-    },
-    "scriptVariables": {
-     "type": "object",
-     "description": "[Optional] Mapping of query variable names to values (equivalent to the Spark SQL command: SET `name=\"value\";`).",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure Spark SQL's SparkConf. Properties that conflict with values set by the Cloud Dataproc API may be overwritten.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to be added to the Spark CLASSPATH.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "loggingConfig": {
-     "$ref": "LoggingConfig",
-     "description": "[Optional] The runtime log config for job execution."
-    }
-   }
-  },
-  "JobStatus": {
-   "id": "JobStatus",
-   "type": "object",
-   "description": "Cloud Dataproc job status.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "[Output-only] A state message specifying the overall job state.",
-     "enum": [
-      "STATE_UNSPECIFIED",
-      "PENDING",
-      "SETUP_DONE",
-      "RUNNING",
-      "CANCEL_PENDING",
-      "CANCEL_STARTED",
-      "CANCELLED",
-      "DONE",
-      "ERROR"
-     ]
-    },
-    "details": {
-     "type": "string",
-     "description": "[Output-only] Optional job state details, such as an error description if the state is ERROR."
-    },
-    "stateStartTime": {
-     "type": "string",
-     "description": "[Output-only] The time when this state was entered."
-    }
-   }
-  },
-  "YarnApplication": {
-   "id": "YarnApplication",
-   "type": "object",
-   "description": "A YARN application created by a job. Application information is a subset of org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto. **Beta Feature**: This report is available for testing purposes only. It may be changed before final release.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "[Required] The application name."
-    },
-    "state": {
-     "type": "string",
-     "description": "[Required] The application state.",
-     "enum": [
-      "STATE_UNSPECIFIED",
-      "NEW",
-      "NEW_SAVING",
-      "SUBMITTED",
-      "ACCEPTED",
-      "RUNNING",
-      "FINISHED",
-      "FAILED",
-      "KILLED"
-     ]
-    },
-    "progress": {
-     "type": "number",
-     "description": "[Required] The numerical progress of the application, from 1 to 100.",
-     "format": "float"
-    },
-    "trackingUrl": {
-     "type": "string",
-     "description": "[Optional] The HTTP URL of the ApplicationMaster, HistoryServer, or TimelineServer that provides application-specific information. The URL uses the internal hostname, and requires a proxy server for resolution and, possibly, access."
-    }
-   }
-  },
-  "ListJobsResponse": {
-   "id": "ListJobsResponse",
-   "type": "object",
-   "description": "A list of jobs in a project.",
-   "properties": {
-    "jobs": {
-     "type": "array",
-     "description": "[Output-only] Jobs list.",
-     "items": {
-      "$ref": "Job"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "[Optional] This token is included in the response if there are more results to fetch. To fetch additional results, provide this value as the `page_token` in a subsequent ListJobsRequest."
-    }
-   }
-  },
-  "CancelJobRequest": {
-   "id": "CancelJobRequest",
-   "type": "object",
-   "description": "A request to cancel a job."
-  },
-  "Empty": {
-   "id": "Empty",
-   "type": "object",
-   "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance: service Foo { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); } The JSON representation for `Empty` is empty JSON object `{}`."
-  },
-  "ListOperationsResponse": {
-   "id": "ListOperationsResponse",
-   "type": "object",
-   "description": "The response message for Operations.ListOperations.",
-   "properties": {
-    "operations": {
-     "type": "array",
-     "description": "A list of operations that matches the specified filter in the request.",
-     "items": {
-      "$ref": "Operation"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The standard List next-page token."
-    }
-   }
-  },
-  "DiagnoseClusterResults": {
-   "id": "DiagnoseClusterResults",
-   "type": "object",
-   "description": "The location of diagnostic output.",
-   "properties": {
-    "outputUri": {
-     "type": "string",
-     "description": "[Output-only] The Google Cloud Storage URI of the diagnostic output. The output report is a plain text file with a summary of collected diagnostics."
-    }
-   }
-  },
-  "ClusterOperationMetadata": {
-   "id": "ClusterOperationMetadata",
-   "type": "object",
-   "description": "Metadata describing the operation.",
-   "properties": {
-    "clusterName": {
-     "type": "string",
-     "description": "[Output-only] Name of the cluster for the operation."
-    },
-    "clusterUuid": {
-     "type": "string",
-     "description": "[Output-only] Cluster UUID for the operation."
-    },
-    "status": {
-     "$ref": "ClusterOperationStatus",
-     "description": "[Output-only] Current operation status."
-    },
-    "statusHistory": {
-     "type": "array",
-     "description": "[Output-only] The previous operation status.",
-     "items": {
-      "$ref": "ClusterOperationStatus"
-     }
-    },
-    "operationType": {
-     "type": "string",
-     "description": "[Output-only] The operation type."
-    },
-    "description": {
-     "type": "string",
-     "description": "[Output-only] Short description of operation."
-    },
-    "labels": {
-     "type": "object",
-     "description": "[Output-only] labels associated with the operation",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "ClusterOperationStatus": {
-   "id": "ClusterOperationStatus",
-   "type": "object",
-   "description": "The status of the operation.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "[Output-only] A message containing the operation state.",
-     "enum": [
-      "UNKNOWN",
-      "PENDING",
-      "RUNNING",
-      "DONE"
-     ]
-    },
-    "innerState": {
-     "type": "string",
-     "description": "[Output-only] A message containing the detailed operation state."
-    },
-    "details": {
-     "type": "string",
-     "description": "[Output-only]A message containing any operation metadata details."
-    },
-    "stateStartTime": {
-     "type": "string",
-     "description": "[Output-only] The time this state was entered."
-    }
-   }
-  },
-  "DiagnoseClusterOutputLocation": {
-   "id": "DiagnoseClusterOutputLocation",
-   "type": "object",
-   "description": "The location where output from diagnostic command can be found.",
-   "properties": {
-    "outputUri": {
-     "type": "string",
-     "description": "[Output-only] The Google Cloud Storage URI of the diagnostic output. This will be a plain text file with summary of collected diagnostics."
-    }
-   }
-  },
-  "OperationMetadata": {
-   "id": "OperationMetadata",
-   "type": "object",
-   "description": "Metadata describing the operation.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "A message containing the operation state.",
-     "enum": [
-      "UNKNOWN",
-      "PENDING",
-      "RUNNING",
-      "DONE"
-     ]
-    },
-    "innerState": {
-     "type": "string",
-     "description": "A message containing the detailed operation state."
-    },
-    "details": {
-     "type": "string",
-     "description": "A message containing any operation metadata details."
-    },
-    "insertTime": {
-     "type": "string",
-     "description": "The time that the operation was requested."
-    },
-    "startTime": {
-     "type": "string",
-     "description": "The time that the operation was started by the server."
-    },
-    "endTime": {
-     "type": "string",
-     "description": "The time that the operation completed."
-    },
-    "clusterName": {
-     "type": "string",
-     "description": "Name of the cluster for the operation."
-    },
-    "clusterUuid": {
-     "type": "string",
-     "description": "Cluster UUId for the operation."
-    },
-    "status": {
-     "$ref": "OperationStatus",
-     "description": "[Output-only] Current operation status."
-    },
-    "statusHistory": {
-     "type": "array",
-     "description": "[Output-only] Previous operation status.",
-     "items": {
-      "$ref": "OperationStatus"
-     }
-    },
-    "operationType": {
-     "type": "string",
-     "description": "[Output-only] The operation type."
-    },
-    "description": {
-     "type": "string",
-     "description": "[Output-only] Short description of operation."
-    }
-   }
-  },
-  "OperationStatus": {
-   "id": "OperationStatus",
-   "type": "object",
-   "description": "The status of the operation.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "A message containing the operation state.",
-     "enum": [
-      "UNKNOWN",
-      "PENDING",
-      "RUNNING",
-      "DONE"
-     ]
-    },
-    "innerState": {
-     "type": "string",
-     "description": "A message containing the detailed operation state."
-    },
-    "details": {
-     "type": "string",
-     "description": "A message containing any operation metadata details."
-    },
-    "stateStartTime": {
-     "type": "string",
-     "description": "The time this state was entered."
-    }
-   }
-  }
- },
- "resources": {
-  "projects": {
-   "resources": {
-    "regions": {
-     "resources": {
-      "clusters": {
-       "methods": {
-        "create": {
-         "id": "dataproc.projects.regions.clusters.create",
-         "path": "v1/projects/{projectId}/regions/{region}/clusters",
-         "httpMethod": "POST",
-         "description": "Creates a cluster in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Cloud Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region"
-         ],
-         "request": {
-          "$ref": "Cluster"
-         },
-         "response": {
-          "$ref": "Operation"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "patch": {
-         "id": "dataproc.projects.regions.clusters.patch",
-         "path": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
-         "httpMethod": "PATCH",
-         "description": "Updates a cluster in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project the cluster belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Cloud Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "clusterName": {
-           "type": "string",
-           "description": "[Required] The cluster name.",
-           "required": true,
-           "location": "path"
-          },
-          "updateMask": {
-           "type": "string",
-           "description": "[Required] Specifies the path, relative to Cluster, of the field to update. For example, to change the number of workers in a cluster to 5, the update_mask parameter would be specified as config.worker_config.num_instances, and the `PATCH` request body would specify the new value, as follows: { \"config\":{ \"workerConfig\":{ \"numInstances\":\"5\" } } } Similarly, to change the number of preemptible workers in a cluster to 5, the update_mask parameter would be config.secondary_worker_config.num_instances, and the `PATCH` request body would be set as follows: { \"config\":{ \"secondaryWorkerConfig\":{ \"numInstances\":\"5\" } } } Note: Currently, config.worker_config.num_instances and config.secondary_worker_config.num_instances are the only fields that can be updated.",
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "clusterName"
-         ],
-         "request": {
-          "$ref": "Cluster"
-         },
-         "response": {
-          "$ref": "Operation"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "delete": {
-         "id": "dataproc.projects.regions.clusters.delete",
-         "path": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
-         "httpMethod": "DELETE",
-         "description": "Deletes a cluster in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Cloud Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "clusterName": {
-           "type": "string",
-           "description": "[Required] The cluster name.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "clusterName"
-         ],
-         "response": {
-          "$ref": "Operation"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "get": {
-         "id": "dataproc.projects.regions.clusters.get",
-         "path": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
-         "httpMethod": "GET",
-         "description": "Gets the resource representation for a cluster in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Cloud Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "clusterName": {
-           "type": "string",
-           "description": "[Required] The cluster name.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "clusterName"
-         ],
-         "response": {
-          "$ref": "Cluster"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "list": {
-         "id": "dataproc.projects.regions.clusters.list",
-         "path": "v1/projects/{projectId}/regions/{region}/clusters",
-         "httpMethod": "GET",
-         "description": "Lists all regions/{region}/clusters in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Cloud Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "filter": {
-           "type": "string",
-           "description": "[Optional] A filter constraining the clusters to list. Filters are case-sensitive and have the following syntax: field:value [field:value] ... or field = value [AND [field = value]] ... where **field** is one of `status.state`, `clusterName`, or `labels.[KEY]`, and `[KEY]` is a label key. **value** can be `*` to match all values. `status.state` can be one of the following: `ACTIVE`, `INACTIVE`, `CREATING`, `RUNNING`, `ERROR`, `DELETING`, or `UPDATING`. `ACTIVE` contains the `CREATING`, `UPDATING`, and `RUNNING` states. `INACTIVE` contains the `DELETING` and `ERROR` states. `clusterName` is the name of the cluster provided at creation time. Only the logical `AND` operator is supported; space-separated items are treated as having an implicit `AND` operator. Example valid filters are: status.state:ACTIVE clusterName:mycluster labels.env:staging \\ labels.starred:* and status.state = ACTIVE AND clusterName = mycluster \\ AND labels.env = staging AND labels.starred = *",
-           "location": "query"
-          },
-          "pageSize": {
-           "type": "integer",
-           "description": "[Optional] The standard List page size.",
-           "format": "int32",
-           "location": "query"
-          },
-          "pageToken": {
-           "type": "string",
-           "description": "[Optional] The standard List page token.",
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region"
-         ],
-         "response": {
-          "$ref": "ListClustersResponse"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "diagnose": {
-         "id": "dataproc.projects.regions.clusters.diagnose",
-         "path": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}:diagnose",
-         "httpMethod": "POST",
-         "description": "Gets cluster diagnostic information. After the operation completes, the Operation.response field contains `DiagnoseClusterOutputLocation`.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Cloud Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "clusterName": {
-           "type": "string",
-           "description": "[Required] The cluster name.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "clusterName"
-         ],
-         "request": {
-          "$ref": "DiagnoseClusterRequest"
-         },
-         "response": {
-          "$ref": "Operation"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
+  "schemas": {
+    "DiagnoseClusterOutputLocation": {
+      "id": "DiagnoseClusterOutputLocation",
+      "description": "The location where output from diagnostic command can be found.",
+      "type": "object",
+      "properties": {
+        "outputUri": {
+          "description": "Output-only The Google Cloud Storage URI of the diagnostic output. This will be a plain text file with summary of collected diagnostics.",
+          "type": "string"
         }
-       }
-      },
-      "jobs": {
-       "methods": {
-        "submit": {
-         "id": "dataproc.projects.regions.jobs.submit",
-         "path": "v1/projects/{projectId}/regions/{region}/jobs:submit",
-         "httpMethod": "POST",
-         "description": "Submits a job to a cluster.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Cloud Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region"
-         ],
-         "request": {
-          "$ref": "SubmitJobRequest"
-         },
-         "response": {
-          "$ref": "Job"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "get": {
-         "id": "dataproc.projects.regions.jobs.get",
-         "path": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}",
-         "httpMethod": "GET",
-         "description": "Gets the resource representation for a job in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Cloud Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "jobId": {
-           "type": "string",
-           "description": "[Required] The job ID.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "jobId"
-         ],
-         "response": {
-          "$ref": "Job"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "list": {
-         "id": "dataproc.projects.regions.jobs.list",
-         "path": "v1/projects/{projectId}/regions/{region}/jobs",
-         "httpMethod": "GET",
-         "description": "Lists regions/{region}/jobs in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Cloud Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "pageSize": {
-           "type": "integer",
-           "description": "[Optional] The number of results to return in each response.",
-           "format": "int32",
-           "location": "query"
-          },
-          "pageToken": {
-           "type": "string",
-           "description": "[Optional] The page token, returned by a previous call, to request the next page of results.",
-           "location": "query"
-          },
-          "clusterName": {
-           "type": "string",
-           "description": "[Optional] If set, the returned jobs list includes only jobs that were submitted to the named cluster.",
-           "location": "query"
-          },
-          "jobStateMatcher": {
-           "type": "string",
-           "description": "[Optional] Specifies enumerated categories of jobs to list (default = match ALL jobs).",
-           "enum": [
-            "ALL",
-            "ACTIVE",
-            "NON_ACTIVE"
-           ],
-           "location": "query"
-          },
-          "filter": {
-           "type": "string",
-           "description": "[Optional] A filter constraining the jobs to list. Filters are case-sensitive and have the following syntax: field:value] ... or [field = value] AND [field [= value]] ... where **field** is `status.state` or `labels.[KEY]`, and `[KEY]` is a label key. **value** can be `*` to match all values. `status.state` can be either `ACTIVE` or `INACTIVE`. Only the logical `AND` operator is supported; space-separated items are treated as having an implicit `AND` operator. Example valid filters are: status.state:ACTIVE labels.env:staging labels.starred:* and status.state = ACTIVE AND labels.env = staging AND labels.starred = *",
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region"
-         ],
-         "response": {
-          "$ref": "ListJobsResponse"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "cancel": {
-         "id": "dataproc.projects.regions.jobs.cancel",
-         "path": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}:cancel",
-         "httpMethod": "POST",
-         "description": "Starts a job cancellation request. To access the job resource after cancellation, call [regions/{region}/jobs.list](/dataproc/reference/rest/v1/projects.regions.jobs/list) or [regions/{region}/jobs.get](/dataproc/reference/rest/v1/projects.regions.jobs/get).",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Cloud Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "jobId": {
-           "type": "string",
-           "description": "[Required] The job ID.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "jobId"
-         ],
-         "request": {
-          "$ref": "CancelJobRequest"
-         },
-         "response": {
-          "$ref": "Job"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "delete": {
-         "id": "dataproc.projects.regions.jobs.delete",
-         "path": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}",
-         "httpMethod": "DELETE",
-         "description": "Deletes the job from the project. If the job is active, the delete fails, and the response returns `FAILED_PRECONDITION`.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Cloud Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "jobId": {
-           "type": "string",
-           "description": "[Required] The job ID.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "jobId"
-         ],
-         "response": {
-          "$ref": "Empty"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        }
-       }
-      },
-      "operations": {
-       "methods": {
-        "list": {
-         "id": "dataproc.projects.regions.operations.list",
-         "path": "v1/{+name}",
-         "httpMethod": "GET",
-         "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns `UNIMPLEMENTED`. NOTE: the `name` binding below allows API services to override the binding to use different resource name schemes, such as `users/*/operations`.",
-         "parameters": {
-          "name": {
-           "type": "string",
-           "description": "The name of the operation collection.",
-           "required": true,
-           "pattern": "^projects/[^/]+/regions/[^/]+/operations$",
-           "location": "path"
-          },
-          "filter": {
-           "type": "string",
-           "description": "The standard list filter.",
-           "location": "query"
-          },
-          "pageSize": {
-           "type": "integer",
-           "description": "The standard list page size.",
-           "format": "int32",
-           "location": "query"
-          },
-          "pageToken": {
-           "type": "string",
-           "description": "The standard list page token.",
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "name"
-         ],
-         "response": {
-          "$ref": "ListOperationsResponse"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "get": {
-         "id": "dataproc.projects.regions.operations.get",
-         "path": "v1/{+name}",
-         "httpMethod": "GET",
-         "description": "Gets the latest state of a long-running operation. Clients can use this method to poll the operation result at intervals as recommended by the API service.",
-         "parameters": {
-          "name": {
-           "type": "string",
-           "description": "The name of the operation resource.",
-           "required": true,
-           "pattern": "^projects/[^/]+/regions/[^/]+/operations/[^/]+$",
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "name"
-         ],
-         "response": {
-          "$ref": "Operation"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "delete": {
-         "id": "dataproc.projects.regions.operations.delete",
-         "path": "v1/{+name}",
-         "httpMethod": "DELETE",
-         "description": "Deletes a long-running operation. This method indicates that the client is no longer interested in the operation result. It does not cancel the operation. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`.",
-         "parameters": {
-          "name": {
-           "type": "string",
-           "description": "The name of the operation resource to be deleted.",
-           "required": true,
-           "pattern": "^projects/[^/]+/regions/[^/]+/operations/[^/]+$",
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "name"
-         ],
-         "response": {
-          "$ref": "Empty"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "cancel": {
-         "id": "dataproc.projects.regions.operations.cancel",
-         "path": "v1/{+name}:cancel",
-         "httpMethod": "POST",
-         "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`. Clients can use Operations.GetOperation or other methods to check whether the cancellation succeeded or whether the operation completed despite cancellation. On successful cancellation, the operation is not deleted; instead, it becomes an operation with an Operation.error value with a google.rpc.Status.code of 1, corresponding to `Code.CANCELLED`.",
-         "parameters": {
-          "name": {
-           "type": "string",
-           "description": "The name of the operation resource to be cancelled.",
-           "required": true,
-           "pattern": "^projects/[^/]+/regions/[^/]+/operations/[^/]+$",
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "name"
-         ],
-         "response": {
-          "$ref": "Empty"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        }
-       }
       }
-     }
+    },
+    "Operation": {
+      "id": "Operation",
+      "description": "This resource represents a long-running operation that is the result of a network API call.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the name should have the format of operations/some/unique/name.",
+          "type": "string"
+        },
+        "error": {
+          "$ref": "Status",
+          "description": "The error result of the operation in case of failure or cancellation."
+        },
+        "metadata": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.",
+          "type": "object"
+        },
+        "done": {
+          "description": "If the value is false, it means the operation is still in progress. If true, the operation is completed, and either error or response is available.",
+          "type": "boolean"
+        },
+        "response": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "The normal response of the operation in case of success. If the original method returns no data on success, such as Delete, the response is google.protobuf.Empty. If the original method is standard Get/Create/Update, the response should be the resource. For other methods, the response should have the type XxxResponse, where Xxx is the original method name. For example, if the original method name is TakeSnapshot(), the inferred response type is TakeSnapshotResponse.",
+          "type": "object"
+        }
+      }
+    },
+    "OperationStatus": {
+      "description": "The status of the operation.",
+      "type": "object",
+      "properties": {
+        "state": {
+          "description": "A message containing the operation state.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unused.",
+            "The operation has been created.",
+            "The operation is running.",
+            "The operation is done; either cancelled or completed."
+          ],
+          "enum": [
+            "UNKNOWN",
+            "PENDING",
+            "RUNNING",
+            "DONE"
+          ]
+        },
+        "details": {
+          "description": "A message containing any operation metadata details.",
+          "type": "string"
+        },
+        "innerState": {
+          "description": "A message containing the detailed operation state.",
+          "type": "string"
+        },
+        "stateStartTime": {
+          "description": "The time this state was entered.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "OperationStatus"
+    },
+    "JobReference": {
+      "id": "JobReference",
+      "description": "Encapsulates the full scoping used to reference a job.",
+      "type": "object",
+      "properties": {
+        "projectId": {
+          "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+          "type": "string"
+        },
+        "jobId": {
+          "description": "Optional The job ID, which must be unique within the project. The job ID is generated by the server upon job submission or provided by the user as a means to perform retries without creating duplicate jobs. The ID must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), or hyphens (-). The maximum length is 512 characters.",
+          "type": "string"
+        }
+      }
+    },
+    "SubmitJobRequest": {
+      "description": "A request to submit a job.",
+      "type": "object",
+      "properties": {
+        "job": {
+          "description": "Required The job resource.",
+          "$ref": "Job"
+        }
+      },
+      "id": "SubmitJobRequest"
+    },
+    "Status": {
+      "id": "Status",
+      "description": "The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC (https://github.com/grpc). The error model is designed to be:\nSimple to use and understand for most users\nFlexible enough to meet unexpected needsOverviewThe Status message contains three pieces of data: error code, error message, and error details. The error code should be an enum value of google.rpc.Code, but it may accept additional error codes if needed. The error message should be a developer-facing English message that helps developers understand and resolve the error. If a localized user-facing error message is needed, put the localized message in the error details or localize it in the client. The optional error details may contain arbitrary information about the error. There is a predefined set of error detail types in the package google.rpc which can be used for common error conditions.Language mappingThe Status message is the logical representation of the error model, but it is not necessarily the actual wire format. When the Status message is exposed in different client libraries and different wire protocols, it can be mapped differently. For example, it will likely be mapped to some exceptions in Java, but more likely mapped to some error codes in C.Other usesThe error model and the Status message can be used in a variety of environments, either with or without APIs, to provide a consistent developer experience across different environments.Example uses of this error model include:\nPartial errors. If a service needs to return partial errors to the client, it may embed the Status in the normal response to indicate the partial errors.\nWorkflow errors. A typical workflow has multiple steps. Each step may have a Status message for error reporting purpose.\nBatch operations. If a client uses batch request and batch response, the Status message should be used directly inside batch response, one for each error sub-response.\nAsynchronous operations. If an API call embeds asynchronous operation results in its response, the status of those operations should be represented directly using the Status message.\nLogging. If some API errors are stored in logs, the message Status could be used directly after any stripping needed for security/privacy reasons.",
+      "type": "object",
+      "properties": {
+        "code": {
+          "description": "The status code, which should be an enum value of google.rpc.Code.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "message": {
+          "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.",
+          "type": "string"
+        },
+        "details": {
+          "description": "A list of messages that carry the error details. There will be a common set of message types for APIs to use.",
+          "type": "array",
+          "items": {
+            "additionalProperties": {
+              "description": "Properties of the object. Contains field @type with type URL.",
+              "type": "any"
+            },
+            "type": "object"
+          }
+        }
+      }
+    },
+    "JobScheduling": {
+      "id": "JobScheduling",
+      "description": "Job scheduling options.Beta Feature: These options are available for testing purposes only. They may be changed before final release.",
+      "type": "object",
+      "properties": {
+        "maxFailuresPerHour": {
+          "description": "Optional Maximum number of times per hour a driver may be restarted as a result of driver terminating with non-zero code before job is reported failed.A job may be reported as thrashing if driver exits with non-zero code 4 times within 10 minute window.Maximum value is 10.",
+          "format": "int32",
+          "type": "integer"
+        }
+      }
+    },
+    "InstanceGroupConfig": {
+      "description": "Optional The config settings for Google Compute Engine resources in an instance group, such as a master or worker group.",
+      "type": "object",
+      "properties": {
+        "diskConfig": {
+          "description": "Optional Disk option config settings.",
+          "$ref": "DiskConfig"
+        },
+        "imageUri": {
+          "description": "Output-only The Google Compute Engine image resource used for cluster instances. Inferred from SoftwareConfig.image_version.",
+          "type": "string"
+        },
+        "machineTypeUri": {
+          "description": "Required The Google Compute Engine machine type used for cluster instances. Example: https://www.googleapis.com/compute/v1/projects/[project_id]/zones/us-east1-a/machineTypes/n1-standard-2.",
+          "type": "string"
+        },
+        "managedGroupConfig": {
+          "$ref": "ManagedGroupConfig",
+          "description": "Output-only The config for Google Compute Engine Instance Group Manager that manages this group. This is only used for preemptible instance groups."
+        },
+        "isPreemptible": {
+          "description": "Optional Specifies that this instance group contains preemptible instances.",
+          "type": "boolean"
+        },
+        "instanceNames": {
+          "description": "Optional The list of instance names. Cloud Dataproc derives the names from cluster_name, num_instances, and the instance group if not set by user (recommended practice is to let Cloud Dataproc derive the name).",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "numInstances": {
+          "description": "Required The number of VM instances in the instance group. For master instance groups, must be set to 1.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "InstanceGroupConfig"
+    },
+    "ListJobsResponse": {
+      "id": "ListJobsResponse",
+      "description": "A list of jobs in a project.",
+      "type": "object",
+      "properties": {
+        "jobs": {
+          "description": "Output-only Jobs list.",
+          "type": "array",
+          "items": {
+            "$ref": "Job"
+          }
+        },
+        "nextPageToken": {
+          "description": "Optional This token is included in the response if there are more results to fetch. To fetch additional results, provide this value as the page_token in a subsequent \u003ccode\u003eListJobsRequest\u003c/code\u003e.",
+          "type": "string"
+        }
+      }
+    },
+    "NodeInitializationAction": {
+      "id": "NodeInitializationAction",
+      "description": "Specifies an executable to run on a fully configured node and a timeout period for executable completion.",
+      "type": "object",
+      "properties": {
+        "executableFile": {
+          "description": "Required Google Cloud Storage URI of executable file.",
+          "type": "string"
+        },
+        "executionTimeout": {
+          "description": "Optional Amount of time executable has to complete. Default is 10 minutes. Cluster creation fails with an explanatory error message (the name of the executable that caused the error and the exceeded timeout period) if the executable is not completed at end of the timeout period.",
+          "format": "google-duration",
+          "type": "string"
+        }
+      }
+    },
+    "CancelJobRequest": {
+      "description": "A request to cancel a job.",
+      "type": "object",
+      "properties": {},
+      "id": "CancelJobRequest"
+    },
+    "SparkSqlJob": {
+      "id": "SparkSqlJob",
+      "description": "A Cloud Dataproc job for running Apache Spark SQL (http://spark.apache.org/sql/) queries.",
+      "type": "object",
+      "properties": {
+        "queryFileUri": {
+          "description": "The HCFS URI of the script that contains SQL queries.",
+          "type": "string"
+        },
+        "queryList": {
+          "description": "A list of queries.",
+          "$ref": "QueryList"
+        },
+        "scriptVariables": {
+          "description": "Optional Mapping of query variable names to values (equivalent to the Spark SQL command: SET name=\"value\";).",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to be added to the Spark CLASSPATH.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "loggingConfig": {
+          "$ref": "LoggingConfig",
+          "description": "Optional The runtime log config for job execution."
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional A mapping of property names to values, used to configure Spark SQL's SparkConf. Properties that conflict with values set by the Cloud Dataproc API may be overwritten.",
+          "type": "object"
+        }
+      }
+    },
+    "Cluster": {
+      "id": "Cluster",
+      "description": "Describes the identifying information, config, and status of a cluster of Google Compute Engine instances.",
+      "type": "object",
+      "properties": {
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional The labels to associate with this cluster. Label keys must contain 1 to 63 characters, and must conform to RFC 1035 (https://www.ietf.org/rfc/rfc1035.txt). Label values may be empty, but, if present, must contain 1 to 63 characters, and must conform to RFC 1035 (https://www.ietf.org/rfc/rfc1035.txt). No more than 32 labels can be associated with a cluster.",
+          "type": "object"
+        },
+        "status": {
+          "description": "Output-only Cluster status.",
+          "$ref": "ClusterStatus"
+        },
+        "metrics": {
+          "$ref": "ClusterMetrics",
+          "description": "Contains cluster daemon metrics such as HDFS and YARN stats.Beta Feature: This report is available for testing purposes only. It may be changed before final release."
+        },
+        "config": {
+          "$ref": "ClusterConfig",
+          "description": "Required The cluster config. Note that Cloud Dataproc may set default values, and values may change when clusters are updated."
+        },
+        "statusHistory": {
+          "description": "Output-only The previous cluster status.",
+          "type": "array",
+          "items": {
+            "$ref": "ClusterStatus"
+          }
+        },
+        "clusterUuid": {
+          "description": "Output-only A cluster UUID (Unique Universal Identifier). Cloud Dataproc generates this value when it creates the cluster.",
+          "type": "string"
+        },
+        "clusterName": {
+          "description": "Required The cluster name. Cluster names within a project must be unique. Names of deleted clusters can be reused.",
+          "type": "string"
+        },
+        "projectId": {
+          "description": "Required The Google Cloud Platform project ID that the cluster belongs to.",
+          "type": "string"
+        }
+      }
+    },
+    "ListOperationsResponse": {
+      "description": "The response message for Operations.ListOperations.",
+      "type": "object",
+      "properties": {
+        "operations": {
+          "description": "A list of operations that matches the specified filter in the request.",
+          "type": "array",
+          "items": {
+            "$ref": "Operation"
+          }
+        },
+        "nextPageToken": {
+          "description": "The standard List next-page token.",
+          "type": "string"
+        }
+      },
+      "id": "ListOperationsResponse"
+    },
+    "OperationMetadata": {
+      "id": "OperationMetadata",
+      "description": "Metadata describing the operation.",
+      "type": "object",
+      "properties": {
+        "clusterUuid": {
+          "description": "Cluster UUId for the operation.",
+          "type": "string"
+        },
+        "clusterName": {
+          "description": "Name of the cluster for the operation.",
+          "type": "string"
+        },
+        "innerState": {
+          "description": "A message containing the detailed operation state.",
+          "type": "string"
+        },
+        "endTime": {
+          "description": "The time that the operation completed.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "startTime": {
+          "description": "The time that the operation was started by the server.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "warnings": {
+          "description": "Output-only Errors encountered during operation execution.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "insertTime": {
+          "description": "The time that the operation was requested.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "statusHistory": {
+          "description": "Output-only Previous operation status.",
+          "type": "array",
+          "items": {
+            "$ref": "OperationStatus"
+          }
+        },
+        "operationType": {
+          "description": "Output-only The operation type.",
+          "type": "string"
+        },
+        "description": {
+          "description": "Output-only Short description of operation.",
+          "type": "string"
+        },
+        "status": {
+          "description": "Output-only Current operation status.",
+          "$ref": "OperationStatus"
+        },
+        "state": {
+          "enumDescriptions": [
+            "Unused.",
+            "The operation has been created.",
+            "The operation is currently running.",
+            "The operation is done, either cancelled or completed."
+          ],
+          "enum": [
+            "UNKNOWN",
+            "PENDING",
+            "RUNNING",
+            "DONE"
+          ],
+          "description": "A message containing the operation state.",
+          "type": "string"
+        },
+        "details": {
+          "description": "A message containing any operation metadata details.",
+          "type": "string"
+        }
+      }
+    },
+    "SoftwareConfig": {
+      "description": "Specifies the selection and config of software inside the cluster.",
+      "type": "object",
+      "properties": {
+        "imageVersion": {
+          "description": "Optional The version of software inside the cluster. It must match the regular expression [0-9]+\\.[0-9]+. If unspecified, it defaults to the latest version (see Cloud Dataproc Versioning).",
+          "type": "string"
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional The properties to set on daemon config files.Property keys are specified in prefix:property format, such as core:fs.defaultFS. The following are supported prefixes and their mappings:\ncore: core-site.xml\nhdfs: hdfs-site.xml\nmapred: mapred-site.xml\nyarn: yarn-site.xml\nhive: hive-site.xml\npig: pig.properties\nspark: spark-defaults.conf",
+          "type": "object"
+        }
+      },
+      "id": "SoftwareConfig"
+    },
+    "JobPlacement": {
+      "id": "JobPlacement",
+      "description": "Cloud Dataproc job config.",
+      "type": "object",
+      "properties": {
+        "clusterName": {
+          "description": "Required The name of the cluster where the job will be submitted.",
+          "type": "string"
+        },
+        "clusterUuid": {
+          "description": "Output-only A cluster UUID generated by the Cloud Dataproc service when the job is submitted.",
+          "type": "string"
+        }
+      }
+    },
+    "PigJob": {
+      "id": "PigJob",
+      "description": "A Cloud Dataproc job for running Apache Pig (https://pig.apache.org/) queries on YARN.",
+      "type": "object",
+      "properties": {
+        "queryList": {
+          "$ref": "QueryList",
+          "description": "A list of queries."
+        },
+        "queryFileUri": {
+          "description": "The HCFS URI of the script that contains the Pig queries.",
+          "type": "string"
+        },
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to add to the CLASSPATH of the Pig Client and Hadoop MapReduce (MR) tasks. Can contain Pig UDFs.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "scriptVariables": {
+          "description": "Optional Mapping of query variable names to values (equivalent to the Pig command: name=[value]).",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "loggingConfig": {
+          "$ref": "LoggingConfig",
+          "description": "Optional The runtime log config for job execution."
+        },
+        "properties": {
+          "description": "Optional A mapping of property names to values, used to configure Pig. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/pig/conf/pig.properties, and classes in user code.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "continueOnFailure": {
+          "description": "Optional Whether to continue executing queries if a query fails. The default value is false. Setting to true can be useful when executing independent parallel queries.",
+          "type": "boolean"
+        }
+      }
+    },
+    "ClusterStatus": {
+      "description": "The status of a cluster and its instances.",
+      "type": "object",
+      "properties": {
+        "detail": {
+          "description": "Output-only Optional details of cluster's state.",
+          "type": "string"
+        },
+        "state": {
+          "description": "Output-only The cluster's state.",
+          "type": "string",
+          "enumDescriptions": [
+            "The cluster state is unknown.",
+            "The cluster is being created and set up. It is not ready for use.",
+            "The cluster is currently running and healthy. It is ready for use.",
+            "The cluster encountered an error. It is not ready for use.",
+            "The cluster is being deleted. It cannot be used.",
+            "The cluster is being updated. It continues to accept and process jobs."
+          ],
+          "enum": [
+            "UNKNOWN",
+            "CREATING",
+            "RUNNING",
+            "ERROR",
+            "DELETING",
+            "UPDATING"
+          ]
+        },
+        "stateStartTime": {
+          "description": "Output-only Time when this state was entered.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "ClusterStatus"
+    },
+    "ListClustersResponse": {
+      "description": "The list of all clusters in a project.",
+      "type": "object",
+      "properties": {
+        "clusters": {
+          "description": "Output-only The clusters in the project.",
+          "type": "array",
+          "items": {
+            "$ref": "Cluster"
+          }
+        },
+        "nextPageToken": {
+          "description": "Output-only This token is included in the response if there are more results to fetch. To fetch additional results, provide this value as the page_token in a subsequent \u003ccode\u003eListClustersRequest\u003c/code\u003e.",
+          "type": "string"
+        }
+      },
+      "id": "ListClustersResponse"
+    },
+    "Job": {
+      "description": "A Cloud Dataproc job resource.",
+      "type": "object",
+      "properties": {
+        "status": {
+          "description": "Output-only The job status. Additional application-specific status information may be contained in the \u003ccode\u003etype_job\u003c/code\u003e and \u003ccode\u003eyarn_applications\u003c/code\u003e fields.",
+          "$ref": "JobStatus"
+        },
+        "placement": {
+          "$ref": "JobPlacement",
+          "description": "Required Job information, including how, when, and where to run the job."
+        },
+        "driverControlFilesUri": {
+          "description": "Output-only If present, the location of miscellaneous control files which may be used as part of job setup and handling. If not present, control files may be placed in the same location as driver_output_uri.",
+          "type": "string"
+        },
+        "scheduling": {
+          "description": "Optional Job scheduling configuration.",
+          "$ref": "JobScheduling"
+        },
+        "pigJob": {
+          "$ref": "PigJob",
+          "description": "Job is a Pig job."
+        },
+        "hiveJob": {
+          "description": "Job is a Hive job.",
+          "$ref": "HiveJob"
+        },
+        "labels": {
+          "description": "Optional The labels to associate with this job. Label keys must contain 1 to 63 characters, and must conform to RFC 1035 (https://www.ietf.org/rfc/rfc1035.txt). Label values may be empty, but, if present, must contain 1 to 63 characters, and must conform to RFC 1035 (https://www.ietf.org/rfc/rfc1035.txt). No more than 32 labels can be associated with a job.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "driverOutputResourceUri": {
+          "description": "Output-only A URI pointing to the location of the stdout of the job's driver program.",
+          "type": "string"
+        },
+        "sparkJob": {
+          "description": "Job is a Spark job.",
+          "$ref": "SparkJob"
+        },
+        "statusHistory": {
+          "description": "Output-only The previous job status.",
+          "type": "array",
+          "items": {
+            "$ref": "JobStatus"
+          }
+        },
+        "sparkSqlJob": {
+          "description": "Job is a SparkSql job.",
+          "$ref": "SparkSqlJob"
+        },
+        "yarnApplications": {
+          "description": "Output-only The collection of YARN applications spun up by this job.Beta Feature: This report is available for testing purposes only. It may be changed before final release.",
+          "type": "array",
+          "items": {
+            "$ref": "YarnApplication"
+          }
+        },
+        "pysparkJob": {
+          "description": "Job is a Pyspark job.",
+          "$ref": "PySparkJob"
+        },
+        "reference": {
+          "$ref": "JobReference",
+          "description": "Optional The fully qualified reference to the job, which can be used to obtain the equivalent REST path of the job resource. If this property is not specified when a job is created, the server generates a \u003ccode\u003ejob_id\u003c/code\u003e."
+        },
+        "hadoopJob": {
+          "description": "Job is a Hadoop job.",
+          "$ref": "HadoopJob"
+        }
+      },
+      "id": "Job"
+    },
+    "SparkJob": {
+      "id": "SparkJob",
+      "description": "A Cloud Dataproc job for running Apache Spark (http://spark.apache.org/) applications on YARN.",
+      "type": "object",
+      "properties": {
+        "args": {
+          "description": "Optional The arguments to pass to the driver. Do not include arguments, such as --conf, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "fileUris": {
+          "description": "Optional HCFS URIs of files to be copied to the working directory of Spark drivers and distributed tasks. Useful for naively parallel tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainClass": {
+          "description": "The name of the driver's main class. The jar file that contains the class must be in the default CLASSPATH or specified in jar_file_uris.",
+          "type": "string"
+        },
+        "archiveUris": {
+          "description": "Optional HCFS URIs of archives to be extracted in the working directory of Spark drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, and .zip.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainJarFileUri": {
+          "description": "The HCFS URI of the jar file that contains the main class.",
+          "type": "string"
+        },
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to add to the CLASSPATHs of the Spark driver and tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "loggingConfig": {
+          "$ref": "LoggingConfig",
+          "description": "Optional The runtime log config for job execution."
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional A mapping of property names to values, used to configure Spark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.",
+          "type": "object"
+        }
+      }
+    },
+    "JobStatus": {
+      "id": "JobStatus",
+      "description": "Cloud Dataproc job status.",
+      "type": "object",
+      "properties": {
+        "stateStartTime": {
+          "description": "Output-only The time when this state was entered.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "state": {
+          "enumDescriptions": [
+            "The job state is unknown.",
+            "The job is pending; it has been submitted, but is not yet running.",
+            "Job has been received by the service and completed initial setup; it will soon be submitted to the cluster.",
+            "The job is running on the cluster.",
+            "A CancelJob request has been received, but is pending.",
+            "Transient in-flight resources have been canceled, and the request to cancel the running job has been issued to the cluster.",
+            "The job cancellation was successful.",
+            "The job has completed successfully.",
+            "The job has completed, but encountered an error.",
+            "Job attempt has failed. The detail field contains failure details for this attempt.Applies to restartable jobs only."
+          ],
+          "enum": [
+            "STATE_UNSPECIFIED",
+            "PENDING",
+            "SETUP_DONE",
+            "RUNNING",
+            "CANCEL_PENDING",
+            "CANCEL_STARTED",
+            "CANCELLED",
+            "DONE",
+            "ERROR",
+            "ATTEMPT_FAILURE"
+          ],
+          "description": "Output-only A state message specifying the overall job state.",
+          "type": "string"
+        },
+        "details": {
+          "description": "Output-only Optional job state details, such as an error description if the state is \u003ccode\u003eERROR\u003c/code\u003e.",
+          "type": "string"
+        }
+      }
+    },
+    "ManagedGroupConfig": {
+      "id": "ManagedGroupConfig",
+      "description": "Specifies the resources used to actively manage an instance group.",
+      "type": "object",
+      "properties": {
+        "instanceGroupManagerName": {
+          "description": "Output-only The name of the Instance Group Manager for this group.",
+          "type": "string"
+        },
+        "instanceTemplateName": {
+          "description": "Output-only The name of the Instance Template used for the Managed Instance Group.",
+          "type": "string"
+        }
+      }
+    },
+    "ClusterOperationStatus": {
+      "id": "ClusterOperationStatus",
+      "description": "The status of the operation.",
+      "type": "object",
+      "properties": {
+        "state": {
+          "description": "Output-only A message containing the operation state.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unused.",
+            "The operation has been created.",
+            "The operation is running.",
+            "The operation is done; either cancelled or completed."
+          ],
+          "enum": [
+            "UNKNOWN",
+            "PENDING",
+            "RUNNING",
+            "DONE"
+          ]
+        },
+        "details": {
+          "description": "Output-onlyA message containing any operation metadata details.",
+          "type": "string"
+        },
+        "innerState": {
+          "description": "Output-only A message containing the detailed operation state.",
+          "type": "string"
+        },
+        "stateStartTime": {
+          "description": "Output-only The time this state was entered.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      }
+    },
+    "YarnApplication": {
+      "description": "A YARN application created by a job. Application information is a subset of \u003ccode\u003eorg.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto\u003c/code\u003e.Beta Feature: This report is available for testing purposes only. It may be changed before final release.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "Required The application name.",
+          "type": "string"
+        },
+        "trackingUrl": {
+          "description": "Optional The HTTP URL of the ApplicationMaster, HistoryServer, or TimelineServer that provides application-specific information. The URL uses the internal hostname, and requires a proxy server for resolution and, possibly, access.",
+          "type": "string"
+        },
+        "progress": {
+          "description": "Required The numerical progress of the application, from 1 to 100.",
+          "format": "float",
+          "type": "number"
+        },
+        "state": {
+          "description": "Required The application state.",
+          "type": "string",
+          "enumDescriptions": [
+            "Status is unspecified.",
+            "Status is NEW.",
+            "Status is NEW_SAVING.",
+            "Status is SUBMITTED.",
+            "Status is ACCEPTED.",
+            "Status is RUNNING.",
+            "Status is FINISHED.",
+            "Status is FAILED.",
+            "Status is KILLED."
+          ],
+          "enum": [
+            "STATE_UNSPECIFIED",
+            "NEW",
+            "NEW_SAVING",
+            "SUBMITTED",
+            "ACCEPTED",
+            "RUNNING",
+            "FINISHED",
+            "FAILED",
+            "KILLED"
+          ]
+        }
+      },
+      "id": "YarnApplication"
+    },
+    "QueryList": {
+      "description": "A list of queries to run on a cluster.",
+      "type": "object",
+      "properties": {
+        "queries": {
+          "description": "Required The queries to execute. You do not need to terminate a query with a semicolon. Multiple queries can be specified in one string by separating each with a semicolon. Here is an example of an Cloud Dataproc API snippet that uses a QueryList to specify a HiveJob:\n\"hiveJob\": {\n  \"queryList\": {\n    \"queries\": [\n      \"query1\",\n      \"query2\",\n      \"query3;query4\",\n    ]\n  }\n}\n",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "QueryList"
+    },
+    "HadoopJob": {
+      "id": "HadoopJob",
+      "description": "A Cloud Dataproc job for running Apache Hadoop MapReduce (https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html) jobs on Apache Hadoop YARN (https://hadoop.apache.org/docs/r2.7.1/hadoop-yarn/hadoop-yarn-site/YARN.html).",
+      "type": "object",
+      "properties": {
+        "args": {
+          "description": "Optional The arguments to pass to the driver. Do not include arguments, such as -libjars or -Dfoo=bar, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "fileUris": {
+          "description": "Optional HCFS (Hadoop Compatible Filesystem) URIs of files to be copied to the working directory of Hadoop drivers and distributed tasks. Useful for naively parallel tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainClass": {
+          "description": "The name of the driver's main class. The jar file containing the class must be in the default CLASSPATH or specified in jar_file_uris.",
+          "type": "string"
+        },
+        "archiveUris": {
+          "description": "Optional HCFS URIs of archives to be extracted in the working directory of Hadoop drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, or .zip.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainJarFileUri": {
+          "description": "The HCFS URI of the jar file containing the main class. Examples:  'gs://foo-bucket/analytics-binaries/extract-useful-metrics-mr.jar'  'hdfs:/tmp/test-samples/custom-wordcount.jar'  'file:///home/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar'",
+          "type": "string"
+        },
+        "jarFileUris": {
+          "description": "Optional Jar file URIs to add to the CLASSPATHs of the Hadoop driver and tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "loggingConfig": {
+          "$ref": "LoggingConfig",
+          "description": "Optional The runtime log config for job execution."
+        },
+        "properties": {
+          "description": "Optional A mapping of property names to values, used to configure Hadoop. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site and classes in user code.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "DiagnoseClusterRequest": {
+      "description": "A request to collect cluster diagnostic information.",
+      "type": "object",
+      "properties": {},
+      "id": "DiagnoseClusterRequest"
+    },
+    "DiskConfig": {
+      "id": "DiskConfig",
+      "description": "Specifies the config of disk options for a group of VM instances.",
+      "type": "object",
+      "properties": {
+        "bootDiskSizeGb": {
+          "description": "Optional Size in GB of the boot disk (default is 500GB).",
+          "format": "int32",
+          "type": "integer"
+        },
+        "numLocalSsds": {
+          "description": "Optional Number of attached SSDs, from 0 to 4 (default is 0). If SSDs are not attached, the boot disk is used to store runtime logs and HDFS (https://hadoop.apache.org/docs/r1.2.1/hdfs_user_guide.html) data. If one or more SSDs are attached, this runtime bulk data is spread across them, and the boot disk contains only basic config and installed binaries.",
+          "format": "int32",
+          "type": "integer"
+        }
+      }
+    },
+    "ClusterOperationMetadata": {
+      "id": "ClusterOperationMetadata",
+      "description": "Metadata describing the operation.",
+      "type": "object",
+      "properties": {
+        "clusterName": {
+          "description": "Output-only Name of the cluster for the operation.",
+          "type": "string"
+        },
+        "clusterUuid": {
+          "description": "Output-only Cluster UUID for the operation.",
+          "type": "string"
+        },
+        "operationType": {
+          "description": "Output-only The operation type.",
+          "type": "string"
+        },
+        "description": {
+          "description": "Output-only Short description of operation.",
+          "type": "string"
+        },
+        "warnings": {
+          "description": "Output-only Errors encountered during operation execution.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "labels": {
+          "description": "Output-only Labels associated with the operation",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "status": {
+          "description": "Output-only Current operation status.",
+          "$ref": "ClusterOperationStatus"
+        },
+        "statusHistory": {
+          "description": "Output-only The previous operation status.",
+          "type": "array",
+          "items": {
+            "$ref": "ClusterOperationStatus"
+          }
+        }
+      }
+    },
+    "HiveJob": {
+      "id": "HiveJob",
+      "description": "A Cloud Dataproc job for running Apache Hive (https://hive.apache.org/) queries on YARN.",
+      "type": "object",
+      "properties": {
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to add to the CLASSPATH of the Hive server and Hadoop MapReduce (MR) tasks. Can contain Hive SerDes and UDFs.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "scriptVariables": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional Mapping of query variable names to values (equivalent to the Hive command: SET name=\"value\";).",
+          "type": "object"
+        },
+        "properties": {
+          "description": "Optional A mapping of property names and values, used to configure Hive. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/hive/conf/hive-site.xml, and classes in user code.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "continueOnFailure": {
+          "description": "Optional Whether to continue executing queries if a query fails. The default value is false. Setting to true can be useful when executing independent parallel queries.",
+          "type": "boolean"
+        },
+        "queryList": {
+          "description": "A list of queries.",
+          "$ref": "QueryList"
+        },
+        "queryFileUri": {
+          "description": "The HCFS URI of the script that contains Hive queries.",
+          "type": "string"
+        }
+      }
+    },
+    "Empty": {
+      "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:\nservice Foo {\n  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n}\nThe JSON representation for Empty is empty JSON object {}.",
+      "type": "object",
+      "properties": {},
+      "id": "Empty"
+    },
+    "DiagnoseClusterResults": {
+      "id": "DiagnoseClusterResults",
+      "description": "The location of diagnostic output.",
+      "type": "object",
+      "properties": {
+        "outputUri": {
+          "description": "Output-only The Google Cloud Storage URI of the diagnostic output. The output report is a plain text file with a summary of collected diagnostics.",
+          "type": "string"
+        }
+      }
+    },
+    "ClusterConfig": {
+      "id": "ClusterConfig",
+      "description": "The cluster config.",
+      "type": "object",
+      "properties": {
+        "gceClusterConfig": {
+          "description": "Required The shared Google Compute Engine config settings for all instances in a cluster.",
+          "$ref": "GceClusterConfig"
+        },
+        "softwareConfig": {
+          "$ref": "SoftwareConfig",
+          "description": "Optional The config settings for software inside the cluster."
+        },
+        "masterConfig": {
+          "$ref": "InstanceGroupConfig",
+          "description": "Optional The Google Compute Engine config settings for the master instance in a cluster."
+        },
+        "secondaryWorkerConfig": {
+          "$ref": "InstanceGroupConfig",
+          "description": "Optional The Google Compute Engine config settings for additional worker instances in a cluster."
+        },
+        "initializationActions": {
+          "description": "Optional Commands to execute on each node after config is completed. By default, executables are run on master and all worker nodes. You can test a node's \u003ccode\u003erole\u003c/code\u003e metadata to run an executable on a master or worker node, as shown below using curl (you can also use wget):\nROLE=$(curl -H Metadata-Flavor:Google http://metadata/computeMetadata/v1/instance/attributes/dataproc-role)\nif [[ \"${ROLE}\" == 'Master' ]]; then\n  ... master specific actions ...\nelse\n  ... worker specific actions ...\nfi\n",
+          "type": "array",
+          "items": {
+            "$ref": "NodeInitializationAction"
+          }
+        },
+        "configBucket": {
+          "description": "Optional A Google Cloud Storage staging bucket used for sharing generated SSH keys and config. If you do not specify a staging bucket, Cloud Dataproc will determine an appropriate Cloud Storage location (US, ASIA, or EU) for your cluster's staging bucket according to the Google Compute Engine zone where your cluster is deployed, and then it will create and manage this project-level, per-location bucket for you.",
+          "type": "string"
+        },
+        "workerConfig": {
+          "description": "Optional The Google Compute Engine config settings for worker instances in a cluster.",
+          "$ref": "InstanceGroupConfig"
+        }
+      }
+    },
+    "PySparkJob": {
+      "id": "PySparkJob",
+      "description": "A Cloud Dataproc job for running Apache PySpark (https://spark.apache.org/docs/0.9.0/python-programming-guide.html) applications on YARN.",
+      "type": "object",
+      "properties": {
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to add to the CLASSPATHs of the Python driver and tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "loggingConfig": {
+          "description": "Optional The runtime log config for job execution.",
+          "$ref": "LoggingConfig"
+        },
+        "properties": {
+          "description": "Optional A mapping of property names to values, used to configure PySpark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "args": {
+          "description": "Optional The arguments to pass to the driver. Do not include arguments, such as --conf, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "fileUris": {
+          "description": "Optional HCFS URIs of files to be copied to the working directory of Python drivers and distributed tasks. Useful for naively parallel tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "pythonFileUris": {
+          "description": "Optional HCFS file URIs of Python files to pass to the PySpark framework. Supported file types: .py, .egg, and .zip.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainPythonFileUri": {
+          "description": "Required The HCFS URI of the main Python file to use as the driver. Must be a .py file.",
+          "type": "string"
+        },
+        "archiveUris": {
+          "description": "Optional HCFS URIs of archives to be extracted in the working directory of .jar, .tar, .tar.gz, .tgz, and .zip.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "GceClusterConfig": {
+      "id": "GceClusterConfig",
+      "description": "Common config settings for resources of Google Compute Engine cluster instances, applicable to all instances in the cluster.",
+      "type": "object",
+      "properties": {
+        "tags": {
+          "description": "The Google Compute Engine tags to add to all instances (see Tagging instances).",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "serviceAccount": {
+          "description": "Optional The service account of the instances. Defaults to the default Google Compute Engine service account. Custom service accounts need permissions equivalent to the folloing IAM roles:\nroles/logging.logWriter\nroles/storage.objectAdmin(see https://cloud.google.com/compute/docs/access/service-accounts#custom_service_accounts for more information). Example: [account_id]@[project_id].iam.gserviceaccount.com",
+          "type": "string"
+        },
+        "subnetworkUri": {
+          "description": "Optional The Google Compute Engine subnetwork to be used for machine communications. Cannot be specified with network_uri. Example: https://www.googleapis.com/compute/v1/projects/[project_id]/regions/us-east1/sub0.",
+          "type": "string"
+        },
+        "networkUri": {
+          "description": "Optional The Google Compute Engine network to be used for machine communications. Cannot be specified with subnetwork_uri. If neither network_uri nor subnetwork_uri is specified, the \"default\" network of the project is used, if it exists. Cannot be a \"Custom Subnet Network\" (see Using Subnetworks for more information). Example: https://www.googleapis.com/compute/v1/projects/[project_id]/regions/global/default.",
+          "type": "string"
+        },
+        "zoneUri": {
+          "description": "Required The zone where the Google Compute Engine cluster will be located. Example: https://www.googleapis.com/compute/v1/projects/[project_id]/zones/[zone].",
+          "type": "string"
+        },
+        "metadata": {
+          "description": "The Google Compute Engine metadata entries to add to all instances (see Project and instance metadata (https://cloud.google.com/compute/docs/storing-retrieving-metadata#project_and_instance_metadata)).",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "internalIpOnly": {
+          "description": "Optional If true, all instances in the cluster will only have internal IP addresses. By default, clusters are not restricted to internal IP addresses, and will have ephemeral external IP addresses assigned to each instance. This internal_ip_only restriction can only be enabled for subnetwork enabled networks, and all off-cluster dependencies must be configured to be accessible without external IP addresses.",
+          "type": "boolean"
+        },
+        "serviceAccountScopes": {
+          "description": "Optional The URIs of service account scopes to be included in Google Compute Engine instances. The following base set of scopes is always included:\nhttps://www.googleapis.com/auth/cloud.useraccounts.readonly\nhttps://www.googleapis.com/auth/devstorage.read_write\nhttps://www.googleapis.com/auth/logging.writeIf no scopes are specified, the following defaults are also provided:\nhttps://www.googleapis.com/auth/bigquery\nhttps://www.googleapis.com/auth/bigtable.admin.table\nhttps://www.googleapis.com/auth/bigtable.data\nhttps://www.googleapis.com/auth/devstorage.full_control",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "ClusterMetrics": {
+      "id": "ClusterMetrics",
+      "description": "Contains cluster daemon metrics, such as HDFS and YARN stats.Beta Feature: This report is available for testing purposes only. It may be changed before final release.",
+      "type": "object",
+      "properties": {
+        "yarnMetrics": {
+          "description": "The YARN metrics.",
+          "type": "object",
+          "additionalProperties": {
+            "format": "int64",
+            "type": "string"
+          }
+        },
+        "hdfsMetrics": {
+          "description": "The HDFS metrics.",
+          "type": "object",
+          "additionalProperties": {
+            "format": "int64",
+            "type": "string"
+          }
+        }
+      }
+    },
+    "LoggingConfig": {
+      "id": "LoggingConfig",
+      "description": "The runtime logging config of the job.",
+      "type": "object",
+      "properties": {
+        "driverLogLevels": {
+          "description": "The per-package log levels for the driver. This may include \"root\" package name to configure rootLogger. Examples:  'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string",
+            "enum": [
+              "LEVEL_UNSPECIFIED",
+              "ALL",
+              "TRACE",
+              "DEBUG",
+              "INFO",
+              "WARN",
+              "ERROR",
+              "FATAL",
+              "OFF"
+            ]
+          }
+        }
+      }
     }
-   }
-  }
- }
+  },
+  "protocol": "rest",
+  "icons": {
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
+  },
+  "version": "v1",
+  "baseUrl": "https://dataproc.googleapis.com/"
 }
diff --git a/dataproc/v1/dataproc-gen.go b/dataproc/v1/dataproc-gen.go
index eb04dc5..4c8bf95 100644
--- a/dataproc/v1/dataproc-gen.go
+++ b/dataproc/v1/dataproc-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Regions = NewProjectsRegionsService(s)
@@ -139,40 +144,40 @@
 // Cluster: Describes the identifying information, config, and status of
 // a cluster of Google Compute Engine instances.
 type Cluster struct {
-	// ClusterName: [Required] The cluster name. Cluster names within a
+	// ClusterName: Required The cluster name. Cluster names within a
 	// project must be unique. Names of deleted clusters can be reused.
 	ClusterName string `json:"clusterName,omitempty"`
 
-	// ClusterUuid: [Output-only] A cluster UUID (Unique Universal
+	// ClusterUuid: Output-only A cluster UUID (Unique Universal
 	// Identifier). Cloud Dataproc generates this value when it creates the
 	// cluster.
 	ClusterUuid string `json:"clusterUuid,omitempty"`
 
-	// Config: [Required] The cluster config. Note that Cloud Dataproc may
-	// set default values, and values may change when clusters are updated.
+	// Config: Required The cluster config. Note that Cloud Dataproc may set
+	// default values, and values may change when clusters are updated.
 	Config *ClusterConfig `json:"config,omitempty"`
 
-	// Labels: [Optional] The labels to associate with this cluster. Label
-	// **keys** must contain 1 to 63 characters, and must conform to [RFC
-	// 1035](https://www.ietf.org/rfc/rfc1035.txt). Label **values** may be
-	// empty, but, if present, must contain 1 to 63 characters, and must
-	// conform to [RFC 1035](https://www.ietf.org/rfc/rfc1035.txt). No more
-	// than 32 labels can be associated with a cluster.
+	// Labels: Optional The labels to associate with this cluster. Label
+	// keys must contain 1 to 63 characters, and must conform to RFC 1035
+	// (https://www.ietf.org/rfc/rfc1035.txt). Label values may be empty,
+	// but, if present, must contain 1 to 63 characters, and must conform to
+	// RFC 1035 (https://www.ietf.org/rfc/rfc1035.txt). No more than 32
+	// labels can be associated with a cluster.
 	Labels map[string]string `json:"labels,omitempty"`
 
-	// Metrics: Contains cluster daemon metrics such as HDFS and YARN stats.
-	// **Beta Feature**: This report is available for testing purposes only.
-	// It may be changed before final release.
+	// Metrics: Contains cluster daemon metrics such as HDFS and YARN
+	// stats.Beta Feature: This report is available for testing purposes
+	// only. It may be changed before final release.
 	Metrics *ClusterMetrics `json:"metrics,omitempty"`
 
-	// ProjectId: [Required] The Google Cloud Platform project ID that the
+	// ProjectId: Required The Google Cloud Platform project ID that the
 	// cluster belongs to.
 	ProjectId string `json:"projectId,omitempty"`
 
-	// Status: [Output-only] Cluster status.
+	// Status: Output-only Cluster status.
 	Status *ClusterStatus `json:"status,omitempty"`
 
-	// StatusHistory: [Output-only] The previous cluster status.
+	// StatusHistory: Output-only The previous cluster status.
 	StatusHistory []*ClusterStatus `json:"statusHistory,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -204,8 +209,8 @@
 
 // ClusterConfig: The cluster config.
 type ClusterConfig struct {
-	// ConfigBucket: [Optional] A Google Cloud Storage staging bucket used
-	// for sharing generated SSH keys and config. If you do not specify a
+	// ConfigBucket: Optional A Google Cloud Storage staging bucket used for
+	// sharing generated SSH keys and config. If you do not specify a
 	// staging bucket, Cloud Dataproc will determine an appropriate Cloud
 	// Storage location (US, ASIA, or EU) for your cluster's staging bucket
 	// according to the Google Compute Engine zone where your cluster is
@@ -213,34 +218,40 @@
 	// per-location bucket for you.
 	ConfigBucket string `json:"configBucket,omitempty"`
 
-	// GceClusterConfig: [Required] The shared Google Compute Engine config
+	// GceClusterConfig: Required The shared Google Compute Engine config
 	// settings for all instances in a cluster.
 	GceClusterConfig *GceClusterConfig `json:"gceClusterConfig,omitempty"`
 
-	// InitializationActions: [Optional] Commands to execute on each node
+	// InitializationActions: Optional Commands to execute on each node
 	// after config is completed. By default, executables are run on master
-	// and all worker nodes. You can test a node's role metadata to run an
-	// executable on a master or worker node, as shown below using `curl`
-	// (you can also use `wget`): ROLE=$(curl -H Metadata-Flavor:Google
+	// and all worker nodes. You can test a node's <code>role</code>
+	// metadata to run an executable on a master or worker node, as shown
+	// below using curl (you can also use wget):
+	// ROLE=$(curl -H Metadata-Flavor:Google
 	// http://metadata/computeMetadata/v1/instance/attributes/dataproc-role)
-	// if [[ "${ROLE}" == 'Master' ]]; then ... master specific actions ...
-	// else ... worker specific actions ... fi
+	//
+	// if [[ "${ROLE}" == 'Master' ]]; then
+	//   ... master specific actions ...
+	// else
+	//   ... worker specific actions ...
+	// fi
+	//
 	InitializationActions []*NodeInitializationAction `json:"initializationActions,omitempty"`
 
-	// MasterConfig: [Optional] The Google Compute Engine config settings
-	// for the master instance in a cluster.
+	// MasterConfig: Optional The Google Compute Engine config settings for
+	// the master instance in a cluster.
 	MasterConfig *InstanceGroupConfig `json:"masterConfig,omitempty"`
 
-	// SecondaryWorkerConfig: [Optional] The Google Compute Engine config
+	// SecondaryWorkerConfig: Optional The Google Compute Engine config
 	// settings for additional worker instances in a cluster.
 	SecondaryWorkerConfig *InstanceGroupConfig `json:"secondaryWorkerConfig,omitempty"`
 
-	// SoftwareConfig: [Optional] The config settings for software inside
-	// the cluster.
+	// SoftwareConfig: Optional The config settings for software inside the
+	// cluster.
 	SoftwareConfig *SoftwareConfig `json:"softwareConfig,omitempty"`
 
-	// WorkerConfig: [Optional] The Google Compute Engine config settings
-	// for worker instances in a cluster.
+	// WorkerConfig: Optional The Google Compute Engine config settings for
+	// worker instances in a cluster.
 	WorkerConfig *InstanceGroupConfig `json:"workerConfig,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ConfigBucket") to
@@ -267,7 +278,7 @@
 }
 
 // ClusterMetrics: Contains cluster daemon metrics, such as HDFS and
-// YARN stats. **Beta Feature**: This report is available for testing
+// YARN stats.Beta Feature: This report is available for testing
 // purposes only. It may be changed before final release.
 type ClusterMetrics struct {
 	// HdfsMetrics: The HDFS metrics.
@@ -301,27 +312,30 @@
 
 // ClusterOperationMetadata: Metadata describing the operation.
 type ClusterOperationMetadata struct {
-	// ClusterName: [Output-only] Name of the cluster for the operation.
+	// ClusterName: Output-only Name of the cluster for the operation.
 	ClusterName string `json:"clusterName,omitempty"`
 
-	// ClusterUuid: [Output-only] Cluster UUID for the operation.
+	// ClusterUuid: Output-only Cluster UUID for the operation.
 	ClusterUuid string `json:"clusterUuid,omitempty"`
 
-	// Description: [Output-only] Short description of operation.
+	// Description: Output-only Short description of operation.
 	Description string `json:"description,omitempty"`
 
-	// Labels: [Output-only] labels associated with the operation
+	// Labels: Output-only Labels associated with the operation
 	Labels map[string]string `json:"labels,omitempty"`
 
-	// OperationType: [Output-only] The operation type.
+	// OperationType: Output-only The operation type.
 	OperationType string `json:"operationType,omitempty"`
 
-	// Status: [Output-only] Current operation status.
+	// Status: Output-only Current operation status.
 	Status *ClusterOperationStatus `json:"status,omitempty"`
 
-	// StatusHistory: [Output-only] The previous operation status.
+	// StatusHistory: Output-only The previous operation status.
 	StatusHistory []*ClusterOperationStatus `json:"statusHistory,omitempty"`
 
+	// Warnings: Output-only Errors encountered during operation execution.
+	Warnings []string `json:"warnings,omitempty"`
+
 	// ForceSendFields is a list of field names (e.g. "ClusterName") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -347,24 +361,24 @@
 
 // ClusterOperationStatus: The status of the operation.
 type ClusterOperationStatus struct {
-	// Details: [Output-only]A message containing any operation metadata
+	// Details: Output-onlyA message containing any operation metadata
 	// details.
 	Details string `json:"details,omitempty"`
 
-	// InnerState: [Output-only] A message containing the detailed operation
+	// InnerState: Output-only A message containing the detailed operation
 	// state.
 	InnerState string `json:"innerState,omitempty"`
 
-	// State: [Output-only] A message containing the operation state.
+	// State: Output-only A message containing the operation state.
 	//
 	// Possible values:
-	//   "UNKNOWN"
-	//   "PENDING"
-	//   "RUNNING"
-	//   "DONE"
+	//   "UNKNOWN" - Unused.
+	//   "PENDING" - The operation has been created.
+	//   "RUNNING" - The operation is running.
+	//   "DONE" - The operation is done; either cancelled or completed.
 	State string `json:"state,omitempty"`
 
-	// StateStartTime: [Output-only] The time this state was entered.
+	// StateStartTime: Output-only The time this state was entered.
 	StateStartTime string `json:"stateStartTime,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Details") to
@@ -392,21 +406,25 @@
 
 // ClusterStatus: The status of a cluster and its instances.
 type ClusterStatus struct {
-	// Detail: [Output-only] Optional details of cluster's state.
+	// Detail: Output-only Optional details of cluster's state.
 	Detail string `json:"detail,omitempty"`
 
-	// State: [Output-only] The cluster's state.
+	// State: Output-only The cluster's state.
 	//
 	// Possible values:
-	//   "UNKNOWN"
-	//   "CREATING"
-	//   "RUNNING"
-	//   "ERROR"
-	//   "DELETING"
-	//   "UPDATING"
+	//   "UNKNOWN" - The cluster state is unknown.
+	//   "CREATING" - The cluster is being created and set up. It is not
+	// ready for use.
+	//   "RUNNING" - The cluster is currently running and healthy. It is
+	// ready for use.
+	//   "ERROR" - The cluster encountered an error. It is not ready for
+	// use.
+	//   "DELETING" - The cluster is being deleted. It cannot be used.
+	//   "UPDATING" - The cluster is being updated. It continues to accept
+	// and process jobs.
 	State string `json:"state,omitempty"`
 
-	// StateStartTime: [Output-only] Time when this state was entered.
+	// StateStartTime: Output-only Time when this state was entered.
 	StateStartTime string `json:"stateStartTime,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Detail") to
@@ -435,9 +453,9 @@
 // DiagnoseClusterOutputLocation: The location where output from
 // diagnostic command can be found.
 type DiagnoseClusterOutputLocation struct {
-	// OutputUri: [Output-only] The Google Cloud Storage URI of the
-	// diagnostic output. This will be a plain text file with summary of
-	// collected diagnostics.
+	// OutputUri: Output-only The Google Cloud Storage URI of the diagnostic
+	// output. This will be a plain text file with summary of collected
+	// diagnostics.
 	OutputUri string `json:"outputUri,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "OutputUri") to
@@ -470,9 +488,9 @@
 
 // DiagnoseClusterResults: The location of diagnostic output.
 type DiagnoseClusterResults struct {
-	// OutputUri: [Output-only] The Google Cloud Storage URI of the
-	// diagnostic output. The output report is a plain text file with a
-	// summary of collected diagnostics.
+	// OutputUri: Output-only The Google Cloud Storage URI of the diagnostic
+	// output. The output report is a plain text file with a summary of
+	// collected diagnostics.
 	OutputUri string `json:"outputUri,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "OutputUri") to
@@ -501,16 +519,16 @@
 // DiskConfig: Specifies the config of disk options for a group of VM
 // instances.
 type DiskConfig struct {
-	// BootDiskSizeGb: [Optional] Size in GB of the boot disk (default is
+	// BootDiskSizeGb: Optional Size in GB of the boot disk (default is
 	// 500GB).
 	BootDiskSizeGb int64 `json:"bootDiskSizeGb,omitempty"`
 
-	// NumLocalSsds: [Optional] Number of attached SSDs, from 0 to 4
-	// (default is 0). If SSDs are not attached, the boot disk is used to
-	// store runtime logs and
-	// [HDFS](https://hadoop.apache.org/docs/r1.2.1/hdfs_user_guide.html)
-	// data. If one or more SSDs are attached, this runtime bulk data is
-	// spread across them, and the boot disk contains only basic config and
+	// NumLocalSsds: Optional Number of attached SSDs, from 0 to 4 (default
+	// is 0). If SSDs are not attached, the boot disk is used to store
+	// runtime logs and HDFS
+	// (https://hadoop.apache.org/docs/r1.2.1/hdfs_user_guide.html) data. If
+	// one or more SSDs are attached, this runtime bulk data is spread
+	// across them, and the boot disk contains only basic config and
 	// installed binaries.
 	NumLocalSsds int64 `json:"numLocalSsds,omitempty"`
 
@@ -541,9 +559,12 @@
 // Empty: A generic empty message that you can re-use to avoid defining
 // duplicated empty messages in your APIs. A typical example is to use
 // it as the request or the response type of an API method. For
-// instance: service Foo { rpc Bar(google.protobuf.Empty) returns
-// (google.protobuf.Empty); } The JSON representation for `Empty` is
-// empty JSON object `{}`.
+// instance:
+// service Foo {
+//   rpc Bar(google.protobuf.Empty) returns
+// (google.protobuf.Empty);
+// }
+// The JSON representation for Empty is empty JSON object {}.
 type Empty struct {
 	// ServerResponse contains the HTTP response code and headers from the
 	// server.
@@ -554,60 +575,72 @@
 // Compute Engine cluster instances, applicable to all instances in the
 // cluster.
 type GceClusterConfig struct {
-	// InternalIpOnly: [Optional] If true, all instances in the cluster will
+	// InternalIpOnly: Optional If true, all instances in the cluster will
 	// only have internal IP addresses. By default, clusters are not
 	// restricted to internal IP addresses, and will have ephemeral external
-	// IP addresses assigned to each instance. This `internal_ip_only`
+	// IP addresses assigned to each instance. This internal_ip_only
 	// restriction can only be enabled for subnetwork enabled networks, and
 	// all off-cluster dependencies must be configured to be accessible
 	// without external IP addresses.
 	InternalIpOnly bool `json:"internalIpOnly,omitempty"`
 
 	// Metadata: The Google Compute Engine metadata entries to add to all
-	// instances (see [Project and instance
-	// metadata](https://cloud.google.com/compute/docs/storing-retrieving-met
-	// adata#project_and_instance_metadata)).
+	// instances (see Project and instance metadata
+	// (https://cloud.google.com/compute/docs/storing-retrieving-metadata#pro
+	// ject_and_instance_metadata)).
 	Metadata map[string]string `json:"metadata,omitempty"`
 
-	// NetworkUri: [Optional] The Google Compute Engine network to be used
-	// for machine communications. Cannot be specified with subnetwork_uri.
-	// If neither `network_uri` nor `subnetwork_uri` is specified, the
-	// "default" network of the project is used, if it exists. Cannot be a
-	// "Custom Subnet Network" (see [Using
-	// Subnetworks](/compute/docs/subnetworks) for more information).
+	// NetworkUri: Optional The Google Compute Engine network to be used for
+	// machine communications. Cannot be specified with subnetwork_uri. If
+	// neither network_uri nor subnetwork_uri is specified, the "default"
+	// network of the project is used, if it exists. Cannot be a "Custom
+	// Subnet Network" (see Using Subnetworks for more information).
 	// Example:
-	// `https://www.googleapis.com/compute/v1/projects/[project_id]/regions/g
-	// lobal/default`.
+	// https://www.googleapis.com/compute/v1/projects/[project_id]/regions/global/default.
 	NetworkUri string `json:"networkUri,omitempty"`
 
-	// ServiceAccountScopes: [Optional] The URIs of service account scopes
-	// to be included in Google Compute Engine instances. The following base
-	// set of scopes is always included: *
-	// https://www.googleapis.com/auth/cloud.useraccounts.readonly *
-	// https://www.googleapis.com/auth/devstorage.read_write *
-	// https://www.googleapis.com/auth/logging.write If no scopes are
-	// specified, the following defaults are also provided: *
-	// https://www.googleapis.com/auth/bigquery *
-	// https://www.googleapis.com/auth/bigtable.admin.table *
-	// https://www.googleapis.com/auth/bigtable.data *
+	// ServiceAccount: Optional The service account of the instances.
+	// Defaults to the default Google Compute Engine service account. Custom
+	// service accounts need permissions equivalent to the folloing IAM
+	// roles:
+	// roles/logging.logWriter
+	// roles/storage.objectAdmin(see
+	// https://cloud.google.com/compute/docs/access/service-accounts#custom_service_accounts for more information). Example:
+	// [account_id]@[project_id].iam.gserviceaccount.com
+	ServiceAccount string `json:"serviceAccount,omitempty"`
+
+	// ServiceAccountScopes: Optional The URIs of service account scopes to
+	// be included in Google Compute Engine instances. The following base
+	// set of scopes is always
+	// included:
+	// https://www.googleapis.com/auth/cloud.useraccounts.readonly
+	//
+	// https://www.googleapis.com/auth/devstorage.read_write
+	// https://www.goog
+	// leapis.com/auth/logging.writeIf no scopes are specified, the
+	// following defaults are also
+	// provided:
+	// https://www.googleapis.com/auth/bigquery
+	// https://www.googlea
+	// pis.com/auth/bigtable.admin.table
+	// https://www.googleapis.com/auth/bigt
+	// able.data
 	// https://www.googleapis.com/auth/devstorage.full_control
 	ServiceAccountScopes []string `json:"serviceAccountScopes,omitempty"`
 
-	// SubnetworkUri: [Optional] The Google Compute Engine subnetwork to be
+	// SubnetworkUri: Optional The Google Compute Engine subnetwork to be
 	// used for machine communications. Cannot be specified with
 	// network_uri. Example:
-	// `https://www.googleapis.com/compute/v1/projects/[project_id]/regions/u
-	// s-east1/sub0`.
+	// https://www.googleapis.com/compute/v1/projects/[project_id]/regions/us-east1/sub0.
 	SubnetworkUri string `json:"subnetworkUri,omitempty"`
 
 	// Tags: The Google Compute Engine tags to add to all instances (see
-	// [Tagging instances](/compute/docs/label-or-tag-resources#tags)).
+	// Tagging instances).
 	Tags []string `json:"tags,omitempty"`
 
-	// ZoneUri: [Required] The zone where the Google Compute Engine cluster
+	// ZoneUri: Required The zone where the Google Compute Engine cluster
 	// will be located. Example:
-	// `https://www.googleapis.com/compute/v1/projects/[project_id]/zones/[zo
-	// ne]`.
+	// https://www.googleapis.com/compute/v1/projects/[project_id]/zones/[zone].
 	ZoneUri string `json:"zoneUri,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "InternalIpOnly") to
@@ -634,39 +667,39 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// HadoopJob: A Cloud Dataproc job for running [Apache Hadoop
-// MapReduce](https://hadoop.apache.org/docs/current/hadoop-mapreduce-cli
-// ent/hadoop-mapreduce-client-core/MapReduceTutorial.html) jobs on
-// [Apache Hadoop
-// YARN](https://hadoop.apache.org/docs/r2.7.1/hadoop-yarn/hadoop-yarn-si
-// te/YARN.html).
+// HadoopJob: A Cloud Dataproc job for running Apache Hadoop MapReduce
+// (https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop
+// -mapreduce-client-core/MapReduceTutorial.html) jobs on Apache Hadoop
+// YARN
+// (https://hadoop.apache.org/docs/r2.7.1/hadoop-yarn/hadoop-yarn-site/YA
+// RN.html).
 type HadoopJob struct {
-	// ArchiveUris: [Optional] HCFS URIs of archives to be extracted in the
+	// ArchiveUris: Optional HCFS URIs of archives to be extracted in the
 	// working directory of Hadoop drivers and tasks. Supported file types:
 	// .jar, .tar, .tar.gz, .tgz, or .zip.
 	ArchiveUris []string `json:"archiveUris,omitempty"`
 
-	// Args: [Optional] The arguments to pass to the driver. Do not include
-	// arguments, such as `-libjars` or `-Dfoo=bar`, that can be set as job
+	// Args: Optional The arguments to pass to the driver. Do not include
+	// arguments, such as -libjars or -Dfoo=bar, that can be set as job
 	// properties, since a collision may occur that causes an incorrect job
 	// submission.
 	Args []string `json:"args,omitempty"`
 
-	// FileUris: [Optional] HCFS (Hadoop Compatible Filesystem) URIs of
-	// files to be copied to the working directory of Hadoop drivers and
+	// FileUris: Optional HCFS (Hadoop Compatible Filesystem) URIs of files
+	// to be copied to the working directory of Hadoop drivers and
 	// distributed tasks. Useful for naively parallel tasks.
 	FileUris []string `json:"fileUris,omitempty"`
 
-	// JarFileUris: [Optional] Jar file URIs to add to the CLASSPATHs of the
+	// JarFileUris: Optional Jar file URIs to add to the CLASSPATHs of the
 	// Hadoop driver and tasks.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfig: [Optional] The runtime log config for job execution.
+	// LoggingConfig: Optional The runtime log config for job execution.
 	LoggingConfig *LoggingConfig `json:"loggingConfig,omitempty"`
 
 	// MainClass: The name of the driver's main class. The jar file
 	// containing the class must be in the default CLASSPATH or specified in
-	// `jar_file_uris`.
+	// jar_file_uris.
 	MainClass string `json:"mainClass,omitempty"`
 
 	// MainJarFileUri: The HCFS URI of the jar file containing the main
@@ -676,7 +709,7 @@
 	// 'file:///home/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar'
 	MainJarFileUri string `json:"mainJarFileUri,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure Hadoop. Properties that conflict with values set by the
 	// Cloud Dataproc API may be overwritten. Can include properties set in
 	// /etc/hadoop/conf/*-site and classes in user code.
@@ -705,22 +738,22 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// HiveJob: A Cloud Dataproc job for running [Apache
-// Hive](https://hive.apache.org/) queries on YARN.
+// HiveJob: A Cloud Dataproc job for running Apache Hive
+// (https://hive.apache.org/) queries on YARN.
 type HiveJob struct {
-	// ContinueOnFailure: [Optional] Whether to continue executing queries
-	// if a query fails. The default value is `false`. Setting to `true` can
-	// be useful when executing independent parallel queries.
+	// ContinueOnFailure: Optional Whether to continue executing queries if
+	// a query fails. The default value is false. Setting to true can be
+	// useful when executing independent parallel queries.
 	ContinueOnFailure bool `json:"continueOnFailure,omitempty"`
 
-	// JarFileUris: [Optional] HCFS URIs of jar files to add to the
-	// CLASSPATH of the Hive server and Hadoop MapReduce (MR) tasks. Can
-	// contain Hive SerDes and UDFs.
+	// JarFileUris: Optional HCFS URIs of jar files to add to the CLASSPATH
+	// of the Hive server and Hadoop MapReduce (MR) tasks. Can contain Hive
+	// SerDes and UDFs.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// Properties: [Optional] A mapping of property names and values, used
-	// to configure Hive. Properties that conflict with values set by the
-	// Cloud Dataproc API may be overwritten. Can include properties set in
+	// Properties: Optional A mapping of property names and values, used to
+	// configure Hive. Properties that conflict with values set by the Cloud
+	// Dataproc API may be overwritten. Can include properties set in
 	// /etc/hadoop/conf/*-site.xml, /etc/hive/conf/hive-site.xml, and
 	// classes in user code.
 	Properties map[string]string `json:"properties,omitempty"`
@@ -731,8 +764,8 @@
 	// QueryList: A list of queries.
 	QueryList *QueryList `json:"queryList,omitempty"`
 
-	// ScriptVariables: [Optional] Mapping of query variable names to values
-	// (equivalent to the Hive command: `SET name="value";`).
+	// ScriptVariables: Optional Mapping of query variable names to values
+	// (equivalent to the Hive command: SET name="value";).
 	ScriptVariables map[string]string `json:"scriptVariables,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ContinueOnFailure")
@@ -759,39 +792,38 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// InstanceGroupConfig: [Optional] The config settings for Google
-// Compute Engine resources in an instance group, such as a master or
-// worker group.
+// InstanceGroupConfig: Optional The config settings for Google Compute
+// Engine resources in an instance group, such as a master or worker
+// group.
 type InstanceGroupConfig struct {
-	// DiskConfig: [Optional] Disk option config settings.
+	// DiskConfig: Optional Disk option config settings.
 	DiskConfig *DiskConfig `json:"diskConfig,omitempty"`
 
-	// ImageUri: [Output-only] The Google Compute Engine image resource used
-	// for cluster instances. Inferred from `SoftwareConfig.image_version`.
+	// ImageUri: Output-only The Google Compute Engine image resource used
+	// for cluster instances. Inferred from SoftwareConfig.image_version.
 	ImageUri string `json:"imageUri,omitempty"`
 
-	// InstanceNames: [Optional] The list of instance names. Cloud Dataproc
-	// derives the names from `cluster_name`, `num_instances`, and the
-	// instance group if not set by user (recommended practice is to let
-	// Cloud Dataproc derive the name).
+	// InstanceNames: Optional The list of instance names. Cloud Dataproc
+	// derives the names from cluster_name, num_instances, and the instance
+	// group if not set by user (recommended practice is to let Cloud
+	// Dataproc derive the name).
 	InstanceNames []string `json:"instanceNames,omitempty"`
 
-	// IsPreemptible: [Optional] Specifies that this instance group contains
+	// IsPreemptible: Optional Specifies that this instance group contains
 	// preemptible instances.
 	IsPreemptible bool `json:"isPreemptible,omitempty"`
 
-	// MachineTypeUri: [Required] The Google Compute Engine machine type
-	// used for cluster instances. Example:
-	// `https://www.googleapis.com/compute/v1/projects/[project_id]/zones/us-
-	// east1-a/machineTypes/n1-standard-2`.
+	// MachineTypeUri: Required The Google Compute Engine machine type used
+	// for cluster instances. Example:
+	// https://www.googleapis.com/compute/v1/projects/[project_id]/zones/us-east1-a/machineTypes/n1-standard-2.
 	MachineTypeUri string `json:"machineTypeUri,omitempty"`
 
-	// ManagedGroupConfig: [Output-only] The config for Google Compute
-	// Engine Instance Group Manager that manages this group. This is only
-	// used for preemptible instance groups.
+	// ManagedGroupConfig: Output-only The config for Google Compute Engine
+	// Instance Group Manager that manages this group. This is only used for
+	// preemptible instance groups.
 	ManagedGroupConfig *ManagedGroupConfig `json:"managedGroupConfig,omitempty"`
 
-	// NumInstances: [Required] The number of VM instances in the instance
+	// NumInstances: Required The number of VM instances in the instance
 	// group. For master instance groups, must be set to 1.
 	NumInstances int64 `json:"numInstances,omitempty"`
 
@@ -820,13 +852,13 @@
 
 // Job: A Cloud Dataproc job resource.
 type Job struct {
-	// DriverControlFilesUri: [Output-only] If present, the location of
+	// DriverControlFilesUri: Output-only If present, the location of
 	// miscellaneous control files which may be used as part of job setup
 	// and handling. If not present, control files may be placed in the same
-	// location as `driver_output_uri`.
+	// location as driver_output_uri.
 	DriverControlFilesUri string `json:"driverControlFilesUri,omitempty"`
 
-	// DriverOutputResourceUri: [Output-only] A URI pointing to the location
+	// DriverOutputResourceUri: Output-only A URI pointing to the location
 	// of the stdout of the job's driver program.
 	DriverOutputResourceUri string `json:"driverOutputResourceUri,omitempty"`
 
@@ -836,46 +868,49 @@
 	// HiveJob: Job is a Hive job.
 	HiveJob *HiveJob `json:"hiveJob,omitempty"`
 
-	// Labels: [Optional] The labels to associate with this job. Label
-	// **keys** must contain 1 to 63 characters, and must conform to [RFC
-	// 1035](https://www.ietf.org/rfc/rfc1035.txt). Label **values** may be
-	// empty, but, if present, must contain 1 to 63 characters, and must
-	// conform to [RFC 1035](https://www.ietf.org/rfc/rfc1035.txt). No more
-	// than 32 labels can be associated with a job.
+	// Labels: Optional The labels to associate with this job. Label keys
+	// must contain 1 to 63 characters, and must conform to RFC 1035
+	// (https://www.ietf.org/rfc/rfc1035.txt). Label values may be empty,
+	// but, if present, must contain 1 to 63 characters, and must conform to
+	// RFC 1035 (https://www.ietf.org/rfc/rfc1035.txt). No more than 32
+	// labels can be associated with a job.
 	Labels map[string]string `json:"labels,omitempty"`
 
 	// PigJob: Job is a Pig job.
 	PigJob *PigJob `json:"pigJob,omitempty"`
 
-	// Placement: [Required] Job information, including how, when, and where
+	// Placement: Required Job information, including how, when, and where
 	// to run the job.
 	Placement *JobPlacement `json:"placement,omitempty"`
 
 	// PysparkJob: Job is a Pyspark job.
 	PysparkJob *PySparkJob `json:"pysparkJob,omitempty"`
 
-	// Reference: [Optional] The fully qualified reference to the job, which
+	// Reference: Optional The fully qualified reference to the job, which
 	// can be used to obtain the equivalent REST path of the job resource.
 	// If this property is not specified when a job is created, the server
-	// generates a job_id.
+	// generates a <code>job_id</code>.
 	Reference *JobReference `json:"reference,omitempty"`
 
+	// Scheduling: Optional Job scheduling configuration.
+	Scheduling *JobScheduling `json:"scheduling,omitempty"`
+
 	// SparkJob: Job is a Spark job.
 	SparkJob *SparkJob `json:"sparkJob,omitempty"`
 
 	// SparkSqlJob: Job is a SparkSql job.
 	SparkSqlJob *SparkSqlJob `json:"sparkSqlJob,omitempty"`
 
-	// Status: [Output-only] The job status. Additional application-specific
-	// status information may be contained in the type_job and
-	// yarn_applications fields.
+	// Status: Output-only The job status. Additional application-specific
+	// status information may be contained in the <code>type_job</code> and
+	// <code>yarn_applications</code> fields.
 	Status *JobStatus `json:"status,omitempty"`
 
-	// StatusHistory: [Output-only] The previous job status.
+	// StatusHistory: Output-only The previous job status.
 	StatusHistory []*JobStatus `json:"statusHistory,omitempty"`
 
-	// YarnApplications: [Output-only] The collection of YARN applications
-	// spun up by this job. **Beta** Feature: This report is available for
+	// YarnApplications: Output-only The collection of YARN applications
+	// spun up by this job.Beta Feature: This report is available for
 	// testing purposes only. It may be changed before final release.
 	YarnApplications []*YarnApplication `json:"yarnApplications,omitempty"`
 
@@ -910,11 +945,11 @@
 
 // JobPlacement: Cloud Dataproc job config.
 type JobPlacement struct {
-	// ClusterName: [Required] The name of the cluster where the job will be
+	// ClusterName: Required The name of the cluster where the job will be
 	// submitted.
 	ClusterName string `json:"clusterName,omitempty"`
 
-	// ClusterUuid: [Output-only] A cluster UUID generated by the Cloud
+	// ClusterUuid: Output-only A cluster UUID generated by the Cloud
 	// Dataproc service when the job is submitted.
 	ClusterUuid string `json:"clusterUuid,omitempty"`
 
@@ -943,16 +978,16 @@
 
 // JobReference: Encapsulates the full scoping used to reference a job.
 type JobReference struct {
-	// JobId: [Optional] The job ID, which must be unique within the
-	// project. The job ID is generated by the server upon job submission or
-	// provided by the user as a means to perform retries without creating
-	// duplicate jobs. The ID must contain only letters (a-z, A-Z), numbers
-	// (0-9), underscores (_), or hyphens (-). The maximum length is 512
+	// JobId: Optional The job ID, which must be unique within the project.
+	// The job ID is generated by the server upon job submission or provided
+	// by the user as a means to perform retries without creating duplicate
+	// jobs. The ID must contain only letters (a-z, A-Z), numbers (0-9),
+	// underscores (_), or hyphens (-). The maximum length is 512
 	// characters.
 	JobId string `json:"jobId,omitempty"`
 
-	// ProjectId: [Required] The ID of the Google Cloud Platform project
-	// that the job belongs to.
+	// ProjectId: Required The ID of the Google Cloud Platform project that
+	// the job belongs to.
 	ProjectId string `json:"projectId,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "JobId") to
@@ -978,28 +1013,70 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// JobScheduling: Job scheduling options.Beta Feature: These options are
+// available for testing purposes only. They may be changed before final
+// release.
+type JobScheduling struct {
+	// MaxFailuresPerHour: Optional Maximum number of times per hour a
+	// driver may be restarted as a result of driver terminating with
+	// non-zero code before job is reported failed.A job may be reported as
+	// thrashing if driver exits with non-zero code 4 times within 10 minute
+	// window.Maximum value is 10.
+	MaxFailuresPerHour int64 `json:"maxFailuresPerHour,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "MaxFailuresPerHour")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "MaxFailuresPerHour") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *JobScheduling) MarshalJSON() ([]byte, error) {
+	type noMethod JobScheduling
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // JobStatus: Cloud Dataproc job status.
 type JobStatus struct {
-	// Details: [Output-only] Optional job state details, such as an error
-	// description if the state is ERROR.
+	// Details: Output-only Optional job state details, such as an error
+	// description if the state is <code>ERROR</code>.
 	Details string `json:"details,omitempty"`
 
-	// State: [Output-only] A state message specifying the overall job
-	// state.
+	// State: Output-only A state message specifying the overall job state.
 	//
 	// Possible values:
-	//   "STATE_UNSPECIFIED"
-	//   "PENDING"
-	//   "SETUP_DONE"
-	//   "RUNNING"
-	//   "CANCEL_PENDING"
-	//   "CANCEL_STARTED"
-	//   "CANCELLED"
-	//   "DONE"
-	//   "ERROR"
+	//   "STATE_UNSPECIFIED" - The job state is unknown.
+	//   "PENDING" - The job is pending; it has been submitted, but is not
+	// yet running.
+	//   "SETUP_DONE" - Job has been received by the service and completed
+	// initial setup; it will soon be submitted to the cluster.
+	//   "RUNNING" - The job is running on the cluster.
+	//   "CANCEL_PENDING" - A CancelJob request has been received, but is
+	// pending.
+	//   "CANCEL_STARTED" - Transient in-flight resources have been
+	// canceled, and the request to cancel the running job has been issued
+	// to the cluster.
+	//   "CANCELLED" - The job cancellation was successful.
+	//   "DONE" - The job has completed successfully.
+	//   "ERROR" - The job has completed, but encountered an error.
+	//   "ATTEMPT_FAILURE" - Job attempt has failed. The detail field
+	// contains failure details for this attempt.Applies to restartable jobs
+	// only.
 	State string `json:"state,omitempty"`
 
-	// StateStartTime: [Output-only] The time when this state was entered.
+	// StateStartTime: Output-only The time when this state was entered.
 	StateStartTime string `json:"stateStartTime,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Details") to
@@ -1027,13 +1104,13 @@
 
 // ListClustersResponse: The list of all clusters in a project.
 type ListClustersResponse struct {
-	// Clusters: [Output-only] The clusters in the project.
+	// Clusters: Output-only The clusters in the project.
 	Clusters []*Cluster `json:"clusters,omitempty"`
 
-	// NextPageToken: [Output-only] This token is included in the response
-	// if there are more results to fetch. To fetch additional results,
-	// provide this value as the `page_token` in a subsequent
-	// ListClustersRequest.
+	// NextPageToken: Output-only This token is included in the response if
+	// there are more results to fetch. To fetch additional results, provide
+	// this value as the page_token in a subsequent
+	// <code>ListClustersRequest</code>.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -1065,12 +1142,13 @@
 
 // ListJobsResponse: A list of jobs in a project.
 type ListJobsResponse struct {
-	// Jobs: [Output-only] Jobs list.
+	// Jobs: Output-only Jobs list.
 	Jobs []*Job `json:"jobs,omitempty"`
 
-	// NextPageToken: [Optional] This token is included in the response if
+	// NextPageToken: Optional This token is included in the response if
 	// there are more results to fetch. To fetch additional results, provide
-	// this value as the `page_token` in a subsequent ListJobsRequest.
+	// this value as the page_token in a subsequent
+	// <code>ListJobsRequest</code>.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -1171,11 +1249,11 @@
 // ManagedGroupConfig: Specifies the resources used to actively manage
 // an instance group.
 type ManagedGroupConfig struct {
-	// InstanceGroupManagerName: [Output-only] The name of the Instance
-	// Group Manager for this group.
+	// InstanceGroupManagerName: Output-only The name of the Instance Group
+	// Manager for this group.
 	InstanceGroupManagerName string `json:"instanceGroupManagerName,omitempty"`
 
-	// InstanceTemplateName: [Output-only] The name of the Instance Template
+	// InstanceTemplateName: Output-only The name of the Instance Template
 	// used for the Managed Instance Group.
 	InstanceTemplateName string `json:"instanceTemplateName,omitempty"`
 
@@ -1207,15 +1285,14 @@
 // NodeInitializationAction: Specifies an executable to run on a fully
 // configured node and a timeout period for executable completion.
 type NodeInitializationAction struct {
-	// ExecutableFile: [Required] Google Cloud Storage URI of executable
-	// file.
+	// ExecutableFile: Required Google Cloud Storage URI of executable file.
 	ExecutableFile string `json:"executableFile,omitempty"`
 
-	// ExecutionTimeout: [Optional] Amount of time executable has to
-	// complete. Default is 10 minutes. Cluster creation fails with an
-	// explanatory error message (the name of the executable that caused the
-	// error and the exceeded timeout period) if the executable is not
-	// completed at end of the timeout period.
+	// ExecutionTimeout: Optional Amount of time executable has to complete.
+	// Default is 10 minutes. Cluster creation fails with an explanatory
+	// error message (the name of the executable that caused the error and
+	// the exceeded timeout period) if the executable is not completed at
+	// end of the timeout period.
 	ExecutionTimeout string `json:"executionTimeout,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ExecutableFile") to
@@ -1245,9 +1322,9 @@
 // Operation: This resource represents a long-running operation that is
 // the result of a network API call.
 type Operation struct {
-	// Done: If the value is `false`, it means the operation is still in
-	// progress. If true, the operation is completed, and either `error` or
-	// `response` is available.
+	// Done: If the value is false, it means the operation is still in
+	// progress. If true, the operation is completed, and either error or
+	// response is available.
 	Done bool `json:"done,omitempty"`
 
 	// Error: The error result of the operation in case of failure or
@@ -1263,18 +1340,17 @@
 
 	// Name: The server-assigned name, which is only unique within the same
 	// service that originally returns it. If you use the default HTTP
-	// mapping, the `name` should have the format of
-	// `operations/some/unique/name`.
+	// mapping, the name should have the format of
+	// operations/some/unique/name.
 	Name string `json:"name,omitempty"`
 
 	// Response: The normal response of the operation in case of success. If
-	// the original method returns no data on success, such as `Delete`, the
-	// response is `google.protobuf.Empty`. If the original method is
-	// standard `Get`/`Create`/`Update`, the response should be the
-	// resource. For other methods, the response should have the type
-	// `XxxResponse`, where `Xxx` is the original method name. For example,
-	// if the original method name is `TakeSnapshot()`, the inferred
-	// response type is `TakeSnapshotResponse`.
+	// the original method returns no data on success, such as Delete, the
+	// response is google.protobuf.Empty. If the original method is standard
+	// Get/Create/Update, the response should be the resource. For other
+	// methods, the response should have the type XxxResponse, where Xxx is
+	// the original method name. For example, if the original method name is
+	// TakeSnapshot(), the inferred response type is TakeSnapshotResponse.
 	Response googleapi.RawMessage `json:"response,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -1312,7 +1388,7 @@
 	// ClusterUuid: Cluster UUId for the operation.
 	ClusterUuid string `json:"clusterUuid,omitempty"`
 
-	// Description: [Output-only] Short description of operation.
+	// Description: Output-only Short description of operation.
 	Description string `json:"description,omitempty"`
 
 	// Details: A message containing any operation metadata details.
@@ -1327,7 +1403,7 @@
 	// InsertTime: The time that the operation was requested.
 	InsertTime string `json:"insertTime,omitempty"`
 
-	// OperationType: [Output-only] The operation type.
+	// OperationType: Output-only The operation type.
 	OperationType string `json:"operationType,omitempty"`
 
 	// StartTime: The time that the operation was started by the server.
@@ -1336,18 +1412,21 @@
 	// State: A message containing the operation state.
 	//
 	// Possible values:
-	//   "UNKNOWN"
-	//   "PENDING"
-	//   "RUNNING"
-	//   "DONE"
+	//   "UNKNOWN" - Unused.
+	//   "PENDING" - The operation has been created.
+	//   "RUNNING" - The operation is currently running.
+	//   "DONE" - The operation is done, either cancelled or completed.
 	State string `json:"state,omitempty"`
 
-	// Status: [Output-only] Current operation status.
+	// Status: Output-only Current operation status.
 	Status *OperationStatus `json:"status,omitempty"`
 
-	// StatusHistory: [Output-only] Previous operation status.
+	// StatusHistory: Output-only Previous operation status.
 	StatusHistory []*OperationStatus `json:"statusHistory,omitempty"`
 
+	// Warnings: Output-only Errors encountered during operation execution.
+	Warnings []string `json:"warnings,omitempty"`
+
 	// ForceSendFields is a list of field names (e.g. "ClusterName") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -1382,10 +1461,10 @@
 	// State: A message containing the operation state.
 	//
 	// Possible values:
-	//   "UNKNOWN"
-	//   "PENDING"
-	//   "RUNNING"
-	//   "DONE"
+	//   "UNKNOWN" - Unused.
+	//   "PENDING" - The operation has been created.
+	//   "RUNNING" - The operation is running.
+	//   "DONE" - The operation is done; either cancelled or completed.
 	State string `json:"state,omitempty"`
 
 	// StateStartTime: The time this state was entered.
@@ -1414,23 +1493,23 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// PigJob: A Cloud Dataproc job for running [Apache
-// Pig](https://pig.apache.org/) queries on YARN.
+// PigJob: A Cloud Dataproc job for running Apache Pig
+// (https://pig.apache.org/) queries on YARN.
 type PigJob struct {
-	// ContinueOnFailure: [Optional] Whether to continue executing queries
-	// if a query fails. The default value is `false`. Setting to `true` can
-	// be useful when executing independent parallel queries.
+	// ContinueOnFailure: Optional Whether to continue executing queries if
+	// a query fails. The default value is false. Setting to true can be
+	// useful when executing independent parallel queries.
 	ContinueOnFailure bool `json:"continueOnFailure,omitempty"`
 
-	// JarFileUris: [Optional] HCFS URIs of jar files to add to the
-	// CLASSPATH of the Pig Client and Hadoop MapReduce (MR) tasks. Can
-	// contain Pig UDFs.
+	// JarFileUris: Optional HCFS URIs of jar files to add to the CLASSPATH
+	// of the Pig Client and Hadoop MapReduce (MR) tasks. Can contain Pig
+	// UDFs.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfig: [Optional] The runtime log config for job execution.
+	// LoggingConfig: Optional The runtime log config for job execution.
 	LoggingConfig *LoggingConfig `json:"loggingConfig,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure Pig. Properties that conflict with values set by the Cloud
 	// Dataproc API may be overwritten. Can include properties set in
 	// /etc/hadoop/conf/*-site.xml, /etc/pig/conf/pig.properties, and
@@ -1444,8 +1523,8 @@
 	// QueryList: A list of queries.
 	QueryList *QueryList `json:"queryList,omitempty"`
 
-	// ScriptVariables: [Optional] Mapping of query variable names to values
-	// (equivalent to the Pig command: `name=[value]`).
+	// ScriptVariables: Optional Mapping of query variable names to values
+	// (equivalent to the Pig command: name=[value]).
 	ScriptVariables map[string]string `json:"scriptVariables,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ContinueOnFailure")
@@ -1472,42 +1551,42 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// PySparkJob: A Cloud Dataproc job for running [Apache
-// PySpark](https://spark.apache.org/docs/0.9.0/python-programming-guide.
-// html) applications on YARN.
+// PySparkJob: A Cloud Dataproc job for running Apache PySpark
+// (https://spark.apache.org/docs/0.9.0/python-programming-guide.html)
+// applications on YARN.
 type PySparkJob struct {
-	// ArchiveUris: [Optional] HCFS URIs of archives to be extracted in the
+	// ArchiveUris: Optional HCFS URIs of archives to be extracted in the
 	// working directory of .jar, .tar, .tar.gz, .tgz, and .zip.
 	ArchiveUris []string `json:"archiveUris,omitempty"`
 
-	// Args: [Optional] The arguments to pass to the driver. Do not include
-	// arguments, such as `--conf`, that can be set as job properties, since
-	// a collision may occur that causes an incorrect job submission.
+	// Args: Optional The arguments to pass to the driver. Do not include
+	// arguments, such as --conf, that can be set as job properties, since a
+	// collision may occur that causes an incorrect job submission.
 	Args []string `json:"args,omitempty"`
 
-	// FileUris: [Optional] HCFS URIs of files to be copied to the working
+	// FileUris: Optional HCFS URIs of files to be copied to the working
 	// directory of Python drivers and distributed tasks. Useful for naively
 	// parallel tasks.
 	FileUris []string `json:"fileUris,omitempty"`
 
-	// JarFileUris: [Optional] HCFS URIs of jar files to add to the
-	// CLASSPATHs of the Python driver and tasks.
+	// JarFileUris: Optional HCFS URIs of jar files to add to the CLASSPATHs
+	// of the Python driver and tasks.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfig: [Optional] The runtime log config for job execution.
+	// LoggingConfig: Optional The runtime log config for job execution.
 	LoggingConfig *LoggingConfig `json:"loggingConfig,omitempty"`
 
-	// MainPythonFileUri: [Required] The HCFS URI of the main Python file to
+	// MainPythonFileUri: Required The HCFS URI of the main Python file to
 	// use as the driver. Must be a .py file.
 	MainPythonFileUri string `json:"mainPythonFileUri,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure PySpark. Properties that conflict with values set by the
 	// Cloud Dataproc API may be overwritten. Can include properties set in
 	// /etc/spark/conf/spark-defaults.conf and classes in user code.
 	Properties map[string]string `json:"properties,omitempty"`
 
-	// PythonFileUris: [Optional] HCFS file URIs of Python files to pass to
+	// PythonFileUris: Optional HCFS file URIs of Python files to pass to
 	// the PySpark framework. Supported file types: .py, .egg, and .zip.
 	PythonFileUris []string `json:"pythonFileUris,omitempty"`
 
@@ -1536,12 +1615,21 @@
 
 // QueryList: A list of queries to run on a cluster.
 type QueryList struct {
-	// Queries: [Required] The queries to execute. You do not need to
+	// Queries: Required The queries to execute. You do not need to
 	// terminate a query with a semicolon. Multiple queries can be specified
 	// in one string by separating each with a semicolon. Here is an example
 	// of an Cloud Dataproc API snippet that uses a QueryList to specify a
-	// HiveJob: "hiveJob": { "queryList": { "queries": [ "query1", "query2",
-	// "query3;query4", ] } }
+	// HiveJob:
+	// "hiveJob": {
+	//   "queryList": {
+	//     "queries": [
+	//       "query1",
+	//       "query2",
+	//       "query3;query4",
+	//     ]
+	//   }
+	// }
+	//
 	Queries []string `json:"queries,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Queries") to
@@ -1570,18 +1658,22 @@
 // SoftwareConfig: Specifies the selection and config of software inside
 // the cluster.
 type SoftwareConfig struct {
-	// ImageVersion: [Optional] The version of software inside the cluster.
-	// It must match the regular expression `[0-9]+\.[0-9]+`. If
-	// unspecified, it defaults to the latest version (see [Cloud Dataproc
-	// Versioning](/dataproc/versioning)).
+	// ImageVersion: Optional The version of software inside the cluster. It
+	// must match the regular expression [0-9]+\.[0-9]+. If unspecified, it
+	// defaults to the latest version (see Cloud Dataproc Versioning).
 	ImageVersion string `json:"imageVersion,omitempty"`
 
-	// Properties: [Optional] The properties to set on daemon config files.
-	// Property keys are specified in `prefix:property` format, such as
-	// `core:fs.defaultFS`. The following are supported prefixes and their
-	// mappings: * core: `core-site.xml` * hdfs: `hdfs-site.xml` * mapred:
-	// `mapred-site.xml` * yarn: `yarn-site.xml` * hive: `hive-site.xml` *
-	// pig: `pig.properties` * spark: `spark-defaults.conf`
+	// Properties: Optional The properties to set on daemon config
+	// files.Property keys are specified in prefix:property format, such as
+	// core:fs.defaultFS. The following are supported prefixes and their
+	// mappings:
+	// core: core-site.xml
+	// hdfs: hdfs-site.xml
+	// mapred: mapred-site.xml
+	// yarn: yarn-site.xml
+	// hive: hive-site.xml
+	// pig: pig.properties
+	// spark: spark-defaults.conf
 	Properties map[string]string `json:"properties,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ImageVersion") to
@@ -1607,41 +1699,41 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// SparkJob: A Cloud Dataproc job for running [Apache
-// Spark](http://spark.apache.org/) applications on YARN.
+// SparkJob: A Cloud Dataproc job for running Apache Spark
+// (http://spark.apache.org/) applications on YARN.
 type SparkJob struct {
-	// ArchiveUris: [Optional] HCFS URIs of archives to be extracted in the
+	// ArchiveUris: Optional HCFS URIs of archives to be extracted in the
 	// working directory of Spark drivers and tasks. Supported file types:
 	// .jar, .tar, .tar.gz, .tgz, and .zip.
 	ArchiveUris []string `json:"archiveUris,omitempty"`
 
-	// Args: [Optional] The arguments to pass to the driver. Do not include
-	// arguments, such as `--conf`, that can be set as job properties, since
-	// a collision may occur that causes an incorrect job submission.
+	// Args: Optional The arguments to pass to the driver. Do not include
+	// arguments, such as --conf, that can be set as job properties, since a
+	// collision may occur that causes an incorrect job submission.
 	Args []string `json:"args,omitempty"`
 
-	// FileUris: [Optional] HCFS URIs of files to be copied to the working
+	// FileUris: Optional HCFS URIs of files to be copied to the working
 	// directory of Spark drivers and distributed tasks. Useful for naively
 	// parallel tasks.
 	FileUris []string `json:"fileUris,omitempty"`
 
-	// JarFileUris: [Optional] HCFS URIs of jar files to add to the
-	// CLASSPATHs of the Spark driver and tasks.
+	// JarFileUris: Optional HCFS URIs of jar files to add to the CLASSPATHs
+	// of the Spark driver and tasks.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfig: [Optional] The runtime log config for job execution.
+	// LoggingConfig: Optional The runtime log config for job execution.
 	LoggingConfig *LoggingConfig `json:"loggingConfig,omitempty"`
 
 	// MainClass: The name of the driver's main class. The jar file that
 	// contains the class must be in the default CLASSPATH or specified in
-	// `jar_file_uris`.
+	// jar_file_uris.
 	MainClass string `json:"mainClass,omitempty"`
 
 	// MainJarFileUri: The HCFS URI of the jar file that contains the main
 	// class.
 	MainJarFileUri string `json:"mainJarFileUri,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure Spark. Properties that conflict with values set by the
 	// Cloud Dataproc API may be overwritten. Can include properties set in
 	// /etc/spark/conf/spark-defaults.conf and classes in user code.
@@ -1670,17 +1762,17 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// SparkSqlJob: A Cloud Dataproc job for running [Apache Spark
-// SQL](http://spark.apache.org/sql/) queries.
+// SparkSqlJob: A Cloud Dataproc job for running Apache Spark SQL
+// (http://spark.apache.org/sql/) queries.
 type SparkSqlJob struct {
-	// JarFileUris: [Optional] HCFS URIs of jar files to be added to the
-	// Spark CLASSPATH.
+	// JarFileUris: Optional HCFS URIs of jar files to be added to the Spark
+	// CLASSPATH.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfig: [Optional] The runtime log config for job execution.
+	// LoggingConfig: Optional The runtime log config for job execution.
 	LoggingConfig *LoggingConfig `json:"loggingConfig,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure Spark SQL's SparkConf. Properties that conflict with values
 	// set by the Cloud Dataproc API may be overwritten.
 	Properties map[string]string `json:"properties,omitempty"`
@@ -1691,8 +1783,8 @@
 	// QueryList: A list of queries.
 	QueryList *QueryList `json:"queryList,omitempty"`
 
-	// ScriptVariables: [Optional] Mapping of query variable names to values
-	// (equivalent to the Spark SQL command: SET `name="value";`).
+	// ScriptVariables: Optional Mapping of query variable names to values
+	// (equivalent to the Spark SQL command: SET name="value";).
 	ScriptVariables map[string]string `json:"scriptVariables,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "JarFileUris") to
@@ -1718,42 +1810,45 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// Status: The `Status` type defines a logical error model that is
+// Status: The Status type defines a logical error model that is
 // suitable for different programming environments, including REST APIs
-// and RPC APIs. It is used by [gRPC](https://github.com/grpc). The
-// error model is designed to be: - Simple to use and understand for
-// most users - Flexible enough to meet unexpected needs # Overview The
-// `Status` message contains three pieces of data: error code, error
-// message, and error details. The error code should be an enum value of
-// google.rpc.Code, but it may accept additional error codes if needed.
-// The error message should be a developer-facing English message that
-// helps developers *understand* and *resolve* the error. If a localized
-// user-facing error message is needed, put the localized message in the
-// error details or localize it in the client. The optional error
-// details may contain arbitrary information about the error. There is a
-// predefined set of error detail types in the package `google.rpc`
-// which can be used for common error conditions. # Language mapping The
-// `Status` message is the logical representation of the error model,
-// but it is not necessarily the actual wire format. When the `Status`
-// message is exposed in different client libraries and different wire
-// protocols, it can be mapped differently. For example, it will likely
-// be mapped to some exceptions in Java, but more likely mapped to some
-// error codes in C. # Other uses The error model and the `Status`
-// message can be used in a variety of environments, either with or
-// without APIs, to provide a consistent developer experience across
-// different environments. Example uses of this error model include: -
+// and RPC APIs. It is used by gRPC (https://github.com/grpc). The error
+// model is designed to be:
+// Simple to use and understand for most users
+// Flexible enough to meet unexpected needsOverviewThe Status message
+// contains three pieces of data: error code, error message, and error
+// details. The error code should be an enum value of google.rpc.Code,
+// but it may accept additional error codes if needed. The error message
+// should be a developer-facing English message that helps developers
+// understand and resolve the error. If a localized user-facing error
+// message is needed, put the localized message in the error details or
+// localize it in the client. The optional error details may contain
+// arbitrary information about the error. There is a predefined set of
+// error detail types in the package google.rpc which can be used for
+// common error conditions.Language mappingThe Status message is the
+// logical representation of the error model, but it is not necessarily
+// the actual wire format. When the Status message is exposed in
+// different client libraries and different wire protocols, it can be
+// mapped differently. For example, it will likely be mapped to some
+// exceptions in Java, but more likely mapped to some error codes in
+// C.Other usesThe error model and the Status message can be used in a
+// variety of environments, either with or without APIs, to provide a
+// consistent developer experience across different environments.Example
+// uses of this error model include:
 // Partial errors. If a service needs to return partial errors to the
-// client, it may embed the `Status` in the normal response to indicate
-// the partial errors. - Workflow errors. A typical workflow has
-// multiple steps. Each step may have a `Status` message for error
-// reporting purpose. - Batch operations. If a client uses batch request
-// and batch response, the `Status` message should be used directly
-// inside batch response, one for each error sub-response. -
+// client, it may embed the Status in the normal response to indicate
+// the partial errors.
+// Workflow errors. A typical workflow has multiple steps. Each step may
+// have a Status message for error reporting purpose.
+// Batch operations. If a client uses batch request and batch response,
+// the Status message should be used directly inside batch response, one
+// for each error sub-response.
 // Asynchronous operations. If an API call embeds asynchronous operation
 // results in its response, the status of those operations should be
-// represented directly using the `Status` message. - Logging. If some
-// API errors are stored in logs, the message `Status` could be used
-// directly after any stripping needed for security/privacy reasons.
+// represented directly using the Status message.
+// Logging. If some API errors are stored in logs, the message Status
+// could be used directly after any stripping needed for
+// security/privacy reasons.
 type Status struct {
 	// Code: The status code, which should be an enum value of
 	// google.rpc.Code.
@@ -1793,7 +1888,7 @@
 
 // SubmitJobRequest: A request to submit a job.
 type SubmitJobRequest struct {
-	// Job: [Required] The job resource.
+	// Job: Required The job resource.
 	Job *Job `json:"job,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Job") to
@@ -1821,32 +1916,32 @@
 
 // YarnApplication: A YARN application created by a job. Application
 // information is a subset of
-// org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto.
-// **Beta Feature**: This report is available for testing purposes only.
-// It may be changed before final release.
+// <code>org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto</
+// code>.Beta Feature: This report is available for testing purposes
+// only. It may be changed before final release.
 type YarnApplication struct {
-	// Name: [Required] The application name.
+	// Name: Required The application name.
 	Name string `json:"name,omitempty"`
 
-	// Progress: [Required] The numerical progress of the application, from
-	// 1 to 100.
+	// Progress: Required The numerical progress of the application, from 1
+	// to 100.
 	Progress float64 `json:"progress,omitempty"`
 
-	// State: [Required] The application state.
+	// State: Required The application state.
 	//
 	// Possible values:
-	//   "STATE_UNSPECIFIED"
-	//   "NEW"
-	//   "NEW_SAVING"
-	//   "SUBMITTED"
-	//   "ACCEPTED"
-	//   "RUNNING"
-	//   "FINISHED"
-	//   "FAILED"
-	//   "KILLED"
+	//   "STATE_UNSPECIFIED" - Status is unspecified.
+	//   "NEW" - Status is NEW.
+	//   "NEW_SAVING" - Status is NEW_SAVING.
+	//   "SUBMITTED" - Status is SUBMITTED.
+	//   "ACCEPTED" - Status is ACCEPTED.
+	//   "RUNNING" - Status is RUNNING.
+	//   "FINISHED" - Status is FINISHED.
+	//   "FAILED" - Status is FAILED.
+	//   "KILLED" - Status is KILLED.
 	State string `json:"state,omitempty"`
 
-	// TrackingUrl: [Optional] The HTTP URL of the ApplicationMaster,
+	// TrackingUrl: Optional The HTTP URL of the ApplicationMaster,
 	// HistoryServer, or TimelineServer that provides application-specific
 	// information. The URL uses the internal hostname, and requires a proxy
 	// server for resolution and, possibly, access.
@@ -1941,6 +2036,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cluster)
 	if err != nil {
@@ -1998,6 +2094,7 @@
 	return ret, nil
 	// {
 	//   "description": "Creates a cluster in a project.",
+	//   "flatPath": "v1/projects/{projectId}/regions/{region}/clusters",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.projects.regions.clusters.create",
 	//   "parameterOrder": [
@@ -2006,13 +2103,13 @@
 	//   ],
 	//   "parameters": {
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Cloud Dataproc region in which to handle the request.",
+	//       "description": "Required The Cloud Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -2084,6 +2181,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}")
@@ -2137,6 +2235,7 @@
 	return ret, nil
 	// {
 	//   "description": "Deletes a cluster in a project.",
+	//   "flatPath": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
 	//   "httpMethod": "DELETE",
 	//   "id": "dataproc.projects.regions.clusters.delete",
 	//   "parameterOrder": [
@@ -2146,19 +2245,19 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Required] The cluster name.",
+	//       "description": "Required The cluster name.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Cloud Dataproc region in which to handle the request.",
+	//       "description": "Required The Cloud Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -2190,7 +2289,7 @@
 
 // Diagnose: Gets cluster diagnostic information. After the operation
 // completes, the Operation.response field contains
-// `DiagnoseClusterOutputLocation`.
+// DiagnoseClusterOutputLocation.
 func (r *ProjectsRegionsClustersService) Diagnose(projectId string, region string, clusterName string, diagnoseclusterrequest *DiagnoseClusterRequest) *ProjectsRegionsClustersDiagnoseCall {
 	c := &ProjectsRegionsClustersDiagnoseCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.projectId = projectId
@@ -2231,6 +2330,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.diagnoseclusterrequest)
 	if err != nil {
@@ -2288,7 +2388,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Gets cluster diagnostic information. After the operation completes, the Operation.response field contains `DiagnoseClusterOutputLocation`.",
+	//   "description": "Gets cluster diagnostic information. After the operation completes, the Operation.response field contains DiagnoseClusterOutputLocation.",
+	//   "flatPath": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}:diagnose",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.projects.regions.clusters.diagnose",
 	//   "parameterOrder": [
@@ -2298,19 +2399,19 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Required] The cluster name.",
+	//       "description": "Required The cluster name.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Cloud Dataproc region in which to handle the request.",
+	//       "description": "Required The Cloud Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -2393,6 +2494,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2449,6 +2551,7 @@
 	return ret, nil
 	// {
 	//   "description": "Gets the resource representation for a cluster in a project.",
+	//   "flatPath": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.regions.clusters.get",
 	//   "parameterOrder": [
@@ -2458,19 +2561,19 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Required] The cluster name.",
+	//       "description": "Required The cluster name.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Cloud Dataproc region in which to handle the request.",
+	//       "description": "Required The Cloud Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -2507,35 +2610,32 @@
 	return c
 }
 
-// Filter sets the optional parameter "filter": [Optional] A filter
+// Filter sets the optional parameter "filter": Optional A filter
 // constraining the clusters to list. Filters are case-sensitive and
-// have the following syntax: field:value [field:value] ... or field =
-// value [AND [field = value]] ... where **field** is one of
-// `status.state`, `clusterName`, or `labels.[KEY]`, and `[KEY]` is a
-// label key. **value** can be `*` to match all values. `status.state`
-// can be one of the following: `ACTIVE`, `INACTIVE`, `CREATING`,
-// `RUNNING`, `ERROR`, `DELETING`, or `UPDATING`. `ACTIVE` contains the
-// `CREATING`, `UPDATING`, and `RUNNING` states. `INACTIVE` contains the
-// `DELETING` and `ERROR` states. `clusterName` is the name of the
-// cluster provided at creation time. Only the logical `AND` operator is
-// supported; space-separated items are treated as having an implicit
-// `AND` operator. Example valid filters are: status.state:ACTIVE
-// clusterName:mycluster labels.env:staging \ labels.starred:* and
-// status.state = ACTIVE AND clusterName = mycluster \ AND labels.env =
-// staging AND labels.starred = *
+// have the following syntax:field = value AND field = value ...where
+// field is one of status.state, clusterName, or labels.[KEY], and [KEY]
+// is a label key. value can be * to match all values. status.state can
+// be one of the following: ACTIVE, INACTIVE, CREATING, RUNNING, ERROR,
+// DELETING, or UPDATING. ACTIVE contains the CREATING, UPDATING, and
+// RUNNING states. INACTIVE contains the DELETING and ERROR states.
+// clusterName is the name of the cluster provided at creation time.
+// Only the logical AND operator is supported; space-separated items are
+// treated as having an implicit AND operator.Example
+// filter:status.state = ACTIVE AND clusterName = mycluster AND
+// labels.env = staging AND labels.starred = *
 func (c *ProjectsRegionsClustersListCall) Filter(filter string) *ProjectsRegionsClustersListCall {
 	c.urlParams_.Set("filter", filter)
 	return c
 }
 
-// PageSize sets the optional parameter "pageSize": [Optional] The
+// PageSize sets the optional parameter "pageSize": Optional The
 // standard List page size.
 func (c *ProjectsRegionsClustersListCall) PageSize(pageSize int64) *ProjectsRegionsClustersListCall {
 	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
 	return c
 }
 
-// PageToken sets the optional parameter "pageToken": [Optional] The
+// PageToken sets the optional parameter "pageToken": Optional The
 // standard List page token.
 func (c *ProjectsRegionsClustersListCall) PageToken(pageToken string) *ProjectsRegionsClustersListCall {
 	c.urlParams_.Set("pageToken", pageToken)
@@ -2583,6 +2683,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2638,6 +2739,7 @@
 	return ret, nil
 	// {
 	//   "description": "Lists all regions/{region}/clusters in a project.",
+	//   "flatPath": "v1/projects/{projectId}/regions/{region}/clusters",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.regions.clusters.list",
 	//   "parameterOrder": [
@@ -2646,29 +2748,29 @@
 	//   ],
 	//   "parameters": {
 	//     "filter": {
-	//       "description": "[Optional] A filter constraining the clusters to list. Filters are case-sensitive and have the following syntax: field:value [field:value] ... or field = value [AND [field = value]] ... where **field** is one of `status.state`, `clusterName`, or `labels.[KEY]`, and `[KEY]` is a label key. **value** can be `*` to match all values. `status.state` can be one of the following: `ACTIVE`, `INACTIVE`, `CREATING`, `RUNNING`, `ERROR`, `DELETING`, or `UPDATING`. `ACTIVE` contains the `CREATING`, `UPDATING`, and `RUNNING` states. `INACTIVE` contains the `DELETING` and `ERROR` states. `clusterName` is the name of the cluster provided at creation time. Only the logical `AND` operator is supported; space-separated items are treated as having an implicit `AND` operator. Example valid filters are: status.state:ACTIVE clusterName:mycluster labels.env:staging \\ labels.starred:* and status.state = ACTIVE AND clusterName = mycluster \\ AND labels.env = staging AND labels.starred = *",
+	//       "description": "Optional A filter constraining the clusters to list. Filters are case-sensitive and have the following syntax:field = value AND field = value ...where field is one of status.state, clusterName, or labels.[KEY], and [KEY] is a label key. value can be * to match all values. status.state can be one of the following: ACTIVE, INACTIVE, CREATING, RUNNING, ERROR, DELETING, or UPDATING. ACTIVE contains the CREATING, UPDATING, and RUNNING states. INACTIVE contains the DELETING and ERROR states. clusterName is the name of the cluster provided at creation time. Only the logical AND operator is supported; space-separated items are treated as having an implicit AND operator.Example filter:status.state = ACTIVE AND clusterName = mycluster AND labels.env = staging AND labels.starred = *",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "pageSize": {
-	//       "description": "[Optional] The standard List page size.",
+	//       "description": "Optional The standard List page size.",
 	//       "format": "int32",
 	//       "location": "query",
 	//       "type": "integer"
 	//     },
 	//     "pageToken": {
-	//       "description": "[Optional] The standard List page token.",
+	//       "description": "Optional The standard List page token.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Cloud Dataproc region in which to handle the request.",
+	//       "description": "Required The Cloud Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -2729,20 +2831,34 @@
 	return c
 }
 
-// UpdateMask sets the optional parameter "updateMask": [Required]
-// Specifies the path, relative to Cluster, of the field to update. For
-// example, to change the number of workers in a cluster to 5, the
-// update_mask parameter would be specified as
-// config.worker_config.num_instances, and the `PATCH` request body
-// would specify the new value, as follows: { "config":{
-// "workerConfig":{ "numInstances":"5" } } } Similarly, to change the
-// number of preemptible workers in a cluster to 5, the update_mask
-// parameter would be config.secondary_worker_config.num_instances, and
-// the `PATCH` request body would be set as follows: { "config":{
-// "secondaryWorkerConfig":{ "numInstances":"5" } } } Note: Currently,
-// config.worker_config.num_instances and
-// config.secondary_worker_config.num_instances are the only fields that
-// can be updated.
+// UpdateMask sets the optional parameter "updateMask": Required
+// Specifies the path, relative to <code>Cluster</code>, of the field to
+// update. For example, to change the number of workers in a cluster to
+// 5, the <code>update_mask</code> parameter would be specified as
+// <code>config.worker_config.num_instances</code>, and the PATCH
+// request body would specify the new value, as follows:
+// {
+//   "config":{
+//     "workerConfig":{
+//       "numInstances":"5"
+//     }
+//   }
+// }
+// Similarly, to change the number of preemptible workers in a cluster
+// to 5, the <code>update_mask</code> parameter would be
+// <code>config.secondary_worker_config.num_instances</code>, and the
+// PATCH request body would be set as follows:
+// {
+//   "config":{
+//     "secondaryWorkerConfig":{
+//       "numInstances":"5"
+//     }
+//   }
+// }
+// <strong>Note:</strong> Currently,
+// <code>config.worker_config.num_instances</code> and
+// <code>config.secondary_worker_config.num_instances</code> are the
+// only fields that can be updated.
 func (c *ProjectsRegionsClustersPatchCall) UpdateMask(updateMask string) *ProjectsRegionsClustersPatchCall {
 	c.urlParams_.Set("updateMask", updateMask)
 	return c
@@ -2779,6 +2895,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cluster)
 	if err != nil {
@@ -2837,6 +2954,7 @@
 	return ret, nil
 	// {
 	//   "description": "Updates a cluster in a project.",
+	//   "flatPath": "v1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
 	//   "httpMethod": "PATCH",
 	//   "id": "dataproc.projects.regions.clusters.patch",
 	//   "parameterOrder": [
@@ -2846,25 +2964,26 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Required] The cluster name.",
+	//       "description": "Required The cluster name.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Cloud Dataproc region in which to handle the request.",
+	//       "description": "Required The Cloud Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "updateMask": {
-	//       "description": "[Required] Specifies the path, relative to Cluster, of the field to update. For example, to change the number of workers in a cluster to 5, the update_mask parameter would be specified as config.worker_config.num_instances, and the `PATCH` request body would specify the new value, as follows: { \"config\":{ \"workerConfig\":{ \"numInstances\":\"5\" } } } Similarly, to change the number of preemptible workers in a cluster to 5, the update_mask parameter would be config.secondary_worker_config.num_instances, and the `PATCH` request body would be set as follows: { \"config\":{ \"secondaryWorkerConfig\":{ \"numInstances\":\"5\" } } } Note: Currently, config.worker_config.num_instances and config.secondary_worker_config.num_instances are the only fields that can be updated.",
+	//       "description": "Required Specifies the path, relative to \u003ccode\u003eCluster\u003c/code\u003e, of the field to update. For example, to change the number of workers in a cluster to 5, the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be specified as \u003ccode\u003econfig.worker_config.num_instances\u003c/code\u003e, and the PATCH request body would specify the new value, as follows:\n{\n  \"config\":{\n    \"workerConfig\":{\n      \"numInstances\":\"5\"\n    }\n  }\n}\nSimilarly, to change the number of preemptible workers in a cluster to 5, the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be \u003ccode\u003econfig.secondary_worker_config.num_instances\u003c/code\u003e, and the PATCH request body would be set as follows:\n{\n  \"config\":{\n    \"secondaryWorkerConfig\":{\n      \"numInstances\":\"5\"\n    }\n  }\n}\n\u003cstrong\u003eNote:\u003c/strong\u003e Currently, \u003ccode\u003econfig.worker_config.num_instances\u003c/code\u003e and \u003ccode\u003econfig.secondary_worker_config.num_instances\u003c/code\u003e are the only fields that can be updated.",
+	//       "format": "google-fieldmask",
 	//       "location": "query",
 	//       "type": "string"
 	//     }
@@ -2897,11 +3016,8 @@
 }
 
 // Cancel: Starts a job cancellation request. To access the job resource
-// after cancellation, call
-// [regions/{region}/jobs.list](/dataproc/reference/rest/v1/projects.regi
-// ons.jobs/list) or
-// [regions/{region}/jobs.get](/dataproc/reference/rest/v1/projects.regio
-// ns.jobs/get).
+// after cancellation, call regions/{region}/jobs.list or
+// regions/{region}/jobs.get.
 func (r *ProjectsRegionsJobsService) Cancel(projectId string, region string, jobId string, canceljobrequest *CancelJobRequest) *ProjectsRegionsJobsCancelCall {
 	c := &ProjectsRegionsJobsCancelCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.projectId = projectId
@@ -2942,6 +3058,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.canceljobrequest)
 	if err != nil {
@@ -2999,7 +3116,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Starts a job cancellation request. To access the job resource after cancellation, call [regions/{region}/jobs.list](/dataproc/reference/rest/v1/projects.regions.jobs/list) or [regions/{region}/jobs.get](/dataproc/reference/rest/v1/projects.regions.jobs/get).",
+	//   "description": "Starts a job cancellation request. To access the job resource after cancellation, call regions/{region}/jobs.list or regions/{region}/jobs.get.",
+	//   "flatPath": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}:cancel",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.projects.regions.jobs.cancel",
 	//   "parameterOrder": [
@@ -3009,19 +3127,19 @@
 	//   ],
 	//   "parameters": {
 	//     "jobId": {
-	//       "description": "[Required] The job ID.",
+	//       "description": "Required The job ID.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Cloud Dataproc region in which to handle the request.",
+	//       "description": "Required The Cloud Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3054,7 +3172,7 @@
 }
 
 // Delete: Deletes the job from the project. If the job is active, the
-// delete fails, and the response returns `FAILED_PRECONDITION`.
+// delete fails, and the response returns FAILED_PRECONDITION.
 func (r *ProjectsRegionsJobsService) Delete(projectId string, region string, jobId string) *ProjectsRegionsJobsDeleteCall {
 	c := &ProjectsRegionsJobsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.projectId = projectId
@@ -3094,6 +3212,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/regions/{region}/jobs/{jobId}")
@@ -3146,7 +3265,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes the job from the project. If the job is active, the delete fails, and the response returns `FAILED_PRECONDITION`.",
+	//   "description": "Deletes the job from the project. If the job is active, the delete fails, and the response returns FAILED_PRECONDITION.",
+	//   "flatPath": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "dataproc.projects.regions.jobs.delete",
 	//   "parameterOrder": [
@@ -3156,19 +3276,19 @@
 	//   ],
 	//   "parameters": {
 	//     "jobId": {
-	//       "description": "[Required] The job ID.",
+	//       "description": "Required The job ID.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Cloud Dataproc region in which to handle the request.",
+	//       "description": "Required The Cloud Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3248,6 +3368,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3304,6 +3425,7 @@
 	return ret, nil
 	// {
 	//   "description": "Gets the resource representation for a job in a project.",
+	//   "flatPath": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.regions.jobs.get",
 	//   "parameterOrder": [
@@ -3313,19 +3435,19 @@
 	//   ],
 	//   "parameters": {
 	//     "jobId": {
-	//       "description": "[Required] The job ID.",
+	//       "description": "Required The job ID.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Cloud Dataproc region in which to handle the request.",
+	//       "description": "Required The Cloud Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3362,7 +3484,7 @@
 	return c
 }
 
-// ClusterName sets the optional parameter "clusterName": [Optional] If
+// ClusterName sets the optional parameter "clusterName": Optional If
 // set, the returned jobs list includes only jobs that were submitted to
 // the named cluster.
 func (c *ProjectsRegionsJobsListCall) ClusterName(clusterName string) *ProjectsRegionsJobsListCall {
@@ -3370,23 +3492,22 @@
 	return c
 }
 
-// Filter sets the optional parameter "filter": [Optional] A filter
+// Filter sets the optional parameter "filter": Optional A filter
 // constraining the jobs to list. Filters are case-sensitive and have
-// the following syntax: field:value] ... or [field = value] AND [field
-// [= value]] ... where **field** is `status.state` or `labels.[KEY]`,
-// and `[KEY]` is a label key. **value** can be `*` to match all values.
-// `status.state` can be either `ACTIVE` or `INACTIVE`. Only the logical
-// `AND` operator is supported; space-separated items are treated as
-// having an implicit `AND` operator. Example valid filters are:
-// status.state:ACTIVE labels.env:staging labels.starred:* and
-// status.state = ACTIVE AND labels.env = staging AND labels.starred = *
+// the following syntax:field = value AND field = value ...where field
+// is status.state or labels.[KEY], and [KEY] is a label key. value can
+// be * to match all values. status.state can be either ACTIVE or
+// INACTIVE. Only the logical AND operator is supported; space-separated
+// items are treated as having an implicit AND operator.Example
+// filter:status.state = ACTIVE AND labels.env = staging AND
+// labels.starred = *
 func (c *ProjectsRegionsJobsListCall) Filter(filter string) *ProjectsRegionsJobsListCall {
 	c.urlParams_.Set("filter", filter)
 	return c
 }
 
 // JobStateMatcher sets the optional parameter "jobStateMatcher":
-// [Optional] Specifies enumerated categories of jobs to list (default =
+// Optional Specifies enumerated categories of jobs to list (default =
 // match ALL jobs).
 //
 // Possible values:
@@ -3398,15 +3519,15 @@
 	return c
 }
 
-// PageSize sets the optional parameter "pageSize": [Optional] The
-// number of results to return in each response.
+// PageSize sets the optional parameter "pageSize": Optional The number
+// of results to return in each response.
 func (c *ProjectsRegionsJobsListCall) PageSize(pageSize int64) *ProjectsRegionsJobsListCall {
 	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
 	return c
 }
 
-// PageToken sets the optional parameter "pageToken": [Optional] The
-// page token, returned by a previous call, to request the next page of
+// PageToken sets the optional parameter "pageToken": Optional The page
+// token, returned by a previous call, to request the next page of
 // results.
 func (c *ProjectsRegionsJobsListCall) PageToken(pageToken string) *ProjectsRegionsJobsListCall {
 	c.urlParams_.Set("pageToken", pageToken)
@@ -3454,6 +3575,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3509,6 +3631,7 @@
 	return ret, nil
 	// {
 	//   "description": "Lists regions/{region}/jobs in a project.",
+	//   "flatPath": "v1/projects/{projectId}/regions/{region}/jobs",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.regions.jobs.list",
 	//   "parameterOrder": [
@@ -3517,17 +3640,17 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Optional] If set, the returned jobs list includes only jobs that were submitted to the named cluster.",
+	//       "description": "Optional If set, the returned jobs list includes only jobs that were submitted to the named cluster.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "filter": {
-	//       "description": "[Optional] A filter constraining the jobs to list. Filters are case-sensitive and have the following syntax: field:value] ... or [field = value] AND [field [= value]] ... where **field** is `status.state` or `labels.[KEY]`, and `[KEY]` is a label key. **value** can be `*` to match all values. `status.state` can be either `ACTIVE` or `INACTIVE`. Only the logical `AND` operator is supported; space-separated items are treated as having an implicit `AND` operator. Example valid filters are: status.state:ACTIVE labels.env:staging labels.starred:* and status.state = ACTIVE AND labels.env = staging AND labels.starred = *",
+	//       "description": "Optional A filter constraining the jobs to list. Filters are case-sensitive and have the following syntax:field = value AND field = value ...where field is status.state or labels.[KEY], and [KEY] is a label key. value can be * to match all values. status.state can be either ACTIVE or INACTIVE. Only the logical AND operator is supported; space-separated items are treated as having an implicit AND operator.Example filter:status.state = ACTIVE AND labels.env = staging AND labels.starred = *",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "jobStateMatcher": {
-	//       "description": "[Optional] Specifies enumerated categories of jobs to list (default = match ALL jobs).",
+	//       "description": "Optional Specifies enumerated categories of jobs to list (default = match ALL jobs).",
 	//       "enum": [
 	//         "ALL",
 	//         "ACTIVE",
@@ -3537,24 +3660,24 @@
 	//       "type": "string"
 	//     },
 	//     "pageSize": {
-	//       "description": "[Optional] The number of results to return in each response.",
+	//       "description": "Optional The number of results to return in each response.",
 	//       "format": "int32",
 	//       "location": "query",
 	//       "type": "integer"
 	//     },
 	//     "pageToken": {
-	//       "description": "[Optional] The page token, returned by a previous call, to request the next page of results.",
+	//       "description": "Optional The page token, returned by a previous call, to request the next page of results.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Cloud Dataproc region in which to handle the request.",
+	//       "description": "Required The Cloud Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3592,6 +3715,179 @@
 	}
 }
 
+// method id "dataproc.projects.regions.jobs.patch":
+
+type ProjectsRegionsJobsPatchCall struct {
+	s          *Service
+	projectId  string
+	region     string
+	jobId      string
+	job        *Job
+	urlParams_ gensupport.URLParams
+	ctx_       context.Context
+	header_    http.Header
+}
+
+// Patch: Updates a job in a project.
+func (r *ProjectsRegionsJobsService) Patch(projectId string, region string, jobId string, job *Job) *ProjectsRegionsJobsPatchCall {
+	c := &ProjectsRegionsJobsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.projectId = projectId
+	c.region = region
+	c.jobId = jobId
+	c.job = job
+	return c
+}
+
+// UpdateMask sets the optional parameter "updateMask": Required
+// Specifies the path, relative to <code>Job</code>, of the field to
+// update. For example, to update the labels of a Job the
+// <code>update_mask</code> parameter would be specified as
+// <code>labels</code>, and the PATCH request body would specify the new
+// value. <strong>Note:</strong> Currently, <code>labels</code> is the
+// only field that can be updated.
+func (c *ProjectsRegionsJobsPatchCall) UpdateMask(updateMask string) *ProjectsRegionsJobsPatchCall {
+	c.urlParams_.Set("updateMask", updateMask)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ProjectsRegionsJobsPatchCall) Fields(s ...googleapi.Field) *ProjectsRegionsJobsPatchCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ProjectsRegionsJobsPatchCall) Context(ctx context.Context) *ProjectsRegionsJobsPatchCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ProjectsRegionsJobsPatchCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ProjectsRegionsJobsPatchCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.job)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/projects/{projectId}/regions/{region}/jobs/{jobId}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"projectId": c.projectId,
+		"region":    c.region,
+		"jobId":     c.jobId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "dataproc.projects.regions.jobs.patch" call.
+// Exactly one of *Job or error will be non-nil. Any non-2xx status code
+// is an error. Response headers are in either
+// *Job.ServerResponse.Header or (if a response was returned at all) in
+// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check
+// whether the returned error was because http.StatusNotModified was
+// returned.
+func (c *ProjectsRegionsJobsPatchCall) Do(opts ...googleapi.CallOption) (*Job, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Job{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates a job in a project.",
+	//   "flatPath": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}",
+	//   "httpMethod": "PATCH",
+	//   "id": "dataproc.projects.regions.jobs.patch",
+	//   "parameterOrder": [
+	//     "projectId",
+	//     "region",
+	//     "jobId"
+	//   ],
+	//   "parameters": {
+	//     "jobId": {
+	//       "description": "Required The job ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "projectId": {
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "Required The Cloud Dataproc region in which to handle the request.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "updateMask": {
+	//       "description": "Required Specifies the path, relative to \u003ccode\u003eJob\u003c/code\u003e, of the field to update. For example, to update the labels of a Job the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be specified as \u003ccode\u003elabels\u003c/code\u003e, and the PATCH request body would specify the new value. \u003cstrong\u003eNote:\u003c/strong\u003e Currently, \u003ccode\u003elabels\u003c/code\u003e is the only field that can be updated.",
+	//       "format": "google-fieldmask",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1/projects/{projectId}/regions/{region}/jobs/{jobId}",
+	//   "request": {
+	//     "$ref": "Job"
+	//   },
+	//   "response": {
+	//     "$ref": "Job"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform"
+	//   ]
+	// }
+
+}
+
 // method id "dataproc.projects.regions.jobs.submit":
 
 type ProjectsRegionsJobsSubmitCall struct {
@@ -3644,6 +3940,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.submitjobrequest)
 	if err != nil {
@@ -3701,6 +3998,7 @@
 	return ret, nil
 	// {
 	//   "description": "Submits a job to a cluster.",
+	//   "flatPath": "v1/projects/{projectId}/regions/{region}/jobs:submit",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.projects.regions.jobs.submit",
 	//   "parameterOrder": [
@@ -3709,13 +4007,13 @@
 	//   ],
 	//   "parameters": {
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Cloud Dataproc region in which to handle the request.",
+	//       "description": "Required The Cloud Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3748,13 +4046,13 @@
 // Cancel: Starts asynchronous cancellation on a long-running operation.
 // The server makes a best effort to cancel the operation, but success
 // is not guaranteed. If the server doesn't support this method, it
-// returns `google.rpc.Code.UNIMPLEMENTED`. Clients can use
+// returns google.rpc.Code.UNIMPLEMENTED. Clients can use
 // Operations.GetOperation or other methods to check whether the
 // cancellation succeeded or whether the operation completed despite
 // cancellation. On successful cancellation, the operation is not
 // deleted; instead, it becomes an operation with an Operation.error
 // value with a google.rpc.Status.code of 1, corresponding to
-// `Code.CANCELLED`.
+// Code.CANCELLED.
 func (r *ProjectsRegionsOperationsService) Cancel(name string) *ProjectsRegionsOperationsCancelCall {
 	c := &ProjectsRegionsOperationsCancelCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.name = name
@@ -3792,6 +4090,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+name}:cancel")
@@ -3842,7 +4141,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`. Clients can use Operations.GetOperation or other methods to check whether the cancellation succeeded or whether the operation completed despite cancellation. On successful cancellation, the operation is not deleted; instead, it becomes an operation with an Operation.error value with a google.rpc.Status.code of 1, corresponding to `Code.CANCELLED`.",
+	//   "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns google.rpc.Code.UNIMPLEMENTED. Clients can use Operations.GetOperation or other methods to check whether the cancellation succeeded or whether the operation completed despite cancellation. On successful cancellation, the operation is not deleted; instead, it becomes an operation with an Operation.error value with a google.rpc.Status.code of 1, corresponding to Code.CANCELLED.",
+	//   "flatPath": "v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:cancel",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.projects.regions.operations.cancel",
 	//   "parameterOrder": [
@@ -3881,7 +4181,7 @@
 // Delete: Deletes a long-running operation. This method indicates that
 // the client is no longer interested in the operation result. It does
 // not cancel the operation. If the server doesn't support this method,
-// it returns `google.rpc.Code.UNIMPLEMENTED`.
+// it returns google.rpc.Code.UNIMPLEMENTED.
 func (r *ProjectsRegionsOperationsService) Delete(name string) *ProjectsRegionsOperationsDeleteCall {
 	c := &ProjectsRegionsOperationsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.name = name
@@ -3919,6 +4219,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+name}")
@@ -3969,7 +4270,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes a long-running operation. This method indicates that the client is no longer interested in the operation result. It does not cancel the operation. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`.",
+	//   "description": "Deletes a long-running operation. This method indicates that the client is no longer interested in the operation result. It does not cancel the operation. If the server doesn't support this method, it returns google.rpc.Code.UNIMPLEMENTED.",
+	//   "flatPath": "v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "dataproc.projects.regions.operations.delete",
 	//   "parameterOrder": [
@@ -4056,6 +4358,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4110,6 +4413,7 @@
 	return ret, nil
 	// {
 	//   "description": "Gets the latest state of a long-running operation. Clients can use this method to poll the operation result at intervals as recommended by the API service.",
+	//   "flatPath": "v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.regions.operations.get",
 	//   "parameterOrder": [
@@ -4148,9 +4452,9 @@
 
 // List: Lists operations that match the specified filter in the
 // request. If the server doesn't support this method, it returns
-// `UNIMPLEMENTED`. NOTE: the `name` binding below allows API services
-// to override the binding to use different resource name schemes, such
-// as `users/*/operations`.
+// UNIMPLEMENTED.NOTE: the name binding below allows API services to
+// override the binding to use different resource name schemes, such as
+// users/*/operations.
 func (r *ProjectsRegionsOperationsService) List(name string) *ProjectsRegionsOperationsListCall {
 	c := &ProjectsRegionsOperationsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.name = name
@@ -4219,6 +4523,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4272,7 +4577,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns `UNIMPLEMENTED`. NOTE: the `name` binding below allows API services to override the binding to use different resource name schemes, such as `users/*/operations`.",
+	//   "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns UNIMPLEMENTED.NOTE: the name binding below allows API services to override the binding to use different resource name schemes, such as users/*/operations.",
+	//   "flatPath": "v1/projects/{projectsId}/regions/{regionsId}/operations",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.regions.operations.list",
 	//   "parameterOrder": [
diff --git a/dataproc/v1alpha1/dataproc-api.json b/dataproc/v1alpha1/dataproc-api.json
index 43865b5..b25ca2d 100644
--- a/dataproc/v1alpha1/dataproc-api.json
+++ b/dataproc/v1alpha1/dataproc-api.json
@@ -1,1822 +1,2029 @@
 {
- "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/r7FI1XKe3nwqujSEPgINO6f6aJQ\"",
- "discoveryVersion": "v1",
- "id": "dataproc:v1alpha1",
- "name": "dataproc",
- "version": "v1alpha1",
- "revision": "20161102",
- "title": "Google Cloud Dataproc API",
- "description": "An API for managing Hadoop-based clusters and jobs on Google Cloud Platform.",
- "ownerDomain": "google.com",
- "ownerName": "Google",
- "icons": {
-  "x16": "http://www.google.com/images/icons/product/search-16.gif",
-  "x32": "http://www.google.com/images/icons/product/search-32.gif"
- },
- "documentationLink": "https://cloud.google.com/dataproc/",
- "protocol": "rest",
- "baseUrl": "https://dataproc.googleapis.com/",
- "basePath": "",
- "rootUrl": "https://dataproc.googleapis.com/",
- "servicePath": "",
- "batchPath": "batch",
- "parameters": {
-  "access_token": {
-   "type": "string",
-   "description": "OAuth access token.",
-   "location": "query"
-  },
-  "alt": {
-   "type": "string",
-   "description": "Data format for response.",
-   "default": "json",
-   "enumDescriptions": [
-    "Responses with Content-Type of application/json",
-    "Media download with context-dependent Content-Type",
-    "Responses with Content-Type of application/x-protobuf"
-   ],
-   "location": "query"
-  },
-  "bearer_token": {
-   "type": "string",
-   "description": "OAuth bearer token.",
-   "location": "query"
-  },
-  "callback": {
-   "type": "string",
-   "description": "JSONP",
-   "location": "query"
-  },
-  "fields": {
-   "type": "string",
-   "description": "Selector specifying which fields to include in a partial response.",
-   "location": "query"
-  },
-  "key": {
-   "type": "string",
-   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-   "location": "query"
-  },
-  "oauth_token": {
-   "type": "string",
-   "description": "OAuth 2.0 token for the current user.",
-   "location": "query"
-  },
-  "pp": {
-   "type": "boolean",
-   "description": "Pretty-print response.",
-   "default": "true",
-   "location": "query"
-  },
-  "prettyPrint": {
-   "type": "boolean",
-   "description": "Returns response with indentations and line breaks.",
-   "default": "true",
-   "location": "query"
-  },
-  "quotaUser": {
-   "type": "string",
-   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-   "location": "query"
-  },
-  "upload_protocol": {
-   "type": "string",
-   "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-   "location": "query"
-  },
-  "uploadType": {
-   "type": "string",
-   "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-   "location": "query"
-  },
-  "$.xgafv": {
-   "type": "string",
-   "description": "V1 error format.",
-   "enumDescriptions": [
-    "v1 error format",
-    "v2 error format"
-   ],
-   "location": "query"
-  }
- },
- "auth": {
-  "oauth2": {
-   "scopes": {
-    "https://www.googleapis.com/auth/cloud-platform": {
-     "description": "View and manage your data across Google Cloud Platform services"
-    }
-   }
-  }
- },
- "schemas": {
-  "Cluster": {
-   "id": "Cluster",
-   "type": "object",
-   "description": "Describes the identifying information, configuration, and status of a cluster of Google Compute Engine instances.",
-   "properties": {
-    "projectId": {
-     "type": "string",
-     "description": "[Required] The Google Cloud Platform project ID that the cluster belongs to."
-    },
-    "clusterName": {
-     "type": "string",
-     "description": "[Required] The cluster name. Cluster names within a project must be unique. Names from deleted clusters can be reused."
-    },
-    "configuration": {
-     "$ref": "ClusterConfiguration",
-     "description": "[Required] The cluster configuration. It may differ from a user's initial configuration due to Cloud Dataproc setting of default values and updating clusters."
-    },
-    "labels": {
-     "type": "object",
-     "description": "[Optional] The labels to associate with this cluster. Label keys must be between 1 and 63 characters long, and must conform to the following PCRE regular expression: \\p{Ll}\\p{Lo}{0,62} Label values must be between 1 and 63 characters long, and must conform to the following PCRE regular expression: [\\p{Ll}\\p{Lo}\\p{N}_-]{0,63} No more than 64 labels can be associated with a given cluster.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "status": {
-     "$ref": "ClusterStatus",
-     "description": "[Output-only] Cluster status."
-    },
-    "statusHistory": {
-     "type": "array",
-     "description": "[Output-only] Previous cluster statuses.",
-     "items": {
-      "$ref": "ClusterStatus"
-     }
-    },
-    "createTime": {
-     "type": "string",
-     "description": "[Output-only] The timestamp of cluster creation."
-    },
-    "clusterUuid": {
-     "type": "string",
-     "description": "[Output-only] A cluster UUID (Unique Universal Identifier). Cloud Dataproc generates this value when it creates the cluster."
-    },
-    "metrics": {
-     "$ref": "ClusterMetrics",
-     "description": "Contains cluster daemon metrics such as HDFS and YARN stats."
-    }
-   }
-  },
-  "ClusterConfiguration": {
-   "id": "ClusterConfiguration",
-   "type": "object",
-   "description": "The cluster configuration.",
-   "properties": {
-    "configurationBucket": {
-     "type": "string",
-     "description": "[Optional] A Google Cloud Storage staging bucket used for sharing generated SSH keys and configuration. If you do not specify a staging bucket, Cloud Dataproc will determine an appropriate Cloud Storage location (US, ASIA, or EU) for your cluster's staging bucket according to the Google Compute Engine zone where your cluster is deployed, then it will create and manage this project-level, per-location bucket for you."
-    },
-    "gceConfiguration": {
-     "$ref": "GceConfiguration",
-     "description": "[Deprecated] The Google Compute Engine configuration settings for cluster resources."
-    },
-    "numWorkers": {
-     "type": "integer",
-     "description": "[Deprecated] The number of worker nodes in the cluster.",
-     "format": "int32"
-    },
-    "workers": {
-     "type": "array",
-     "description": "[Deprecated] The list of worker node names. Dataproc derives the names from cluster_name and num_workers if not set by user (recommended practice is to let Dataproc derive the name). Derived worker node name example: hadoop-w-0.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "masterName": {
-     "type": "string",
-     "description": "[Deprecated] The Master's hostname. Dataproc derives the name from cluster_name if not set by user (recommended practice is to let Dataproc derive the name). Derived master name example: hadoop-m."
-    },
-    "masterDiskConfiguration": {
-     "$ref": "DiskConfiguration",
-     "description": "[Deprecated] The configuration settings of master node disk options."
-    },
-    "workerDiskConfiguration": {
-     "$ref": "DiskConfiguration",
-     "description": "[Deprecated] The configuration settings of worker node disk options."
-    },
-    "gceClusterConfiguration": {
-     "$ref": "GceClusterConfiguration",
-     "description": "[Optional] The shared Google Compute Engine configuration settings for all instances in a cluster."
-    },
-    "masterConfiguration": {
-     "$ref": "InstanceGroupConfiguration",
-     "description": "[Optional] The Google Compute Engine configuration settings for the master instance in a cluster."
-    },
-    "workerConfiguration": {
-     "$ref": "InstanceGroupConfiguration",
-     "description": "[Optional] The Google Compute Engine configuration settings for worker instances in a cluster."
-    },
-    "secondaryWorkerConfiguration": {
-     "$ref": "InstanceGroupConfiguration",
-     "description": "[Optional] The Google Compute Engine configuration settings for additional worker instances in a cluster."
-    },
-    "softwareConfiguration": {
-     "$ref": "SoftwareConfiguration",
-     "description": "[Optional] The configuration settings for software inside the cluster."
-    },
-    "initializationActions": {
-     "type": "array",
-     "description": "[Optional] Commands to execute on each node after configuration is completed. By default, executables are run on master and all worker nodes. You can test a node's role metadata to run an executable on a master or worker node, as shown below: ROLE=$(/usr/share/google/get_metadata_value attributes/role) if [[ \"${ROLE}\" == 'Master' ]]; then ... master specific actions ... else ... worker specific actions ... fi",
-     "items": {
-      "$ref": "NodeInitializationAction"
-     }
-    }
-   }
-  },
-  "GceConfiguration": {
-   "id": "GceConfiguration",
-   "type": "object",
-   "description": "[Deprecated] Common configuration settings for resources of Google Compute Engine cluster instances, applicable to all instances in the cluster.",
-   "properties": {
-    "imageUri": {
-     "type": "string",
-     "description": "[Deprecated] The Google Compute Engine image resource used for cluster instances. Example: \"compute.googleapis.com/projects/debian-cloud /global/images/backports-debian-7-wheezy-v20140904\"."
-    },
-    "machineTypeUri": {
-     "type": "string",
-     "description": "[Deprecated] The Google Compute Engine machine type used for cluster instances. Example: \"compute.googleapis.com/projects/[project_id] /zones/us-east1-a/machineTypes/n1-standard-2\"."
-    },
-    "zoneUri": {
-     "type": "string",
-     "description": "[Deprecated] The zone where the Google Compute Engine cluster will be located. Example: \"compute.googleapis.com/projects/[project_id] /zones/us-east1-a\"."
-    },
-    "networkUri": {
-     "type": "string",
-     "description": "[Deprecated] The Google Compute Engine network to be used for machine communications. Inbound SSH connections are necessary to complete cluster configuration. Example \"compute.googleapis.com/projects/[project_id] /zones/us-east1-a/default\"."
-    },
-    "serviceAccountScopes": {
-     "type": "array",
-     "description": "[Deprecated] The service account scopes included in Google Compute Engine instances. Must include devstorage.full_control to enable the Google Cloud Storage connector. Example \"auth.googleapis.com/compute\" and \"auth.googleapis.com/devstorage.full_control\".",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "DiskConfiguration": {
-   "id": "DiskConfiguration",
-   "type": "object",
-   "description": "Specifies the configuration of disk options for a group of VM instances.",
-   "properties": {
-    "bootDiskSizeGb": {
-     "type": "integer",
-     "description": "[Optional] Size in GB of the boot disk (default is 500GB).",
-     "format": "int32"
-    },
-    "numLocalSsds": {
-     "type": "integer",
-     "description": "[Optional] Number of attached SSDs, from 0 to 4 (default is 0). If SSDs are not attached, the boot disk is used to store runtime logs, and HDFS data. If one or more SSDs are attached, this runtime bulk data is spread across them, and the boot disk contains only basic configuration and installed binaries.",
-     "format": "int32"
-    }
-   }
-  },
-  "GceClusterConfiguration": {
-   "id": "GceClusterConfiguration",
-   "type": "object",
-   "description": "Common configuration settings for resources of Google Compute Engine cluster instances, applicable to all instances in the cluster.",
-   "properties": {
-    "zoneUri": {
-     "type": "string",
-     "description": "[Required] The zone where the Google Compute Engine cluster will be located. Example: \"compute.googleapis.com/projects/[project_id] /zones/us-east1-a\"."
-    },
-    "networkUri": {
-     "type": "string",
-     "description": "The Google Compute Engine network to be used for machine communications. Cannot be specified with subnetwork_uri. If neither network_uri nor subnetwork_uri is specified, the \"default\" network of the project is used, if it exists. Cannot be a \"Custom Subnet Network\" (see https://cloud.google.com/compute/docs/subnetworks for more information). Example: `compute.googleapis.com/projects/[project_id]/regions/global/default`."
-    },
-    "subnetworkUri": {
-     "type": "string",
-     "description": "The Google Compute Engine subnetwork to be used for machine communications. Cannot be specified with network_uri. Example: `compute.googleapis.com/projects/[project_id]/regions/us-east1/sub0`."
-    },
-    "internalIpOnly": {
-     "type": "boolean",
-     "description": "If true, all instances in the cluser will only have internal IP addresses. By default, clusters are not restricted to internal IP addresses, and will have ephemeral external IP addresses assigned to each instance. This restriction can only be enabled for subnetwork enabled networks, and all off-cluster dependencies must be configured to be accessible without external IP addresses."
-    },
-    "serviceAccountScopes": {
-     "type": "array",
-     "description": "The service account scopes included in Google Compute Engine instances. Must include devstorage.full_control to enable the Google Cloud Storage connector. Example \"auth.googleapis.com/compute\" and \"auth.googleapis.com/devstorage.full_control\".",
-     "items": {
-      "type": "string"
-     }
-    },
-    "tags": {
-     "type": "array",
-     "description": "The Google Compute Engine tags to add to all instances.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "metadata": {
-     "type": "object",
-     "description": "The Google Compute Engine metadata entries to add to all instances.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "InstanceGroupConfiguration": {
-   "id": "InstanceGroupConfiguration",
-   "type": "object",
-   "description": "The configuration settings for Google Compute Engine resources in an instance group, such as a master or worker group.",
-   "properties": {
-    "numInstances": {
-     "type": "integer",
-     "description": "The number of VM instances in the instance group. For master instance groups, must be set to 1.",
-     "format": "int32"
-    },
-    "instanceNames": {
-     "type": "array",
-     "description": "The list of instance names. Dataproc derives the names from cluster_name, num_instances, and the instance group if not set by user (recommended practice is to let Dataproc derive the name).",
-     "items": {
-      "type": "string"
-     }
-    },
-    "imageUri": {
-     "type": "string",
-     "description": "[Output-only] The Google Compute Engine image resource used for cluster instances. Inferred from SoftwareConfiguration.image_version. Example: \"compute.googleapis.com/projects/debian-cloud /global/images/backports-debian-7-wheezy-v20140904\"."
-    },
-    "machineTypeUri": {
-     "type": "string",
-     "description": "The Google Compute Engine machine type used for cluster instances. Example: \"compute.googleapis.com/projects/[project_id] /zones/us-east1-a/machineTypes/n1-standard-2\"."
-    },
-    "diskConfiguration": {
-     "$ref": "DiskConfiguration",
-     "description": "Disk option configuration settings."
-    },
-    "isPreemptible": {
-     "type": "boolean",
-     "description": "Specifies that this instance group contains Preemptible Instances."
-    },
-    "managedGroupConfiguration": {
-     "$ref": "ManagedGroupConfiguration",
-     "description": "[Output-only] The configuration for Google Compute Engine Instance Group Manager that manages this group. This is only used for preemptible instance groups."
-    }
-   }
-  },
-  "ManagedGroupConfiguration": {
-   "id": "ManagedGroupConfiguration",
-   "type": "object",
-   "description": "Specifies the resources used to actively manage an instance group.",
-   "properties": {
-    "instanceTemplateName": {
-     "type": "string",
-     "description": "[Output-only] The name of Instance Template used for Managed Instance Group."
-    },
-    "instanceGroupManagerName": {
-     "type": "string",
-     "description": "[Output-only] The name of Instance Group Manager managing this group."
-    }
-   }
-  },
-  "SoftwareConfiguration": {
-   "id": "SoftwareConfiguration",
-   "type": "object",
-   "description": "Specifies the selection and configuration of software inside the cluster.",
-   "properties": {
-    "imageVersion": {
-     "type": "string",
-     "description": "[Optional] The version of software inside the cluster. It must match the regular expression [0-9]+\\.[0-9]+. If unspecified it will default to latest version."
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] The properties to set on daemon configuration files. Property keys are specified in \"prefix:property\" format, such as \"core:fs.defaultFS\". The following are supported prefixes and their mappings: core - core-site.xml hdfs - hdfs-site.xml mapred - mapred-site.xml yarn - yarn-site.xml hive - hive-site.xml pig - pig.properties spark - spark-defaults.conf",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "NodeInitializationAction": {
-   "id": "NodeInitializationAction",
-   "type": "object",
-   "description": "Specifies an executable to run on a fully configured node and a timeout period for executable completion.",
-   "properties": {
-    "executableFile": {
-     "type": "string",
-     "description": "[Required] Google Cloud Storage URI of executable file."
-    },
-    "executionTimeout": {
-     "type": "string",
-     "description": "[Optional] Amount of time executable has to complete. Default is 10 minutes. Cluster creation fails with an explanatory error message (the name of the executable that caused the error and the exceeded timeout period) if the executable is not completed at end of the timeout period."
-    }
-   }
-  },
-  "ClusterStatus": {
-   "id": "ClusterStatus",
-   "type": "object",
-   "description": "The status of a cluster and its instances.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "The cluster's state.",
-     "enum": [
-      "UNKNOWN",
-      "CREATING",
-      "RUNNING",
-      "ERROR",
-      "DELETING",
-      "UPDATING"
-     ]
-    },
-    "detail": {
-     "type": "string",
-     "description": "Optional details of cluster's state."
-    },
-    "stateStartTime": {
-     "type": "string",
-     "description": "Time when this state was entered."
-    }
-   }
-  },
-  "ClusterMetrics": {
-   "id": "ClusterMetrics",
-   "type": "object",
-   "description": "Contains cluster daemon metrics, such as HDFS and YARN stats.",
-   "properties": {
-    "hdfsMetrics": {
-     "type": "object",
-     "description": "The HDFS metrics.",
-     "additionalProperties": {
-      "type": "string",
-      "format": "int64"
-     }
-    },
-    "yarnMetrics": {
-     "type": "object",
-     "description": "The YARN metrics.",
-     "additionalProperties": {
-      "type": "string",
-      "format": "int64"
-     }
-    }
-   }
-  },
-  "Operation": {
-   "id": "Operation",
-   "type": "object",
-   "description": "An asynchronous operation in a project that runs over a given cluster. Used to track the progress of a user request that is running asynchronously. Examples include creating a cluster, updating a cluster, and deleting a cluster.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "The name of the operation resource, in the format projects/[project_id]/operations/[operation_id]"
-    },
-    "metadata": {
-     "type": "object",
-     "description": "Service-specific metadata associated with the operation.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object. Contains field @type with type URL."
-     }
-    },
-    "done": {
-     "type": "boolean",
-     "description": "Indicates if the operation is done. If true, the operation is complete and the `result` is available. If false, the operation is still in progress."
-    },
-    "error": {
-     "$ref": "Status",
-     "description": "The error result of the operation in case of failure."
-    },
-    "response": {
-     "type": "object",
-     "description": "The operation response. If the called method returns no data on success, the response is `google.protobuf.Empty`. If the called method is `Get`,`Create` or `Update`, the response is the resource. For all other methods, the response type is a concatenation of the method name and \"Response\". For example, if the called method is `TakeSnapshot()`, the response type is `TakeSnapshotResponse`.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object. Contains field @type with type URL."
-     }
-    }
-   }
-  },
-  "Status": {
-   "id": "Status",
-   "type": "object",
-   "description": "The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). The error model is designed to be: - Simple to use and understand for most users - Flexible enough to meet unexpected needs # Overview The `Status` message contains three pieces of data: error code, error message, and error details. The error code should be an enum value of google.rpc.Code, but it may accept additional error codes if needed. The error message should be a developer-facing English message that helps developers *understand* and *resolve* the error. If a localized user-facing error message is needed, put the localized message in the error details or localize it in the client. The optional error details may contain arbitrary information about the error. There is a predefined set of error detail types in the package `google.rpc` which can be used for common error conditions. # Language mapping The `Status` message is the logical representation of the error model, but it is not necessarily the actual wire format. When the `Status` message is exposed in different client libraries and different wire protocols, it can be mapped differently. For example, it will likely be mapped to some exceptions in Java, but more likely mapped to some error codes in C. # Other uses The error model and the `Status` message can be used in a variety of environments, either with or without APIs, to provide a consistent developer experience across different environments. Example uses of this error model include: - Partial errors. If a service needs to return partial errors to the client, it may embed the `Status` in the normal response to indicate the partial errors. - Workflow errors. A typical workflow has multiple steps. Each step may have a `Status` message for error reporting purpose. - Batch operations. If a client uses batch request and batch response, the `Status` message should be used directly inside batch response, one for each error sub-response. - Asynchronous operations. If an API call embeds asynchronous operation results in its response, the status of those operations should be represented directly using the `Status` message. - Logging. If some API errors are stored in logs, the message `Status` could be used directly after any stripping needed for security/privacy reasons.",
-   "properties": {
-    "code": {
-     "type": "integer",
-     "description": "The status code, which should be an enum value of google.rpc.Code.",
-     "format": "int32"
-    },
-    "message": {
-     "type": "string",
-     "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client."
-    },
-    "details": {
-     "type": "array",
-     "description": "A list of messages that carry the error details. There will be a common set of message types for APIs to use.",
-     "items": {
-      "type": "object",
-      "additionalProperties": {
-       "type": "any",
-       "description": "Properties of the object. Contains field @type with type URL."
-      }
-     }
-    }
-   }
-  },
-  "ListClustersResponse": {
-   "id": "ListClustersResponse",
-   "type": "object",
-   "description": "The list of all clusters in a project.",
-   "properties": {
-    "clusters": {
-     "type": "array",
-     "description": "[Output-only] The clusters in the project.",
-     "items": {
-      "$ref": "Cluster"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The standard List next-page token."
-    }
-   }
-  },
-  "SubmitJobRequest": {
-   "id": "SubmitJobRequest",
-   "type": "object",
-   "description": "A job submission request.",
-   "properties": {
-    "job": {
-     "$ref": "Job",
-     "description": "[Required] The job resource."
-    }
-   }
-  },
-  "Job": {
-   "id": "Job",
-   "type": "object",
-   "description": "A Cloud Dataproc job resource.",
-   "properties": {
-    "reference": {
-     "$ref": "JobReference",
-     "description": "[Optional] The fully-qualified reference to the job, which can be used to obtain the equivalent REST path of the job resource. If this property is not specified when a job is created, the server generates a job_id."
-    },
-    "placement": {
-     "$ref": "JobPlacement",
-     "description": "[Required] Job information, including how, when, and where to run the job."
-    },
-    "hadoopJob": {
-     "$ref": "HadoopJob",
-     "description": "Job is a Hadoop job."
-    },
-    "sparkJob": {
-     "$ref": "SparkJob",
-     "description": "Job is a Spark job."
-    },
-    "pysparkJob": {
-     "$ref": "PySparkJob",
-     "description": "Job is a Pyspark job."
-    },
-    "hiveJob": {
-     "$ref": "HiveJob",
-     "description": "Job is a Hive job."
-    },
-    "pigJob": {
-     "$ref": "PigJob",
-     "description": "Job is a Pig job."
-    },
-    "sparkSqlJob": {
-     "$ref": "SparkSqlJob",
-     "description": "Job is a SparkSql job."
-    },
-    "status": {
-     "$ref": "JobStatus",
-     "description": "[Output-only] The job status. Additional application-specific status information may be contained in the type_job and yarn_applications fields."
-    },
-    "statusHistory": {
-     "type": "array",
-     "description": "[Output-only] The previous job status.",
-     "items": {
-      "$ref": "JobStatus"
-     }
-    },
-    "yarnApplications": {
-     "type": "array",
-     "description": "[Output-only] The collection of Yarn applications spun up by this job.",
-     "items": {
-      "$ref": "YarnApplication"
-     }
-    },
-    "submittedBy": {
-     "type": "string",
-     "description": "[Output-only] The email address of the user submitting the job. For jobs submitted on the cluster, the address is username@hostname."
-    },
-    "driverOutputUri": {
-     "type": "string",
-     "description": "[Output-only] A URI pointing to the location of the mixed stdout/stderr of the job's driver program—for example, gs://sysbucket123/foo-cluster/jobid-123/driver/output."
-    },
-    "driverInputResourceUri": {
-     "type": "string",
-     "description": "[Output-only] A URI pointing to the location of the stdin of the job's driver program, only set if the job is interactive."
-    },
-    "driverOutputResourceUri": {
-     "type": "string",
-     "description": "[Output-only] A URI pointing to the location of the stdout of the job's driver program."
-    },
-    "driverControlFilesUri": {
-     "type": "string",
-     "description": "[Output-only] If present, the location of miscellaneous control files which may be used as part of job setup and handling. If not present, control files may be placed in the same location as driver_output_uri."
-    },
-    "interactive": {
-     "type": "boolean",
-     "description": "[Optional] If set to true, then the driver's stdin will be kept open and driver_input_uri will be set to provide a path at which additional input can be sent to the driver."
-    },
-    "labels": {
-     "type": "object",
-     "description": "[Optional] The labels to associate with this job. Label keys must be between 1 and 63 characters long, and must conform to the following regular expression: \\p{Ll}\\p{Lo}{0,62} Label values must be between 1 and 63 characters long, and must conform to the following regular expression: [\\p{Ll}\\p{Lo}\\p{N}_-]{0,63} No more than 64 labels can be associated with a given job.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "JobReference": {
-   "id": "JobReference",
-   "type": "object",
-   "description": "Encapsulates the full scoping used to reference a job.",
-   "properties": {
-    "projectId": {
-     "type": "string",
-     "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to."
-    },
-    "jobId": {
-     "type": "string",
-     "description": "[Required] The job ID, which must be unique within the project. The job ID is generated by the server upon job submission or provided by the user as a means to perform retries without creating duplicate jobs. The ID must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), or dashes (-). The maximum length is 512 characters."
-    }
-   }
-  },
-  "JobPlacement": {
-   "id": "JobPlacement",
-   "type": "object",
-   "description": "Cloud Dataproc job configuration.",
-   "properties": {
-    "clusterName": {
-     "type": "string",
-     "description": "[Required] The name of the cluster where the job will be submitted."
-    },
-    "clusterUuid": {
-     "type": "string",
-     "description": "[Output-only] A cluster UUID generated by the Dataproc service when the job is submitted."
-    }
-   }
-  },
-  "HadoopJob": {
-   "id": "HadoopJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running Hadoop MapReduce jobs on YARN.",
-   "properties": {
-    "mainJarFileUri": {
-     "type": "string",
-     "description": "The Hadoop Compatible Filesystem (HCFS) URI of the jar file containing the main class. Examples: gs://foo-bucket/analytics-binaries/extract-useful-metrics-mr.jar hdfs:/tmp/test-samples/custom-wordcount.jar file:///home/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar"
-    },
-    "mainClass": {
-     "type": "string",
-     "description": "The name of the driver's main class. The jar file containing the class must be in the default CLASSPATH or specified in jar_file_uris."
-    },
-    "args": {
-     "type": "array",
-     "description": "[Optional] The arguments to pass to the driver. Do not include arguments, such as -libjars or -Dfoo=bar, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] Jar file URIs to add to the CLASSPATHs of the Hadoop driver and tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "fileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of files to be copied to the working directory of Hadoop drivers and distributed tasks. Useful for naively parallel tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "archiveUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of archives to be extracted in the working directory of Hadoop drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, or .zip.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure Hadoop. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "loggingConfiguration": {
-     "$ref": "LoggingConfiguration",
-     "description": "[Optional] The runtime log configuration for job execution."
-    }
-   }
-  },
-  "LoggingConfiguration": {
-   "id": "LoggingConfiguration",
-   "type": "object",
-   "description": "The runtime logging configuration of the job.",
-   "properties": {
-    "driverLogLevels": {
-     "type": "object",
-     "description": "The per-package log levels for the driver. This may include 'root' package name to configure rootLogger. Examples: com.google = FATAL, root = INFO, org.apache = DEBUG",
-     "additionalProperties": {
-      "type": "string",
-      "enum": [
-       "LEVEL_UNSPECIFIED",
-       "ALL",
-       "TRACE",
-       "DEBUG",
-       "INFO",
-       "WARN",
-       "ERROR",
-       "FATAL",
-       "OFF"
-      ]
-     }
-    }
-   }
-  },
-  "SparkJob": {
-   "id": "SparkJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running Spark applications on YARN.",
-   "properties": {
-    "mainJarFileUri": {
-     "type": "string",
-     "description": "The Hadoop Compatible Filesystem (HCFS) URI of the jar file that contains the main class."
-    },
-    "mainClass": {
-     "type": "string",
-     "description": "The name of the driver's main class. The jar file that contains the class must be in the default CLASSPATH or specified in jar_file_uris."
-    },
-    "args": {
-     "type": "array",
-     "description": "[Optional] The arguments to pass to the driver. Do not include arguments, such as --conf, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to add to the CLASSPATHs of the Spark driver and tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "fileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of files to be copied to the working directory of Spark drivers and distributed tasks. Useful for naively parallel tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "archiveUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of archives to be extracted in the working directory of Spark drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, and .zip.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure Spark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "loggingConfiguration": {
-     "$ref": "LoggingConfiguration",
-     "description": "[Optional] The runtime log configuration for job execution."
-    }
-   }
-  },
-  "PySparkJob": {
-   "id": "PySparkJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running PySpark applications on YARN.",
-   "properties": {
-    "mainPythonFileUri": {
-     "type": "string",
-     "description": "[Required] The Hadoop Compatible Filesystem (HCFS) URI of the main Python file to use as the driver. Must be a .py file."
-    },
-    "args": {
-     "type": "array",
-     "description": "[Optional] The arguments to pass to the driver. Do not include arguments, such as --conf, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "pythonFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS file URIs of Python files to pass to the PySpark framework. Supported file types: .py, .egg, and .zip.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to add to the CLASSPATHs of the Python driver and tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "fileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of files to be copied to the working directory of Python drivers and distributed tasks. Useful for naively parallel tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "archiveUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of archives to be extracted in the working directory of .jar, .tar, .tar.gz, .tgz, and .zip.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure PySpark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "loggingConfiguration": {
-     "$ref": "LoggingConfiguration",
-     "description": "[Optional] The runtime log configuration for job execution."
-    }
-   }
-  },
-  "HiveJob": {
-   "id": "HiveJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running Hive queries on YARN.",
-   "properties": {
-    "queryFileUri": {
-     "type": "string",
-     "description": "The HCFS URI of the script that contains Hive queries."
-    },
-    "queryList": {
-     "$ref": "QueryList",
-     "description": "A list of queries."
-    },
-    "continueOnFailure": {
-     "type": "boolean",
-     "description": "[Optional] Whether to continue executing queries if a query fails. The default value is false. Setting to true can be useful when executing independent parallel queries."
-    },
-    "scriptVariables": {
-     "type": "object",
-     "description": "[Optional] Mapping of query variable names to values (equivalent to the Hive command: 'SET name=\"value\";').",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names and values, used to configure Hive. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/hive/conf/hive-site.xml, and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to add to the CLASSPATH of the Hive server and Hadoop MapReduce (MR) tasks. Can contain Hive SerDes and UDFs.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "QueryList": {
-   "id": "QueryList",
-   "type": "object",
-   "description": "A list of queries to run on a cluster.",
-   "properties": {
-    "queries": {
-     "type": "array",
-     "description": "[Required] The queries to execute. You do not need to terminate a query with a semicolon. Multiple queries can be specified in one string by separating each with a semicolon. Here is an example of an Cloud Dataproc API snippet that uses a QueryList to specify a HiveJob: \"hiveJob\": { \"queryList\": { \"queries\": [ \"query1\", \"query2\", \"query3;query4\", ] } }",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "PigJob": {
-   "id": "PigJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running Pig queries on YARN.",
-   "properties": {
-    "queryFileUri": {
-     "type": "string",
-     "description": "The HCFS URI of the script that contains the Pig queries."
-    },
-    "queryList": {
-     "$ref": "QueryList",
-     "description": "A list of queries."
-    },
-    "continueOnFailure": {
-     "type": "boolean",
-     "description": "[Optional] Whether to continue executing queries if a query fails. The default value is false. Setting to true can be useful when executing independent parallel queries."
-    },
-    "scriptVariables": {
-     "type": "object",
-     "description": "[Optional] Mapping of query variable names to values (equivalent to the Pig command: \"name=[value]\").",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure Pig. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/pig/conf/pig.properties, and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to add to the CLASSPATH of the Pig Client and Hadoop MapReduce (MR) tasks. Can contain Pig UDFs.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "loggingConfiguration": {
-     "$ref": "LoggingConfiguration",
-     "description": "[Optional] The runtime log configuration for job execution."
-    }
-   }
-  },
-  "SparkSqlJob": {
-   "id": "SparkSqlJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running Spark SQL queries.",
-   "properties": {
-    "queryFileUri": {
-     "type": "string",
-     "description": "The HCFS URI of the script that contains SQL queries."
-    },
-    "queryList": {
-     "$ref": "QueryList",
-     "description": "A list of queries."
-    },
-    "scriptVariables": {
-     "type": "object",
-     "description": "[Optional] Mapping of query variable names to values (equivalent to the Spark SQL command: SET name=\"value\";).",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure Spark SQL's SparkConf. Properties that conflict with values set by the Cloud Dataproc API may be overwritten.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to be added to the Spark CLASSPATH.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "loggingConfiguration": {
-     "$ref": "LoggingConfiguration",
-     "description": "[Optional] The runtime log configuration for job execution."
-    }
-   }
-  },
-  "JobStatus": {
-   "id": "JobStatus",
-   "type": "object",
-   "description": "Cloud Dataproc job status.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "[Required] A state message specifying the overall job state.",
-     "enum": [
-      "STATE_UNSPECIFIED",
-      "PENDING",
-      "SETUP_DONE",
-      "RUNNING",
-      "CANCEL_PENDING",
-      "CANCEL_STARTED",
-      "CANCELLED",
-      "DONE",
-      "ERROR"
-     ]
-    },
-    "details": {
-     "type": "string",
-     "description": "[Optional] Job state details, such as an error description if the state is ERROR."
-    },
-    "insertTime": {
-     "type": "string",
-     "description": "The time of the job request."
-    },
-    "startTime": {
-     "type": "string",
-     "description": "The time when the server started the job."
-    },
-    "endTime": {
-     "type": "string",
-     "description": "The time when the job completed."
-    },
-    "stateStartTime": {
-     "type": "string",
-     "description": "[Output-only] The time when this state was entered."
-    }
-   }
-  },
-  "YarnApplication": {
-   "id": "YarnApplication",
-   "type": "object",
-   "description": "A YARN application created by a job. Application information is a subset of org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "[Required] The application name."
-    },
-    "state": {
-     "type": "string",
-     "description": "[Required] The application state.",
-     "enum": [
-      "STATE_UNSPECIFIED",
-      "NEW",
-      "NEW_SAVING",
-      "SUBMITTED",
-      "ACCEPTED",
-      "RUNNING",
-      "FINISHED",
-      "FAILED",
-      "KILLED"
-     ]
-    },
-    "progress": {
-     "type": "number",
-     "description": "[Required] The numerical progress of the application, from 1 to 100.",
-     "format": "float"
-    },
-    "trackingUrl": {
-     "type": "string",
-     "description": "[Optional] The HTTP URL of the ApplicationMaster, HistoryServer, or TimelineServer that provides application-specific information. The URL uses the internal hostname, and requires a proxy server for resolution and, possibly, access."
-    }
-   }
-  },
-  "ListJobsResponse": {
-   "id": "ListJobsResponse",
-   "type": "object",
-   "description": "A response to a request to list jobs in a project.",
-   "properties": {
-    "jobs": {
-     "type": "array",
-     "description": "[Output-only] Jobs list.",
-     "items": {
-      "$ref": "Job"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "[Optional] This token is included in the response if there are more results to fetch. To fetch additional results, provide this value as the page_token in a subsequent ListJobsRequest."
-    }
-   }
-  },
-  "ListJobsRequest": {
-   "id": "ListJobsRequest",
-   "type": "object",
-   "description": "A request to list jobs in a project.",
-   "properties": {
-    "pageSize": {
-     "type": "integer",
-     "description": "[Optional] The number of results to return in each response.",
-     "format": "int32"
-    },
-    "pageToken": {
-     "type": "string",
-     "description": "[Optional] The page token, returned by a previous call, to request the next page of results."
-    },
-    "clusterName": {
-     "type": "string",
-     "description": "[Optional] If set, the returned jobs list includes only jobs that were submitted to the named cluster."
-    },
-    "jobStateMatcher": {
-     "type": "string",
-     "description": "[Optional] Specifies enumerated categories of jobs to list.",
-     "enum": [
-      "ALL",
-      "ACTIVE",
-      "NON_ACTIVE"
-     ]
-    },
-    "filter": {
-     "type": "string",
-     "description": "[Optional] A filter constraining which jobs to list. Valid filters contain job state and label terms such as: labels.key1 = val1 AND (labels.k2 = val2 OR labels.k3 = val3)"
-    }
-   }
-  },
-  "CancelJobRequest": {
-   "id": "CancelJobRequest",
-   "type": "object",
-   "description": "A request to cancel a job."
-  },
-  "ListOperationsResponse": {
-   "id": "ListOperationsResponse",
-   "type": "object",
-   "description": "The response message for Operations.ListOperations.",
-   "properties": {
+  "resources": {
     "operations": {
-     "type": "array",
-     "description": "A list of operations that match the specified filter in the request.",
-     "items": {
-      "$ref": "Operation"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The standard List next-page token."
-    }
-   }
-  },
-  "CancelOperationRequest": {
-   "id": "CancelOperationRequest",
-   "type": "object",
-   "description": "The request message for Operations.CancelOperation."
-  },
-  "Empty": {
-   "id": "Empty",
-   "type": "object",
-   "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance: service Foo { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); } The JSON representation for `Empty` is empty JSON object `{}`."
-  },
-  "DiagnoseClusterResults": {
-   "id": "DiagnoseClusterResults",
-   "type": "object",
-   "description": "The location of diagnostic output.",
-   "properties": {
-    "outputUri": {
-     "type": "string",
-     "description": "[Output-only] The Google Cloud Storage URI of the diagnostic output. The output report is a plain text file with a summary of collected diagnostics."
-    }
-   }
-  },
-  "ClusterOperationMetadata": {
-   "id": "ClusterOperationMetadata",
-   "type": "object",
-   "description": "Metadata describing the operation.",
-   "properties": {
-    "clusterName": {
-     "type": "string",
-     "description": "[Output-only] Name of the cluster for the operation."
-    },
-    "clusterUuid": {
-     "type": "string",
-     "description": "[Output-only] Cluster UUID for the operation."
-    },
-    "status": {
-     "$ref": "ClusterOperationStatus",
-     "description": "[Output-only] Current operation status."
-    },
-    "statusHistory": {
-     "type": "array",
-     "description": "[Output-only] The previous operation status.",
-     "items": {
-      "$ref": "ClusterOperationStatus"
-     }
-    },
-    "operationType": {
-     "type": "string",
-     "description": "[Output-only] The operation type."
-    },
-    "description": {
-     "type": "string",
-     "description": "[Output-only] Short description of operation."
-    },
-    "labels": {
-     "type": "object",
-     "description": "[Output-only] labels associated with the operation",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "ClusterOperationStatus": {
-   "id": "ClusterOperationStatus",
-   "type": "object",
-   "description": "The status of the operation.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "[Output-only] A message containing the operation state.",
-     "enum": [
-      "UNKNOWN",
-      "PENDING",
-      "RUNNING",
-      "DONE"
-     ]
-    },
-    "innerState": {
-     "type": "string",
-     "description": "[Output-only] A message containing the detailed operation state."
-    },
-    "details": {
-     "type": "string",
-     "description": "[Output-only]A message containing any operation metadata details."
-    },
-    "stateStartTime": {
-     "type": "string",
-     "description": "[Output-only] The time this state was entered."
-    }
-   }
-  },
-  "DiagnoseClusterOutputLocation": {
-   "id": "DiagnoseClusterOutputLocation",
-   "type": "object",
-   "description": "The location where output from diagnostic command can be found.",
-   "properties": {
-    "outputUri": {
-     "type": "string",
-     "description": "[Output-only] The Google Cloud Storage URI of the diagnostic output. This will be a plain text file with summary of collected diagnostics."
-    }
-   }
-  },
-  "OperationMetadata": {
-   "id": "OperationMetadata",
-   "type": "object",
-   "description": "Metadata describing the operation.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "A message containing the operation state.",
-     "enum": [
-      "UNKNOWN",
-      "PENDING",
-      "RUNNING",
-      "DONE"
-     ]
-    },
-    "innerState": {
-     "type": "string",
-     "description": "A message containing the detailed operation state."
-    },
-    "details": {
-     "type": "string",
-     "description": "A message containing any operation metadata details."
-    },
-    "insertTime": {
-     "type": "string",
-     "description": "The time that the operation was requested."
-    },
-    "startTime": {
-     "type": "string",
-     "description": "The time that the operation was started by the server."
-    },
-    "endTime": {
-     "type": "string",
-     "description": "The time that the operation completed."
-    },
-    "clusterName": {
-     "type": "string",
-     "description": "Name of the cluster for the operation."
-    },
-    "clusterUuid": {
-     "type": "string",
-     "description": "Cluster UUId for the operation."
-    },
-    "status": {
-     "$ref": "OperationStatus",
-     "description": "[Output-only] Current operation status."
-    },
-    "statusHistory": {
-     "type": "array",
-     "description": "[Output-only] Previous operation status.",
-     "items": {
-      "$ref": "OperationStatus"
-     }
-    },
-    "operationType": {
-     "type": "string",
-     "description": "[Output-only] The operation type."
-    },
-    "description": {
-     "type": "string",
-     "description": "[Output-only] Short description of operation."
-    }
-   }
-  },
-  "OperationStatus": {
-   "id": "OperationStatus",
-   "type": "object",
-   "description": "The status of the operation.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "A message containing the operation state.",
-     "enum": [
-      "UNKNOWN",
-      "PENDING",
-      "RUNNING",
-      "DONE"
-     ]
-    },
-    "innerState": {
-     "type": "string",
-     "description": "A message containing the detailed operation state."
-    },
-    "details": {
-     "type": "string",
-     "description": "A message containing any operation metadata details."
-    },
-    "stateStartTime": {
-     "type": "string",
-     "description": "The time this state was entered."
-    }
-   }
-  }
- },
- "resources": {
-  "projects": {
-   "resources": {
-    "regions": {
-     "resources": {
-      "clusters": {
-       "methods": {
-        "create": {
-         "id": "dataproc.projects.regions.clusters.create",
-         "path": "v1alpha1/projects/{projectId}/regions/{region}/clusters",
-         "httpMethod": "POST",
-         "description": "Request to create a cluster in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region"
-         ],
-         "request": {
-          "$ref": "Cluster"
-         },
-         "response": {
-          "$ref": "Operation"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "patch": {
-         "id": "dataproc.projects.regions.clusters.patch",
-         "path": "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
-         "httpMethod": "PATCH",
-         "description": "Request to update a cluster in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project the cluster belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "clusterName": {
-           "type": "string",
-           "description": "[Required] The cluster name.",
-           "required": true,
-           "location": "path"
-          },
-          "updateMask": {
-           "type": "string",
-           "description": "[Required] Specifies the path, relative to Cluster, of the field to update. For example, to change the number of workers in a cluster to 5, the update_mask parameter would be specified as \"configuration.worker_configuration.num_instances,\" and the PATCH request body would specify the new value, as follows: { \"configuration\":{ \"workerConfiguration\":{ \"numInstances\":\"5\" } } } Note: Currently, configuration.worker_configuration.num_instances is the only field that can be updated.",
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "clusterName"
-         ],
-         "request": {
-          "$ref": "Cluster"
-         },
-         "response": {
-          "$ref": "Operation"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "delete": {
-         "id": "dataproc.projects.regions.clusters.delete",
-         "path": "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
-         "httpMethod": "DELETE",
-         "description": "Request to delete a cluster in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "clusterName": {
-           "type": "string",
-           "description": "[Required] The cluster name.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "clusterName"
-         ],
-         "response": {
-          "$ref": "Operation"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
+      "methods": {
         "get": {
-         "id": "dataproc.projects.regions.clusters.get",
-         "path": "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
-         "httpMethod": "GET",
-         "description": "Request to get the resource representation for a cluster in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-           "required": true,
-           "location": "path"
+          "response": {
+            "$ref": "Operation"
           },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
+          "parameterOrder": [
+            "name"
+          ],
+          "httpMethod": "GET",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "name": {
+              "description": "The operation resource name.",
+              "required": true,
+              "type": "string",
+              "pattern": "^operations/.+$",
+              "location": "path"
+            }
           },
-          "clusterName": {
-           "type": "string",
-           "description": "[Required] The cluster name.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "clusterName"
-         ],
-         "response": {
-          "$ref": "Cluster"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
+          "flatPath": "v1alpha1/operations/{operationsId}",
+          "path": "v1alpha1/{+name}",
+          "id": "dataproc.operations.get",
+          "description": "Gets the latest state of a long-running operation. Clients may use this method to poll the operation result at intervals as recommended by the API service."
         },
         "list": {
-         "id": "dataproc.projects.regions.clusters.list",
-         "path": "v1alpha1/projects/{projectId}/regions/{region}/clusters",
-         "httpMethod": "GET",
-         "description": "Request a list of all regions/{region}/clusters in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-           "required": true,
-           "location": "path"
+          "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns google.rpc.Code.UNIMPLEMENTED.",
+          "httpMethod": "GET",
+          "parameterOrder": [
+            "name"
+          ],
+          "response": {
+            "$ref": "ListOperationsResponse"
           },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "pageSize": {
+              "description": "The standard List page size.",
+              "format": "int32",
+              "type": "integer",
+              "location": "query"
+            },
+            "filter": {
+              "description": "Required A JSON object that contains filters for the list operation, in the format {\"key1\":\"value1\",\"key2\":\"value2\", ..., }. Possible keys include project_id, cluster_name, and operation_state_matcher.If project_id is set, requests the list of operations that belong to the specified Google Cloud Platform project ID. This key is required.If cluster_name is set, requests the list of operations that were submitted to the specified cluster name. This key is optional.If operation_state_matcher is set, requests the list of operations that match one of the following status options: ALL, ACTIVE, or NON_ACTIVE.",
+              "type": "string",
+              "location": "query"
+            },
+            "name": {
+              "description": "The operation collection name.",
+              "required": true,
+              "type": "string",
+              "pattern": "^operations$",
+              "location": "path"
+            },
+            "pageToken": {
+              "description": "The standard List page token.",
+              "type": "string",
+              "location": "query"
+            }
           },
-          "filter": {
-           "type": "string",
-           "description": "[Optional] A filter constraining which clusters to list. Valid filters contain label terms such as: labels.key1 = val1 AND (-labels.k2 = val2 OR labels.k3 = val3)",
-           "location": "query"
-          },
-          "pageSize": {
-           "type": "integer",
-           "description": "The standard List page size.",
-           "format": "int32",
-           "location": "query"
-          },
-          "pageToken": {
-           "type": "string",
-           "description": "The standard List page token.",
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region"
-         ],
-         "response": {
-          "$ref": "ListClustersResponse"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        }
-       }
-      },
-      "jobs": {
-       "methods": {
-        "submit": {
-         "id": "dataproc.projects.regions.jobs.submit",
-         "path": "v1alpha1/projects/{projectId}/regions/{region}/jobs:submit",
-         "httpMethod": "POST",
-         "description": "Submits a job to a cluster.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region"
-         ],
-         "request": {
-          "$ref": "SubmitJobRequest"
-         },
-         "response": {
-          "$ref": "Job"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "get": {
-         "id": "dataproc.projects.regions.jobs.get",
-         "path": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}",
-         "httpMethod": "GET",
-         "description": "Gets the resource representation for a job in a project.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-           "required": true,
-           "location": "path"
-          },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "jobId": {
-           "type": "string",
-           "description": "[Required] The job ID.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "jobId"
-         ],
-         "response": {
-          "$ref": "Job"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
+          "flatPath": "v1alpha1/operations",
+          "id": "dataproc.operations.list",
+          "path": "v1alpha1/{+name}"
         },
         "cancel": {
-         "id": "dataproc.projects.regions.jobs.cancel",
-         "path": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}:cancel",
-         "httpMethod": "POST",
-         "description": "Starts a job cancellation request. To access the job resource after cancellation, call regions/{region}/jobs:list or regions/{region}/jobs:get.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-           "required": true,
-           "location": "path"
+          "request": {
+            "$ref": "CancelOperationRequest"
           },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
+          "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns google.rpc.Code.UNIMPLEMENTED. Clients may use Operations.GetOperation or other methods to check whether the cancellation succeeded or the operation completed despite cancellation.",
+          "response": {
+            "$ref": "Empty"
           },
-          "jobId": {
-           "type": "string",
-           "description": "[Required] The job ID.",
-           "required": true,
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "jobId"
-         ],
-         "request": {
-          "$ref": "CancelJobRequest"
-         },
-         "response": {
-          "$ref": "Job"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
+          "parameterOrder": [
+            "name"
+          ],
+          "httpMethod": "POST",
+          "parameters": {
+            "name": {
+              "description": "The name of the operation resource to be cancelled.",
+              "required": true,
+              "type": "string",
+              "pattern": "^operations/.+$",
+              "location": "path"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "flatPath": "v1alpha1/operations/{operationsId}:cancel",
+          "path": "v1alpha1/{+name}:cancel",
+          "id": "dataproc.operations.cancel"
         },
         "delete": {
-         "id": "dataproc.projects.regions.jobs.delete",
-         "path": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}",
-         "httpMethod": "DELETE",
-         "description": "Deletes the job from the project. If the job is active, the delete fails, and the response returns `FAILED_PRECONDITION`.",
-         "parameters": {
-          "projectId": {
-           "type": "string",
-           "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-           "required": true,
-           "location": "path"
+          "flatPath": "v1alpha1/operations/{operationsId}",
+          "id": "dataproc.operations.delete",
+          "path": "v1alpha1/{+name}",
+          "description": "Deletes a long-running operation. It indicates the client is no longer interested in the operation result. It does not cancel the operation.",
+          "httpMethod": "DELETE",
+          "response": {
+            "$ref": "Empty"
           },
-          "region": {
-           "type": "string",
-           "description": "[Required] The Dataproc region in which to handle the request.",
-           "required": true,
-           "location": "path"
-          },
-          "jobId": {
-           "type": "string",
-           "description": "[Required] The job ID.",
-           "required": true,
-           "location": "path"
+          "parameterOrder": [
+            "name"
+          ],
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "name": {
+              "description": "The name of the operation resource to be deleted.",
+              "required": true,
+              "type": "string",
+              "pattern": "^operations/.+$",
+              "location": "path"
+            }
           }
-         },
-         "parameterOrder": [
-          "projectId",
-          "region",
-          "jobId"
-         ],
-         "response": {
-          "$ref": "Job"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
         }
-       }
       }
-     }
+    },
+    "projects": {
+      "resources": {
+        "regions": {
+          "resources": {
+            "clusters": {
+              "methods": {
+                "delete": {
+                  "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
+                  "path": "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
+                  "id": "dataproc.projects.regions.clusters.delete",
+                  "description": "Request to delete a cluster in a project.",
+                  "response": {
+                    "$ref": "Operation"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "clusterName"
+                  ],
+                  "httpMethod": "DELETE",
+                  "parameters": {
+                    "region": {
+                      "description": "Required The Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "clusterName": {
+                      "location": "path",
+                      "description": "Required The cluster name.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
+                },
+                "patch": {
+                  "description": "Request to update a cluster in a project.",
+                  "request": {
+                    "$ref": "Cluster"
+                  },
+                  "httpMethod": "PATCH",
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "clusterName"
+                  ],
+                  "response": {
+                    "$ref": "Operation"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "region": {
+                      "location": "path",
+                      "description": "Required The Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "updateMask": {
+                      "location": "query",
+                      "description": "Required Specifies the path, relative to \u003ccode\u003eCluster\u003c/code\u003e, of the field to update. For example, to change the number of workers in a cluster to 5, the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be specified as \u003ccode\u003e\"configuration.worker_configuration.num_instances,\"\u003c/code\u003e and the PATCH request body would specify the new value, as follows:\n{\n  \"configuration\":{\n    \"workerConfiguration\":{\n      \"numInstances\":\"5\"\n    }\n  }\n}\n\u003cstrong\u003eNote:\u003c/strong\u003e Currently, \u003ccode\u003econfiguration.worker_configuration.num_instances\u003c/code\u003e is the only field that can be updated.",
+                      "format": "google-fieldmask",
+                      "type": "string"
+                    },
+                    "clusterName": {
+                      "description": "Required The cluster name.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "projectId": {
+                      "location": "path",
+                      "description": "Required The ID of the Google Cloud Platform project the cluster belongs to.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
+                  "id": "dataproc.projects.regions.clusters.patch",
+                  "path": "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}"
+                },
+                "get": {
+                  "description": "Request to get the resource representation for a cluster in a project.",
+                  "response": {
+                    "$ref": "Cluster"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "clusterName"
+                  ],
+                  "httpMethod": "GET",
+                  "parameters": {
+                    "region": {
+                      "location": "path",
+                      "description": "Required The Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "clusterName": {
+                      "location": "path",
+                      "description": "Required The cluster name.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
+                  "path": "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
+                  "id": "dataproc.projects.regions.clusters.get"
+                },
+                "list": {
+                  "description": "Request a list of all regions/{region}/clusters in a project.",
+                  "response": {
+                    "$ref": "ListClustersResponse"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region"
+                  ],
+                  "httpMethod": "GET",
+                  "parameters": {
+                    "pageSize": {
+                      "location": "query",
+                      "description": "The standard List page size.",
+                      "format": "int32",
+                      "type": "integer"
+                    },
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "region": {
+                      "description": "Required The Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "filter": {
+                      "location": "query",
+                      "description": "Optional A filter constraining which clusters to list. Valid filters contain label terms such as: labels.key1 = val1 AND (-labels.k2 = val2 OR labels.k3 = val3)",
+                      "type": "string"
+                    },
+                    "pageToken": {
+                      "description": "The standard List page token.",
+                      "type": "string",
+                      "location": "query"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/clusters",
+                  "path": "v1alpha1/projects/{projectId}/regions/{region}/clusters",
+                  "id": "dataproc.projects.regions.clusters.list"
+                },
+                "create": {
+                  "response": {
+                    "$ref": "Operation"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region"
+                  ],
+                  "httpMethod": "POST",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "region": {
+                      "description": "Required The Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/clusters",
+                  "path": "v1alpha1/projects/{projectId}/regions/{region}/clusters",
+                  "id": "dataproc.projects.regions.clusters.create",
+                  "description": "Request to create a cluster in a project.",
+                  "request": {
+                    "$ref": "Cluster"
+                  }
+                }
+              }
+            },
+            "jobs": {
+              "methods": {
+                "patch": {
+                  "description": "Updates a job in a project.",
+                  "request": {
+                    "$ref": "Job"
+                  },
+                  "httpMethod": "PATCH",
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "jobId"
+                  ],
+                  "response": {
+                    "$ref": "Job"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "region": {
+                      "location": "path",
+                      "description": "Required The Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "updateMask": {
+                      "description": "Required Specifies the path, relative to \u003ccode\u003eJob\u003c/code\u003e, of the field to update. For example, to update the labels of a Job the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be specified as \u003ccode\u003elabels\u003c/code\u003e, and the PATCH request body would specify the new value. \u003cstrong\u003eNote:\u003c/strong\u003e Currently, \u003ccode\u003elabels\u003c/code\u003e is the only field that can be updated.",
+                      "format": "google-fieldmask",
+                      "type": "string",
+                      "location": "query"
+                    },
+                    "projectId": {
+                      "location": "path",
+                      "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "jobId": {
+                      "description": "Required The job ID.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}",
+                  "id": "dataproc.projects.regions.jobs.patch",
+                  "path": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}"
+                },
+                "get": {
+                  "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}",
+                  "path": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}",
+                  "id": "dataproc.projects.regions.jobs.get",
+                  "description": "Gets the resource representation for a job in a project.",
+                  "response": {
+                    "$ref": "Job"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "jobId"
+                  ],
+                  "httpMethod": "GET",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "projectId": {
+                      "location": "path",
+                      "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "jobId": {
+                      "description": "Required The job ID.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "region": {
+                      "description": "Required The Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  }
+                },
+                "submit": {
+                  "response": {
+                    "$ref": "Job"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region"
+                  ],
+                  "httpMethod": "POST",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "region": {
+                      "location": "path",
+                      "description": "Required The Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "projectId": {
+                      "location": "path",
+                      "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/jobs:submit",
+                  "path": "v1alpha1/projects/{projectId}/regions/{region}/jobs:submit",
+                  "id": "dataproc.projects.regions.jobs.submit",
+                  "description": "Submits a job to a cluster.",
+                  "request": {
+                    "$ref": "SubmitJobRequest"
+                  }
+                },
+                "delete": {
+                  "description": "Deletes the job from the project. If the job is active, the delete fails, and the response returns FAILED_PRECONDITION.",
+                  "httpMethod": "DELETE",
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "jobId"
+                  ],
+                  "response": {
+                    "$ref": "Job"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "jobId": {
+                      "description": "Required The job ID.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "region": {
+                      "location": "path",
+                      "description": "Required The Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}",
+                  "id": "dataproc.projects.regions.jobs.delete",
+                  "path": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}"
+                },
+                "list": {
+                  "request": {
+                    "$ref": "ListJobsRequest"
+                  },
+                  "description": "Lists regions/{region}/jobs in a project.",
+                  "response": {
+                    "$ref": "ListJobsResponse"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region"
+                  ],
+                  "httpMethod": "POST",
+                  "parameters": {
+                    "region": {
+                      "description": "Required The Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/jobs:list",
+                  "path": "v1alpha1/projects/{projectId}/regions/{region}/jobs:list",
+                  "id": "dataproc.projects.regions.jobs.list"
+                },
+                "cancel": {
+                  "request": {
+                    "$ref": "CancelJobRequest"
+                  },
+                  "description": "Starts a job cancellation request. To access the job resource after cancellation, call regions/{region}/jobs:list or regions/{region}/jobs:get.",
+                  "response": {
+                    "$ref": "Job"
+                  },
+                  "parameterOrder": [
+                    "projectId",
+                    "region",
+                    "jobId"
+                  ],
+                  "httpMethod": "POST",
+                  "parameters": {
+                    "region": {
+                      "description": "Required The Dataproc region in which to handle the request.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "projectId": {
+                      "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    },
+                    "jobId": {
+                      "description": "Required The job ID.",
+                      "required": true,
+                      "type": "string",
+                      "location": "path"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}:cancel",
+                  "path": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}:cancel",
+                  "id": "dataproc.projects.regions.jobs.cancel"
+                }
+              }
+            }
+          }
+        }
+      }
     }
-   }
   },
-  "operations": {
-   "methods": {
-    "get": {
-     "id": "dataproc.operations.get",
-     "path": "v1alpha1/{+name}",
-     "httpMethod": "GET",
-     "description": "Gets the latest state of a long-running operation. Clients may use this method to poll the operation result at intervals as recommended by the API service.",
-     "parameters": {
-      "name": {
-       "type": "string",
-       "description": "The operation resource name.",
-       "required": true,
-       "pattern": "^operations/.+$",
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "name"
-     ],
-     "response": {
-      "$ref": "Operation"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform"
-     ]
+  "parameters": {
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
     },
-    "list": {
-     "id": "dataproc.operations.list",
-     "path": "v1alpha1/{+name}",
-     "httpMethod": "GET",
-     "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`.",
-     "parameters": {
-      "name": {
-       "type": "string",
-       "description": "The operation collection name.",
-       "required": true,
-       "pattern": "^operations$",
-       "location": "path"
-      },
-      "filter": {
-       "type": "string",
-       "description": "[Required] A JSON object that contains filters for the list operation, in the format {\"key1\":\"value1\",\"key2\":\"value2\", ..., }. Possible keys include project_id, cluster_name, and operation_state_matcher. If project_id is set, requests the list of operations that belong to the specified Google Cloud Platform project ID. This key is required. If cluster_name is set, requests the list of operations that were submitted to the specified cluster name. This key is optional. If operation_state_matcher is set, requests the list of operations that match one of the following status options: ALL, ACTIVE, or NON_ACTIVE.",
-       "location": "query"
-      },
-      "pageSize": {
-       "type": "integer",
-       "description": "The standard List page size.",
-       "format": "int32",
-       "location": "query"
-      },
-      "pageToken": {
-       "type": "string",
-       "description": "The standard List page token.",
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "name"
-     ],
-     "response": {
-      "$ref": "ListOperationsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform"
-     ]
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
     },
-    "cancel": {
-     "id": "dataproc.operations.cancel",
-     "path": "v1alpha1/{+name}:cancel",
-     "httpMethod": "POST",
-     "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`. Clients may use [Operations.GetOperation] or other methods to check whether the cancellation succeeded or the operation completed despite cancellation.",
-     "parameters": {
-      "name": {
-       "type": "string",
-       "description": "The name of the operation resource to be cancelled.",
-       "required": true,
-       "pattern": "^operations/.+$",
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "name"
-     ],
-     "request": {
-      "$ref": "CancelOperationRequest"
-     },
-     "response": {
-      "$ref": "Empty"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform"
-     ]
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
     },
-    "delete": {
-     "id": "dataproc.operations.delete",
-     "path": "v1alpha1/{+name}",
-     "httpMethod": "DELETE",
-     "description": "Deletes a long-running operation. It indicates the client is no longer interested in the operation result. It does not cancel the operation.",
-     "parameters": {
-      "name": {
-       "type": "string",
-       "description": "The name of the operation resource to be deleted.",
-       "required": true,
-       "pattern": "^operations/.+$",
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "name"
-     ],
-     "response": {
-      "$ref": "Empty"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform"
-     ]
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string",
+      "location": "query"
+    },
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "callback": {
+      "description": "JSONP",
+      "type": "string",
+      "location": "query"
+    },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "alt": {
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string"
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string",
+      "location": "query"
     }
-   }
-  }
- }
+  },
+  "schemas": {
+    "InstanceGroupConfiguration": {
+      "description": "The configuration settings for Google Compute Engine resources in an instance group, such as a master or worker group.",
+      "type": "object",
+      "properties": {
+        "numInstances": {
+          "description": "The number of VM instances in the instance group. For master instance groups, must be set to 1.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "diskConfiguration": {
+          "$ref": "DiskConfiguration",
+          "description": "Disk option configuration settings."
+        },
+        "machineTypeUri": {
+          "description": "The Google Compute Engine machine type used for cluster instances. Example: \"compute.googleapis.com/projects/project_id /zones/us-east1-a/machineTypes/n1-standard-2\".",
+          "type": "string"
+        },
+        "imageUri": {
+          "description": "Output-only The Google Compute Engine image resource used for cluster instances. Inferred from SoftwareConfiguration.image_version. Example: \"compute.googleapis.com/projects/debian-cloud /global/images/backports-debian-7-wheezy-v20140904\".",
+          "type": "string"
+        },
+        "isPreemptible": {
+          "description": "Specifies that this instance group contains Preemptible Instances.",
+          "type": "boolean"
+        },
+        "instanceNames": {
+          "description": "The list of instance names. Dataproc derives the names from cluster_name, num_instances, and the instance group if not set by user (recommended practice is to let Dataproc derive the name).",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "managedGroupConfiguration": {
+          "$ref": "ManagedGroupConfiguration",
+          "description": "Output-only The configuration for Google Compute Engine Instance Group Manager that manages this group. This is only used for preemptible instance groups."
+        }
+      },
+      "id": "InstanceGroupConfiguration"
+    },
+    "GceClusterConfiguration": {
+      "description": "Common configuration settings for resources of Google Compute Engine cluster instances, applicable to all instances in the cluster.",
+      "type": "object",
+      "properties": {
+        "internalIpOnly": {
+          "description": "If true, all instances in the cluser will only have internal IP addresses. By default, clusters are not restricted to internal IP addresses, and will have ephemeral external IP addresses assigned to each instance. This restriction can only be enabled for subnetwork enabled networks, and all off-cluster dependencies must be configured to be accessible without external IP addresses.",
+          "type": "boolean"
+        },
+        "metadata": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "The Google Compute Engine metadata entries to add to all instances.",
+          "type": "object"
+        },
+        "serviceAccountScopes": {
+          "description": "The service account scopes included in Google Compute Engine instances. Must include devstorage.full_control to enable the Google Cloud Storage connector. Example \"auth.googleapis.com/compute\" and \"auth.googleapis.com/devstorage.full_control\".",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "tags": {
+          "description": "The Google Compute Engine tags to add to all instances.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "serviceAccount": {
+          "description": "Optional The service account of the instances. Defaults to the default Google Compute Engine service account. Custom service accounts need permissions equivalent to the folloing IAM roles:\nroles/logging.logWriter\nroles/storage.objectAdmin(see https://cloud.google.com/compute/docs/access/service-accounts#custom_service_accounts for more information). Example: [account_id]@[project_id].iam.gserviceaccount.com",
+          "type": "string"
+        },
+        "subnetworkUri": {
+          "description": "The Google Compute Engine subnetwork to be used for machine communications. Cannot be specified with network_uri. Example: compute.googleapis.com/projects/[project_id]/regions/us-east1/sub0.",
+          "type": "string"
+        },
+        "networkUri": {
+          "description": "The Google Compute Engine network to be used for machine communications. Cannot be specified with subnetwork_uri. If neither network_uri nor subnetwork_uri is specified, the \"default\" network of the project is used, if it exists. Cannot be a \"Custom Subnet Network\" (see https://cloud.google.com/compute/docs/subnetworks for more information). Example: compute.googleapis.com/projects/[project_id]/regions/global/default.",
+          "type": "string"
+        },
+        "zoneUri": {
+          "description": "Required The zone where the Google Compute Engine cluster will be located. Example: \"compute.googleapis.com/projects/project_id /zones/us-east1-a\".",
+          "type": "string"
+        }
+      },
+      "id": "GceClusterConfiguration"
+    },
+    "CancelOperationRequest": {
+      "description": "The request message for Operations.CancelOperation.",
+      "type": "object",
+      "properties": {},
+      "id": "CancelOperationRequest"
+    },
+    "DiagnoseClusterOutputLocation": {
+      "description": "The location where output from diagnostic command can be found.",
+      "type": "object",
+      "properties": {
+        "outputUri": {
+          "description": "Output-only The Google Cloud Storage URI of the diagnostic output. This will be a plain text file with summary of collected diagnostics.",
+          "type": "string"
+        }
+      },
+      "id": "DiagnoseClusterOutputLocation"
+    },
+    "Operation": {
+      "description": "An asynchronous operation in a project that runs over a given cluster. Used to track the progress of a user request that is running asynchronously. Examples include creating a cluster, updating a cluster, and deleting a cluster.",
+      "type": "object",
+      "properties": {
+        "error": {
+          "$ref": "Status",
+          "description": "The error result of the operation in case of failure."
+        },
+        "metadata": {
+          "description": "Service-specific metadata associated with the operation.",
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          }
+        },
+        "done": {
+          "description": "Indicates if the operation is done. If true, the operation is complete and the result is available. If false, the operation is still in progress.",
+          "type": "boolean"
+        },
+        "response": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "The operation response. If the called method returns no data on success, the response is google.protobuf.Empty. If the called method is Get,Create or Update, the response is the resource. For all other methods, the response type is a concatenation of the method name and \"Response\". For example, if the called method is TakeSnapshot(), the response type is TakeSnapshotResponse.",
+          "type": "object"
+        },
+        "name": {
+          "description": "The name of the operation resource, in the format projects/project_id/operations/operation_id",
+          "type": "string"
+        }
+      },
+      "id": "Operation"
+    },
+    "OperationStatus": {
+      "description": "The status of the operation.",
+      "type": "object",
+      "properties": {
+        "state": {
+          "enumDescriptions": [
+            "Unused.",
+            "The operation has been created.",
+            "The operation is running.",
+            "The operation is done; either cancelled or completed."
+          ],
+          "enum": [
+            "UNKNOWN",
+            "PENDING",
+            "RUNNING",
+            "DONE"
+          ],
+          "description": "A message containing the operation state.",
+          "type": "string"
+        },
+        "details": {
+          "description": "A message containing any operation metadata details.",
+          "type": "string"
+        },
+        "innerState": {
+          "description": "A message containing the detailed operation state.",
+          "type": "string"
+        },
+        "stateStartTime": {
+          "description": "The time this state was entered.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "OperationStatus"
+    },
+    "JobReference": {
+      "description": "Encapsulates the full scoping used to reference a job.",
+      "type": "object",
+      "properties": {
+        "projectId": {
+          "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+          "type": "string"
+        },
+        "jobId": {
+          "description": "Required The job ID, which must be unique within the project. The job ID is generated by the server upon job submission or provided by the user as a means to perform retries without creating duplicate jobs. The ID must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), or dashes (-). The maximum length is 512 characters.",
+          "type": "string"
+        }
+      },
+      "id": "JobReference"
+    },
+    "SubmitJobRequest": {
+      "description": "A job submission request.",
+      "type": "object",
+      "properties": {
+        "job": {
+          "description": "Required The job resource.",
+          "$ref": "Job"
+        }
+      },
+      "id": "SubmitJobRequest"
+    },
+    "Status": {
+      "description": "The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC (https://github.com/grpc). The error model is designed to be:\nSimple to use and understand for most users\nFlexible enough to meet unexpected needsOverviewThe Status message contains three pieces of data: error code, error message, and error details. The error code should be an enum value of google.rpc.Code, but it may accept additional error codes if needed. The error message should be a developer-facing English message that helps developers understand and resolve the error. If a localized user-facing error message is needed, put the localized message in the error details or localize it in the client. The optional error details may contain arbitrary information about the error. There is a predefined set of error detail types in the package google.rpc which can be used for common error conditions.Language mappingThe Status message is the logical representation of the error model, but it is not necessarily the actual wire format. When the Status message is exposed in different client libraries and different wire protocols, it can be mapped differently. For example, it will likely be mapped to some exceptions in Java, but more likely mapped to some error codes in C.Other usesThe error model and the Status message can be used in a variety of environments, either with or without APIs, to provide a consistent developer experience across different environments.Example uses of this error model include:\nPartial errors. If a service needs to return partial errors to the client, it may embed the Status in the normal response to indicate the partial errors.\nWorkflow errors. A typical workflow has multiple steps. Each step may have a Status message for error reporting purpose.\nBatch operations. If a client uses batch request and batch response, the Status message should be used directly inside batch response, one for each error sub-response.\nAsynchronous operations. If an API call embeds asynchronous operation results in its response, the status of those operations should be represented directly using the Status message.\nLogging. If some API errors are stored in logs, the message Status could be used directly after any stripping needed for security/privacy reasons.",
+      "type": "object",
+      "properties": {
+        "details": {
+          "description": "A list of messages that carry the error details. There will be a common set of message types for APIs to use.",
+          "type": "array",
+          "items": {
+            "additionalProperties": {
+              "description": "Properties of the object. Contains field @type with type URL.",
+              "type": "any"
+            },
+            "type": "object"
+          }
+        },
+        "code": {
+          "description": "The status code, which should be an enum value of google.rpc.Code.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "message": {
+          "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.",
+          "type": "string"
+        }
+      },
+      "id": "Status"
+    },
+    "JobScheduling": {
+      "description": "Job scheduling options.Beta Feature: These options are available for testing purposes only. They may be changed before final release.",
+      "type": "object",
+      "properties": {
+        "maxFailuresPerHour": {
+          "description": "Optional Maximum number of times per hour a driver may be restarted as a result of driver terminating with non-zero code before job is reported failed.A job may be reported as thrashing if driver exits with non-zero code 4 times within 10 minute window.Maximum value is 10.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "JobScheduling"
+    },
+    "NodeInitializationAction": {
+      "description": "Specifies an executable to run on a fully configured node and a timeout period for executable completion.",
+      "type": "object",
+      "properties": {
+        "executableFile": {
+          "description": "Required Google Cloud Storage URI of executable file.",
+          "type": "string"
+        },
+        "executionTimeout": {
+          "description": "Optional Amount of time executable has to complete. Default is 10 minutes. Cluster creation fails with an explanatory error message (the name of the executable that caused the error and the exceeded timeout period) if the executable is not completed at end of the timeout period.",
+          "format": "google-duration",
+          "type": "string"
+        }
+      },
+      "id": "NodeInitializationAction"
+    },
+    "ListJobsResponse": {
+      "description": "A response to a request to list jobs in a project.",
+      "type": "object",
+      "properties": {
+        "nextPageToken": {
+          "description": "Optional This token is included in the response if there are more results to fetch. To fetch additional results, provide this value as the page_token in a subsequent \u003ccode\u003eListJobsRequest\u003c/code\u003e.",
+          "type": "string"
+        },
+        "jobs": {
+          "description": "Output-only Jobs list.",
+          "type": "array",
+          "items": {
+            "$ref": "Job"
+          }
+        }
+      },
+      "id": "ListJobsResponse"
+    },
+    "CancelJobRequest": {
+      "description": "A request to cancel a job.",
+      "type": "object",
+      "properties": {},
+      "id": "CancelJobRequest"
+    },
+    "SparkSqlJob": {
+      "description": "A Cloud Dataproc job for running Spark SQL queries.",
+      "type": "object",
+      "properties": {
+        "scriptVariables": {
+          "description": "Optional Mapping of query variable names to values (equivalent to the Spark SQL command: SET name=\"value\";).",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to be added to the Spark CLASSPATH.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "loggingConfiguration": {
+          "description": "Optional The runtime log configuration for job execution.",
+          "$ref": "LoggingConfiguration"
+        },
+        "properties": {
+          "description": "Optional A mapping of property names to values, used to configure Spark SQL's SparkConf. Properties that conflict with values set by the Cloud Dataproc API may be overwritten.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "queryList": {
+          "description": "A list of queries.",
+          "$ref": "QueryList"
+        },
+        "queryFileUri": {
+          "description": "The HCFS URI of the script that contains SQL queries.",
+          "type": "string"
+        }
+      },
+      "id": "SparkSqlJob"
+    },
+    "Cluster": {
+      "description": "Describes the identifying information, configuration, and status of a cluster of Google Compute Engine instances.",
+      "type": "object",
+      "properties": {
+        "createTime": {
+          "description": "Output-only The timestamp of cluster creation.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "labels": {
+          "description": "Optional The labels to associate with this cluster.Label keys must be between 1 and 63 characters long, and must conform to the following PCRE regular expression: \\p{Ll}\\p{Lo}{0,62}Label values must be between 1 and 63 characters long, and must conform to the following PCRE regular expression: \\p{Ll}\\p{Lo}\\p{N}_-{0,63}No more than 64 labels can be associated with a given cluster.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "metrics": {
+          "$ref": "ClusterMetrics",
+          "description": "Contains cluster daemon metrics such as HDFS and YARN stats."
+        },
+        "status": {
+          "description": "Output-only Cluster status.",
+          "$ref": "ClusterStatus"
+        },
+        "statusHistory": {
+          "description": "Output-only Previous cluster statuses.",
+          "type": "array",
+          "items": {
+            "$ref": "ClusterStatus"
+          }
+        },
+        "clusterName": {
+          "description": "Required The cluster name. Cluster names within a project must be unique. Names from deleted clusters can be reused.",
+          "type": "string"
+        },
+        "clusterUuid": {
+          "description": "Output-only A cluster UUID (Unique Universal Identifier). Cloud Dataproc generates this value when it creates the cluster.",
+          "type": "string"
+        },
+        "projectId": {
+          "description": "Required The Google Cloud Platform project ID that the cluster belongs to.",
+          "type": "string"
+        },
+        "configuration": {
+          "$ref": "ClusterConfiguration",
+          "description": "Required The cluster configuration. It may differ from a user's initial configuration due to Cloud Dataproc setting of default values and updating clusters."
+        }
+      },
+      "id": "Cluster"
+    },
+    "ListOperationsResponse": {
+      "description": "The response message for Operations.ListOperations.",
+      "type": "object",
+      "properties": {
+        "operations": {
+          "description": "A list of operations that match the specified filter in the request.",
+          "type": "array",
+          "items": {
+            "$ref": "Operation"
+          }
+        },
+        "nextPageToken": {
+          "description": "The standard List next-page token.",
+          "type": "string"
+        }
+      },
+      "id": "ListOperationsResponse"
+    },
+    "OperationMetadata": {
+      "description": "Metadata describing the operation.",
+      "type": "object",
+      "properties": {
+        "insertTime": {
+          "description": "The time that the operation was requested.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "statusHistory": {
+          "description": "Output-only Previous operation status.",
+          "type": "array",
+          "items": {
+            "$ref": "OperationStatus"
+          }
+        },
+        "operationType": {
+          "description": "Output-only The operation type.",
+          "type": "string"
+        },
+        "description": {
+          "description": "Output-only Short description of operation.",
+          "type": "string"
+        },
+        "status": {
+          "description": "Output-only Current operation status.",
+          "$ref": "OperationStatus"
+        },
+        "state": {
+          "description": "A message containing the operation state.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unused.",
+            "The operation has been created.",
+            "The operation is currently running.",
+            "The operation is done, either cancelled or completed."
+          ],
+          "enum": [
+            "UNKNOWN",
+            "PENDING",
+            "RUNNING",
+            "DONE"
+          ]
+        },
+        "details": {
+          "description": "A message containing any operation metadata details.",
+          "type": "string"
+        },
+        "clusterName": {
+          "description": "Name of the cluster for the operation.",
+          "type": "string"
+        },
+        "clusterUuid": {
+          "description": "Cluster UUId for the operation.",
+          "type": "string"
+        },
+        "innerState": {
+          "description": "A message containing the detailed operation state.",
+          "type": "string"
+        },
+        "endTime": {
+          "description": "The time that the operation completed.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "startTime": {
+          "description": "The time that the operation was started by the server.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "warnings": {
+          "description": "Output-only Errors encountered during operation execution.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "OperationMetadata"
+    },
+    "JobPlacement": {
+      "description": "Cloud Dataproc job configuration.",
+      "type": "object",
+      "properties": {
+        "clusterName": {
+          "description": "Required The name of the cluster where the job will be submitted.",
+          "type": "string"
+        },
+        "clusterUuid": {
+          "description": "Output-only A cluster UUID generated by the Dataproc service when the job is submitted.",
+          "type": "string"
+        }
+      },
+      "id": "JobPlacement"
+    },
+    "PigJob": {
+      "description": "A Cloud Dataproc job for running Pig queries on YARN.",
+      "type": "object",
+      "properties": {
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to add to the CLASSPATH of the Pig Client and Hadoop MapReduce (MR) tasks. Can contain Pig UDFs.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "scriptVariables": {
+          "description": "Optional Mapping of query variable names to values (equivalent to the Pig command: \"name=value\").",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "loggingConfiguration": {
+          "description": "Optional The runtime log configuration for job execution.",
+          "$ref": "LoggingConfiguration"
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional A mapping of property names to values, used to configure Pig. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/pig/conf/pig.properties, and classes in user code.",
+          "type": "object"
+        },
+        "continueOnFailure": {
+          "description": "Optional Whether to continue executing queries if a query fails. The default value is false. Setting to true can be useful when executing independent parallel queries.",
+          "type": "boolean"
+        },
+        "queryFileUri": {
+          "description": "The HCFS URI of the script that contains the Pig queries.",
+          "type": "string"
+        },
+        "queryList": {
+          "$ref": "QueryList",
+          "description": "A list of queries."
+        }
+      },
+      "id": "PigJob"
+    },
+    "ClusterStatus": {
+      "description": "The status of a cluster and its instances.",
+      "type": "object",
+      "properties": {
+        "detail": {
+          "description": "Optional details of cluster's state.",
+          "type": "string"
+        },
+        "state": {
+          "enumDescriptions": [
+            "The cluster state is unknown.",
+            "The cluster is being created and set up. It is not ready for use.",
+            "The cluster is currently running and healthy. It is ready for use.",
+            "The cluster encountered an error. It is not ready for use.",
+            "The cluster is being deleted. It cannot be used.",
+            "The cluster is being updated. It continues to accept and process jobs."
+          ],
+          "enum": [
+            "UNKNOWN",
+            "CREATING",
+            "RUNNING",
+            "ERROR",
+            "DELETING",
+            "UPDATING"
+          ],
+          "description": "The cluster's state.",
+          "type": "string"
+        },
+        "stateStartTime": {
+          "description": "Time when this state was entered.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "ClusterStatus"
+    },
+    "ListClustersResponse": {
+      "description": "The list of all clusters in a project.",
+      "type": "object",
+      "properties": {
+        "clusters": {
+          "description": "Output-only The clusters in the project.",
+          "type": "array",
+          "items": {
+            "$ref": "Cluster"
+          }
+        },
+        "nextPageToken": {
+          "description": "The standard List next-page token.",
+          "type": "string"
+        }
+      },
+      "id": "ListClustersResponse"
+    },
+    "ManagedGroupConfiguration": {
+      "description": "Specifies the resources used to actively manage an instance group.",
+      "type": "object",
+      "properties": {
+        "instanceGroupManagerName": {
+          "description": "Output-only The name of Instance Group Manager managing this group.",
+          "type": "string"
+        },
+        "instanceTemplateName": {
+          "description": "Output-only The name of Instance Template used for Managed Instance Group.",
+          "type": "string"
+        }
+      },
+      "id": "ManagedGroupConfiguration"
+    },
+    "SparkJob": {
+      "description": "A Cloud Dataproc job for running Spark applications on YARN.",
+      "type": "object",
+      "properties": {
+        "mainJarFileUri": {
+          "description": "The Hadoop Compatible Filesystem (HCFS) URI of the jar file that contains the main class.",
+          "type": "string"
+        },
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to add to the CLASSPATHs of the Spark driver and tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "loggingConfiguration": {
+          "$ref": "LoggingConfiguration",
+          "description": "Optional The runtime log configuration for job execution."
+        },
+        "properties": {
+          "description": "Optional A mapping of property names to values, used to configure Spark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "args": {
+          "description": "Optional The arguments to pass to the driver. Do not include arguments, such as --conf, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "fileUris": {
+          "description": "Optional HCFS URIs of files to be copied to the working directory of Spark drivers and distributed tasks. Useful for naively parallel tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainClass": {
+          "description": "The name of the driver's main class. The jar file that contains the class must be in the default CLASSPATH or specified in jar_file_uris.",
+          "type": "string"
+        },
+        "archiveUris": {
+          "description": "Optional HCFS URIs of archives to be extracted in the working directory of Spark drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, and .zip.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "SparkJob"
+    },
+    "Job": {
+      "description": "A Cloud Dataproc job resource.",
+      "type": "object",
+      "properties": {
+        "reference": {
+          "$ref": "JobReference",
+          "description": "Optional The fully-qualified reference to the job, which can be used to obtain the equivalent REST path of the job resource. If this property is not specified when a job is created, the server generates a \u003ccode\u003ejob_id\u003c/code\u003e."
+        },
+        "interactive": {
+          "description": "Optional If set to true, then the driver's stdin will be kept open and driver_input_uri will be set to provide a path at which additional input can be sent to the driver.",
+          "type": "boolean"
+        },
+        "driverInputResourceUri": {
+          "description": "Output-only A URI pointing to the location of the stdin of the job's driver program, only set if the job is interactive.",
+          "type": "string"
+        },
+        "hadoopJob": {
+          "description": "Job is a Hadoop job.",
+          "$ref": "HadoopJob"
+        },
+        "status": {
+          "description": "Output-only The job status. Additional application-specific status information may be contained in the \u003ccode\u003etype_job\u003c/code\u003e and \u003ccode\u003eyarn_applications\u003c/code\u003e fields.",
+          "$ref": "JobStatus"
+        },
+        "placement": {
+          "$ref": "JobPlacement",
+          "description": "Required Job information, including how, when, and where to run the job."
+        },
+        "driverControlFilesUri": {
+          "description": "Output-only If present, the location of miscellaneous control files which may be used as part of job setup and handling. If not present, control files may be placed in the same location as driver_output_uri.",
+          "type": "string"
+        },
+        "submittedBy": {
+          "description": "Output-only The email address of the user submitting the job. For jobs submitted on the cluster, the address is \u003ccode\u003eusername@hostname\u003c/code\u003e.",
+          "type": "string"
+        },
+        "scheduling": {
+          "description": "Optional Job scheduling configuration.",
+          "$ref": "JobScheduling"
+        },
+        "pigJob": {
+          "description": "Job is a Pig job.",
+          "$ref": "PigJob"
+        },
+        "driverOutputUri": {
+          "description": "Output-only A URI pointing to the location of the mixed stdout/stderr of the job's driver program&mdash;for example, \u003ccode\u003egs://sysbucket123/foo-cluster/jobid-123/driver/output\u003c/code\u003e.",
+          "type": "string"
+        },
+        "hiveJob": {
+          "description": "Job is a Hive job.",
+          "$ref": "HiveJob"
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional The labels to associate with this job.Label keys must be between 1 and 63 characters long, and must conform to the following regular expression: \\p{Ll}\\p{Lo}{0,62}Label values must be between 1 and 63 characters long, and must conform to the following regular expression: \\p{Ll}\\p{Lo}\\p{N}_-{0,63}No more than 64 labels can be associated with a given job.",
+          "type": "object"
+        },
+        "driverOutputResourceUri": {
+          "description": "Output-only A URI pointing to the location of the stdout of the job's driver program.",
+          "type": "string"
+        },
+        "sparkSqlJob": {
+          "description": "Job is a SparkSql job.",
+          "$ref": "SparkSqlJob"
+        },
+        "sparkJob": {
+          "$ref": "SparkJob",
+          "description": "Job is a Spark job."
+        },
+        "statusHistory": {
+          "description": "Output-only The previous job status.",
+          "type": "array",
+          "items": {
+            "$ref": "JobStatus"
+          }
+        },
+        "yarnApplications": {
+          "description": "Output-only The collection of Yarn applications spun up by this job.",
+          "type": "array",
+          "items": {
+            "$ref": "YarnApplication"
+          }
+        },
+        "pysparkJob": {
+          "$ref": "PySparkJob",
+          "description": "Job is a Pyspark job."
+        }
+      },
+      "id": "Job"
+    },
+    "DiskConfiguration": {
+      "description": "Specifies the configuration of disk options for a group of VM instances.",
+      "type": "object",
+      "properties": {
+        "bootDiskSizeGb": {
+          "description": "Optional Size in GB of the boot disk (default is 500GB).",
+          "format": "int32",
+          "type": "integer"
+        },
+        "numLocalSsds": {
+          "description": "Optional Number of attached SSDs, from 0 to 4 (default is 0). If SSDs are not attached, the boot disk is used to store runtime logs, and HDFS data. If one or more SSDs are attached, this runtime bulk data is spread across them, and the boot disk contains only basic configuration and installed binaries.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "DiskConfiguration"
+    },
+    "JobStatus": {
+      "description": "Cloud Dataproc job status.",
+      "type": "object",
+      "properties": {
+        "insertTime": {
+          "description": "The time of the job request.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "state": {
+          "description": "Required A state message specifying the overall job state.",
+          "type": "string",
+          "enumDescriptions": [
+            "The job state is unknown.",
+            "The job is pending; it has been submitted, but is not yet running.",
+            "Job has been received by the service and completed initial setup; it will shortly be submitted to the cluster.",
+            "The job is running on the cluster.",
+            "A CancelJob request has been received, but is pending.",
+            "Transient in-flight resources have been canceled, and the request to cancel the running job has been issued to the cluster.",
+            "The job cancelation was successful.",
+            "The job has completed successfully.",
+            "The job has completed, but encountered an error.",
+            "Job attempt has failed. The detail field contains failure details for this attempt.Applies to restartable jobs only."
+          ],
+          "enum": [
+            "STATE_UNSPECIFIED",
+            "PENDING",
+            "SETUP_DONE",
+            "RUNNING",
+            "CANCEL_PENDING",
+            "CANCEL_STARTED",
+            "CANCELLED",
+            "DONE",
+            "ERROR",
+            "ATTEMPT_FAILURE"
+          ]
+        },
+        "details": {
+          "description": "Optional Job state details, such as an error description if the state is \u003ccode\u003eERROR\u003c/code\u003e.",
+          "type": "string"
+        },
+        "stateStartTime": {
+          "description": "Output-only The time when this state was entered.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "endTime": {
+          "description": "The time when the job completed.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "startTime": {
+          "description": "The time when the server started the job.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "JobStatus"
+    },
+    "ClusterOperationStatus": {
+      "description": "The status of the operation.",
+      "type": "object",
+      "properties": {
+        "state": {
+          "enumDescriptions": [
+            "Unused.",
+            "The operation has been created.",
+            "The operation is running.",
+            "The operation is done; either cancelled or completed."
+          ],
+          "enum": [
+            "UNKNOWN",
+            "PENDING",
+            "RUNNING",
+            "DONE"
+          ],
+          "description": "Output-only A message containing the operation state.",
+          "type": "string"
+        },
+        "details": {
+          "description": "Output-onlyA message containing any operation metadata details.",
+          "type": "string"
+        },
+        "innerState": {
+          "description": "Output-only A message containing the detailed operation state.",
+          "type": "string"
+        },
+        "stateStartTime": {
+          "description": "Output-only The time this state was entered.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "ClusterOperationStatus"
+    },
+    "HadoopJob": {
+      "description": "A Cloud Dataproc job for running Hadoop MapReduce jobs on YARN.",
+      "type": "object",
+      "properties": {
+        "jarFileUris": {
+          "description": "Optional Jar file URIs to add to the CLASSPATHs of the Hadoop driver and tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "loggingConfiguration": {
+          "$ref": "LoggingConfiguration",
+          "description": "Optional The runtime log configuration for job execution."
+        },
+        "properties": {
+          "description": "Optional A mapping of property names to values, used to configure Hadoop. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site and classes in user code.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "args": {
+          "description": "Optional The arguments to pass to the driver. Do not include arguments, such as -libjars or -Dfoo=bar, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "fileUris": {
+          "description": "Optional HCFS URIs of files to be copied to the working directory of Hadoop drivers and distributed tasks. Useful for naively parallel tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainClass": {
+          "description": "The name of the driver's main class. The jar file containing the class must be in the default CLASSPATH or specified in jar_file_uris.",
+          "type": "string"
+        },
+        "archiveUris": {
+          "description": "Optional HCFS URIs of archives to be extracted in the working directory of Hadoop drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, or .zip.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainJarFileUri": {
+          "description": "The Hadoop Compatible Filesystem (HCFS) URI of the jar file containing the main class. Examples:  gs://foo-bucket/analytics-binaries/extract-useful-metrics-mr.jar  hdfs:/tmp/test-samples/custom-wordcount.jar  file:///home/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar",
+          "type": "string"
+        }
+      },
+      "id": "HadoopJob"
+    },
+    "YarnApplication": {
+      "description": "A YARN application created by a job. Application information is a subset of \u003ccode\u003eorg.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto\u003c/code\u003e.",
+      "type": "object",
+      "properties": {
+        "state": {
+          "description": "Required The application state.",
+          "type": "string",
+          "enumDescriptions": [
+            "Status is unspecified.",
+            "Status is NEW.",
+            "Status is NEW_SAVING.",
+            "Status is SUBMITTED.",
+            "Status is ACCEPTED.",
+            "Status is RUNNING.",
+            "Status is FINISHED.",
+            "Status is FAILED.",
+            "Status is KILLED."
+          ],
+          "enum": [
+            "STATE_UNSPECIFIED",
+            "NEW",
+            "NEW_SAVING",
+            "SUBMITTED",
+            "ACCEPTED",
+            "RUNNING",
+            "FINISHED",
+            "FAILED",
+            "KILLED"
+          ]
+        },
+        "name": {
+          "description": "Required The application name.",
+          "type": "string"
+        },
+        "trackingUrl": {
+          "description": "Optional The HTTP URL of the ApplicationMaster, HistoryServer, or TimelineServer that provides application-specific information. The URL uses the internal hostname, and requires a proxy server for resolution and, possibly, access.",
+          "type": "string"
+        },
+        "progress": {
+          "description": "Required The numerical progress of the application, from 1 to 100.",
+          "format": "float",
+          "type": "number"
+        }
+      },
+      "id": "YarnApplication"
+    },
+    "QueryList": {
+      "description": "A list of queries to run on a cluster.",
+      "type": "object",
+      "properties": {
+        "queries": {
+          "description": "Required The queries to execute. You do not need to terminate a query with a semicolon. Multiple queries can be specified in one string by separating each with a semicolon. Here is an example of an Cloud Dataproc API snippet that uses a QueryList to specify a HiveJob:\n\"hiveJob\": {\n  \"queryList\": {\n    \"queries\": [\n      \"query1\",\n      \"query2\",\n      \"query3;query4\",\n    ]\n  }\n}\n",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "QueryList"
+    },
+    "ClusterOperationMetadata": {
+      "description": "Metadata describing the operation.",
+      "type": "object",
+      "properties": {
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Output-only Labels associated with the operation",
+          "type": "object"
+        },
+        "status": {
+          "$ref": "ClusterOperationStatus",
+          "description": "Output-only Current operation status."
+        },
+        "statusHistory": {
+          "description": "Output-only The previous operation status.",
+          "type": "array",
+          "items": {
+            "$ref": "ClusterOperationStatus"
+          }
+        },
+        "clusterUuid": {
+          "description": "Output-only Cluster UUID for the operation.",
+          "type": "string"
+        },
+        "clusterName": {
+          "description": "Output-only Name of the cluster for the operation.",
+          "type": "string"
+        },
+        "operationType": {
+          "description": "Output-only The operation type.",
+          "type": "string"
+        },
+        "description": {
+          "description": "Output-only Short description of operation.",
+          "type": "string"
+        },
+        "warnings": {
+          "description": "Output-only Errors encountered during operation execution.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "ClusterOperationMetadata"
+    },
+    "Empty": {
+      "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:\nservice Foo {\n  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n}\nThe JSON representation for Empty is empty JSON object {}.",
+      "type": "object",
+      "properties": {},
+      "id": "Empty"
+    },
+    "HiveJob": {
+      "description": "A Cloud Dataproc job for running Hive queries on YARN.",
+      "type": "object",
+      "properties": {
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to add to the CLASSPATH of the Hive server and Hadoop MapReduce (MR) tasks. Can contain Hive SerDes and UDFs.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "scriptVariables": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional Mapping of query variable names to values (equivalent to the Hive command: 'SET name=\"value\";').",
+          "type": "object"
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional A mapping of property names and values, used to configure Hive. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/hive/conf/hive-site.xml, and classes in user code.",
+          "type": "object"
+        },
+        "continueOnFailure": {
+          "description": "Optional Whether to continue executing queries if a query fails. The default value is false. Setting to true can be useful when executing independent parallel queries.",
+          "type": "boolean"
+        },
+        "queryFileUri": {
+          "description": "The HCFS URI of the script that contains Hive queries.",
+          "type": "string"
+        },
+        "queryList": {
+          "description": "A list of queries.",
+          "$ref": "QueryList"
+        }
+      },
+      "id": "HiveJob"
+    },
+    "ListJobsRequest": {
+      "description": "A request to list jobs in a project.",
+      "type": "object",
+      "properties": {
+        "pageSize": {
+          "description": "Optional The number of results to return in each response.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "filter": {
+          "description": "Optional A filter constraining which jobs to list. Valid filters contain job state and label terms such as: labels.key1 = val1 AND (labels.k2 = val2 OR labels.k3 = val3)",
+          "type": "string"
+        },
+        "jobStateMatcher": {
+          "enumDescriptions": [
+            "Match all jobs, regardless of state.",
+            "Only match jobs in non-terminal states: PENDING, RUNNING, CANCEL_PENDING",
+            "Only match jobs in terminal states: CANCELLED, DONE, ERROR"
+          ],
+          "enum": [
+            "ALL",
+            "ACTIVE",
+            "NON_ACTIVE"
+          ],
+          "description": "Optional Specifies enumerated categories of jobs to list.",
+          "type": "string"
+        },
+        "pageToken": {
+          "description": "Optional The page token, returned by a previous call, to request the next page of results.",
+          "type": "string"
+        },
+        "clusterName": {
+          "description": "Optional If set, the returned jobs list includes only jobs that were submitted to the named cluster.",
+          "type": "string"
+        }
+      },
+      "id": "ListJobsRequest"
+    },
+    "DiagnoseClusterResults": {
+      "description": "The location of diagnostic output.",
+      "type": "object",
+      "properties": {
+        "outputUri": {
+          "description": "Output-only The Google Cloud Storage URI of the diagnostic output. The output report is a plain text file with a summary of collected diagnostics.",
+          "type": "string"
+        }
+      },
+      "id": "DiagnoseClusterResults"
+    },
+    "GceConfiguration": {
+      "description": "Deprecated Common configuration settings for resources of Google Compute Engine cluster instances, applicable to all instances in the cluster.",
+      "type": "object",
+      "properties": {
+        "imageUri": {
+          "description": "Deprecated The Google Compute Engine image resource used for cluster instances. Example: \"compute.googleapis.com/projects/debian-cloud /global/images/backports-debian-7-wheezy-v20140904\".",
+          "type": "string"
+        },
+        "machineTypeUri": {
+          "description": "Deprecated The Google Compute Engine machine type used for cluster instances. Example: \"compute.googleapis.com/projects/project_id /zones/us-east1-a/machineTypes/n1-standard-2\".",
+          "type": "string"
+        },
+        "networkUri": {
+          "description": "Deprecated The Google Compute Engine network to be used for machine communications. Inbound SSH connections are necessary to complete cluster configuration. Example \"compute.googleapis.com/projects/project_id /zones/us-east1-a/default\".",
+          "type": "string"
+        },
+        "serviceAccountScopes": {
+          "description": "Deprecated The service account scopes included in Google Compute Engine instances. Must include devstorage.full_control to enable the Google Cloud Storage connector. Example \"auth.googleapis.com/compute\" and \"auth.googleapis.com/devstorage.full_control\".",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "zoneUri": {
+          "description": "Deprecated The zone where the Google Compute Engine cluster will be located. Example: \"compute.googleapis.com/projects/project_id /zones/us-east1-a\".",
+          "type": "string"
+        }
+      },
+      "id": "GceConfiguration"
+    },
+    "SoftwareConfiguration": {
+      "description": "Specifies the selection and configuration of software inside the cluster.",
+      "type": "object",
+      "properties": {
+        "imageVersion": {
+          "description": "Optional The version of software inside the cluster. It must match the regular expression 0-9+.0-9+. If unspecified it will default to latest version.",
+          "type": "string"
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional The properties to set on daemon configuration files.Property keys are specified in \"prefix:property\" format, such as \"core:fs.defaultFS\". The following are supported prefixes and their mappings:  core - core-site.xml  hdfs - hdfs-site.xml  mapred - mapred-site.xml  yarn - yarn-site.xml  hive - hive-site.xml  pig - pig.properties  spark - spark-defaults.conf",
+          "type": "object"
+        }
+      },
+      "id": "SoftwareConfiguration"
+    },
+    "PySparkJob": {
+      "description": "A Cloud Dataproc job for running PySpark applications on YARN.",
+      "type": "object",
+      "properties": {
+        "archiveUris": {
+          "description": "Optional HCFS URIs of archives to be extracted in the working directory of .jar, .tar, .tar.gz, .tgz, and .zip.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to add to the CLASSPATHs of the Python driver and tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "loggingConfiguration": {
+          "$ref": "LoggingConfiguration",
+          "description": "Optional The runtime log configuration for job execution."
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional A mapping of property names to values, used to configure PySpark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.",
+          "type": "object"
+        },
+        "args": {
+          "description": "Optional The arguments to pass to the driver. Do not include arguments, such as --conf, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "fileUris": {
+          "description": "Optional HCFS URIs of files to be copied to the working directory of Python drivers and distributed tasks. Useful for naively parallel tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "pythonFileUris": {
+          "description": "Optional HCFS file URIs of Python files to pass to the PySpark framework. Supported file types: .py, .egg, and .zip.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainPythonFileUri": {
+          "description": "Required The Hadoop Compatible Filesystem (HCFS) URI of the main Python file to use as the driver. Must be a .py file.",
+          "type": "string"
+        }
+      },
+      "id": "PySparkJob"
+    },
+    "ClusterConfiguration": {
+      "description": "The cluster configuration.",
+      "type": "object",
+      "properties": {
+        "masterDiskConfiguration": {
+          "description": "Deprecated The configuration settings of master node disk options.",
+          "$ref": "DiskConfiguration"
+        },
+        "gceConfiguration": {
+          "description": "Deprecated The Google Compute Engine configuration settings for cluster resources.",
+          "$ref": "GceConfiguration"
+        },
+        "workerDiskConfiguration": {
+          "$ref": "DiskConfiguration",
+          "description": "Deprecated The configuration settings of worker node disk options."
+        },
+        "masterConfiguration": {
+          "description": "Optional The Google Compute Engine configuration settings for the master instance in a cluster.",
+          "$ref": "InstanceGroupConfiguration"
+        },
+        "secondaryWorkerConfiguration": {
+          "$ref": "InstanceGroupConfiguration",
+          "description": "Optional The Google Compute Engine configuration settings for additional worker instances in a cluster."
+        },
+        "masterName": {
+          "description": "Deprecated The Master's hostname. Dataproc derives the name from cluster_name if not set by user (recommended practice is to let Dataproc derive the name). Derived master name example: hadoop-m.",
+          "type": "string"
+        },
+        "workers": {
+          "description": "Deprecated The list of worker node names. Dataproc derives the names from cluster_name and num_workers if not set by user (recommended practice is to let Dataproc derive the name). Derived worker node name example: hadoop-w-0.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "workerConfiguration": {
+          "$ref": "InstanceGroupConfiguration",
+          "description": "Optional The Google Compute Engine configuration settings for worker instances in a cluster."
+        },
+        "initializationActions": {
+          "description": "Optional Commands to execute on each node after configuration is completed. By default, executables are run on master and all worker nodes. You can test a node's \u003ccode\u003erole\u003c/code\u003e metadata to run an executable on a master or worker node, as shown below:\nROLE=$(/usr/share/google/get_metadata_value attributes/role)\nif [[ \"${ROLE}\" == 'Master' ]]; then\n  ... master specific actions ...\nelse\n  ... worker specific actions ...\nfi\n",
+          "type": "array",
+          "items": {
+            "$ref": "NodeInitializationAction"
+          }
+        },
+        "softwareConfiguration": {
+          "description": "Optional The configuration settings for software inside the cluster.",
+          "$ref": "SoftwareConfiguration"
+        },
+        "gceClusterConfiguration": {
+          "$ref": "GceClusterConfiguration",
+          "description": "Optional The shared Google Compute Engine configuration settings for all instances in a cluster."
+        },
+        "configurationBucket": {
+          "description": "Optional A Google Cloud Storage staging bucket used for sharing generated SSH keys and configuration. If you do not specify a staging bucket, Cloud Dataproc will determine an appropriate Cloud Storage location (US, ASIA, or EU) for your cluster's staging bucket according to the Google Compute Engine zone where your cluster is deployed, then it will create and manage this project-level, per-location bucket for you.",
+          "type": "string"
+        },
+        "numWorkers": {
+          "description": "Deprecated The number of worker nodes in the cluster.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "ClusterConfiguration"
+    },
+    "ClusterMetrics": {
+      "description": "Contains cluster daemon metrics, such as HDFS and YARN stats.",
+      "type": "object",
+      "properties": {
+        "yarnMetrics": {
+          "additionalProperties": {
+            "format": "int64",
+            "type": "string"
+          },
+          "description": "The YARN metrics.",
+          "type": "object"
+        },
+        "hdfsMetrics": {
+          "additionalProperties": {
+            "format": "int64",
+            "type": "string"
+          },
+          "description": "The HDFS metrics.",
+          "type": "object"
+        }
+      },
+      "id": "ClusterMetrics"
+    },
+    "LoggingConfiguration": {
+      "description": "The runtime logging configuration of the job.",
+      "type": "object",
+      "properties": {
+        "driverLogLevels": {
+          "additionalProperties": {
+            "type": "string",
+            "enum": [
+              "LEVEL_UNSPECIFIED",
+              "ALL",
+              "TRACE",
+              "DEBUG",
+              "INFO",
+              "WARN",
+              "ERROR",
+              "FATAL",
+              "OFF"
+            ]
+          },
+          "description": "The per-package log levels for the driver. This may include 'root' package name to configure rootLogger. Examples:  com.google = FATAL, root = INFO, org.apache = DEBUG",
+          "type": "object"
+        }
+      },
+      "id": "LoggingConfiguration"
+    }
+  },
+  "icons": {
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
+  },
+  "protocol": "rest",
+  "version": "v1alpha1",
+  "baseUrl": "https://dataproc.googleapis.com/",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
+    }
+  },
+  "servicePath": "",
+  "description": "Manages Hadoop-based clusters and jobs on Google Cloud Platform.",
+  "kind": "discovery#restDescription",
+  "rootUrl": "https://dataproc.googleapis.com/",
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "dataproc",
+  "batchPath": "batch",
+  "revision": "20170207",
+  "id": "dataproc:v1alpha1",
+  "documentationLink": "https://cloud.google.com/dataproc/",
+  "title": "Google Cloud Dataproc API",
+  "ownerName": "Google",
+  "discoveryVersion": "v1"
 }
diff --git a/dataproc/v1alpha1/dataproc-gen.go b/dataproc/v1alpha1/dataproc-gen.go
index 1f26360..69d7cf0 100644
--- a/dataproc/v1alpha1/dataproc-gen.go
+++ b/dataproc/v1alpha1/dataproc-gen.go
@@ -62,9 +62,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Operations *OperationsService
 
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewOperationsService(s *Service) *OperationsService {
 	rs := &OperationsService{s: s}
 	return rs
@@ -144,42 +149,42 @@
 // Cluster: Describes the identifying information, configuration, and
 // status of a cluster of Google Compute Engine instances.
 type Cluster struct {
-	// ClusterName: [Required] The cluster name. Cluster names within a
+	// ClusterName: Required The cluster name. Cluster names within a
 	// project must be unique. Names from deleted clusters can be reused.
 	ClusterName string `json:"clusterName,omitempty"`
 
-	// ClusterUuid: [Output-only] A cluster UUID (Unique Universal
+	// ClusterUuid: Output-only A cluster UUID (Unique Universal
 	// Identifier). Cloud Dataproc generates this value when it creates the
 	// cluster.
 	ClusterUuid string `json:"clusterUuid,omitempty"`
 
-	// Configuration: [Required] The cluster configuration. It may differ
-	// from a user's initial configuration due to Cloud Dataproc setting of
+	// Configuration: Required The cluster configuration. It may differ from
+	// a user's initial configuration due to Cloud Dataproc setting of
 	// default values and updating clusters.
 	Configuration *ClusterConfiguration `json:"configuration,omitempty"`
 
-	// CreateTime: [Output-only] The timestamp of cluster creation.
+	// CreateTime: Output-only The timestamp of cluster creation.
 	CreateTime string `json:"createTime,omitempty"`
 
-	// Labels: [Optional] The labels to associate with this cluster. Label
-	// keys must be between 1 and 63 characters long, and must conform to
-	// the following PCRE regular expression: \p{Ll}\p{Lo}{0,62} Label
-	// values must be between 1 and 63 characters long, and must conform to
-	// the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63} No
-	// more than 64 labels can be associated with a given cluster.
+	// Labels: Optional The labels to associate with this cluster.Label keys
+	// must be between 1 and 63 characters long, and must conform to the
+	// following PCRE regular expression: \p{Ll}\p{Lo}{0,62}Label values
+	// must be between 1 and 63 characters long, and must conform to the
+	// following PCRE regular expression: \p{Ll}\p{Lo}\p{N}_-{0,63}No more
+	// than 64 labels can be associated with a given cluster.
 	Labels map[string]string `json:"labels,omitempty"`
 
 	// Metrics: Contains cluster daemon metrics such as HDFS and YARN stats.
 	Metrics *ClusterMetrics `json:"metrics,omitempty"`
 
-	// ProjectId: [Required] The Google Cloud Platform project ID that the
+	// ProjectId: Required The Google Cloud Platform project ID that the
 	// cluster belongs to.
 	ProjectId string `json:"projectId,omitempty"`
 
-	// Status: [Output-only] Cluster status.
+	// Status: Output-only Cluster status.
 	Status *ClusterStatus `json:"status,omitempty"`
 
-	// StatusHistory: [Output-only] Previous cluster statuses.
+	// StatusHistory: Output-only Previous cluster statuses.
 	StatusHistory []*ClusterStatus `json:"statusHistory,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -211,7 +216,7 @@
 
 // ClusterConfiguration: The cluster configuration.
 type ClusterConfiguration struct {
-	// ConfigurationBucket: [Optional] A Google Cloud Storage staging bucket
+	// ConfigurationBucket: Optional A Google Cloud Storage staging bucket
 	// used for sharing generated SSH keys and configuration. If you do not
 	// specify a staging bucket, Cloud Dataproc will determine an
 	// appropriate Cloud Storage location (US, ASIA, or EU) for your
@@ -220,56 +225,61 @@
 	// project-level, per-location bucket for you.
 	ConfigurationBucket string `json:"configurationBucket,omitempty"`
 
-	// GceClusterConfiguration: [Optional] The shared Google Compute Engine
+	// GceClusterConfiguration: Optional The shared Google Compute Engine
 	// configuration settings for all instances in a cluster.
 	GceClusterConfiguration *GceClusterConfiguration `json:"gceClusterConfiguration,omitempty"`
 
-	// GceConfiguration: [Deprecated] The Google Compute Engine
-	// configuration settings for cluster resources.
+	// GceConfiguration: Deprecated The Google Compute Engine configuration
+	// settings for cluster resources.
 	GceConfiguration *GceConfiguration `json:"gceConfiguration,omitempty"`
 
-	// InitializationActions: [Optional] Commands to execute on each node
+	// InitializationActions: Optional Commands to execute on each node
 	// after configuration is completed. By default, executables are run on
-	// master and all worker nodes. You can test a node's role metadata to
-	// run an executable on a master or worker node, as shown below:
-	// ROLE=$(/usr/share/google/get_metadata_value attributes/role) if [[
-	// "${ROLE}" == 'Master' ]]; then ... master specific actions ... else
-	// ... worker specific actions ... fi
+	// master and all worker nodes. You can test a node's <code>role</code>
+	// metadata to run an executable on a master or worker node, as shown
+	// below:
+	// ROLE=$(/usr/share/google/get_metadata_value attributes/role)
+	// if [[ "${ROLE}" == 'Master' ]]; then
+	//   ... master specific actions ...
+	// else
+	//   ... worker specific actions ...
+	// fi
+	//
 	InitializationActions []*NodeInitializationAction `json:"initializationActions,omitempty"`
 
-	// MasterConfiguration: [Optional] The Google Compute Engine
-	// configuration settings for the master instance in a cluster.
+	// MasterConfiguration: Optional The Google Compute Engine configuration
+	// settings for the master instance in a cluster.
 	MasterConfiguration *InstanceGroupConfiguration `json:"masterConfiguration,omitempty"`
 
-	// MasterDiskConfiguration: [Deprecated] The configuration settings of
+	// MasterDiskConfiguration: Deprecated The configuration settings of
 	// master node disk options.
 	MasterDiskConfiguration *DiskConfiguration `json:"masterDiskConfiguration,omitempty"`
 
-	// MasterName: [Deprecated] The Master's hostname. Dataproc derives the
+	// MasterName: Deprecated The Master's hostname. Dataproc derives the
 	// name from cluster_name if not set by user (recommended practice is to
 	// let Dataproc derive the name). Derived master name example: hadoop-m.
 	MasterName string `json:"masterName,omitempty"`
 
-	// NumWorkers: [Deprecated] The number of worker nodes in the cluster.
+	// NumWorkers: Deprecated The number of worker nodes in the cluster.
 	NumWorkers int64 `json:"numWorkers,omitempty"`
 
-	// SecondaryWorkerConfiguration: [Optional] The Google Compute Engine
+	// SecondaryWorkerConfiguration: Optional The Google Compute Engine
 	// configuration settings for additional worker instances in a cluster.
 	SecondaryWorkerConfiguration *InstanceGroupConfiguration `json:"secondaryWorkerConfiguration,omitempty"`
 
-	// SoftwareConfiguration: [Optional] The configuration settings for
+	// SoftwareConfiguration: Optional The configuration settings for
 	// software inside the cluster.
 	SoftwareConfiguration *SoftwareConfiguration `json:"softwareConfiguration,omitempty"`
 
-	// WorkerConfiguration: [Optional] The Google Compute Engine
-	// configuration settings for worker instances in a cluster.
+	// WorkerConfiguration: Optional The Google Compute Engine configuration
+	// settings for worker instances in a cluster.
 	WorkerConfiguration *InstanceGroupConfiguration `json:"workerConfiguration,omitempty"`
 
-	// WorkerDiskConfiguration: [Deprecated] The configuration settings of
+	// WorkerDiskConfiguration: Deprecated The configuration settings of
 	// worker node disk options.
 	WorkerDiskConfiguration *DiskConfiguration `json:"workerDiskConfiguration,omitempty"`
 
-	// Workers: [Deprecated] The list of worker node names. Dataproc derives
+	// Workers: Deprecated The list of worker node names. Dataproc derives
 	// the names from cluster_name and num_workers if not set by user
 	// (recommended practice is to let Dataproc derive the name). Derived
 	// worker node name example: hadoop-w-0.
@@ -333,27 +343,30 @@
 
 // ClusterOperationMetadata: Metadata describing the operation.
 type ClusterOperationMetadata struct {
-	// ClusterName: [Output-only] Name of the cluster for the operation.
+	// ClusterName: Output-only Name of the cluster for the operation.
 	ClusterName string `json:"clusterName,omitempty"`
 
-	// ClusterUuid: [Output-only] Cluster UUID for the operation.
+	// ClusterUuid: Output-only Cluster UUID for the operation.
 	ClusterUuid string `json:"clusterUuid,omitempty"`
 
-	// Description: [Output-only] Short description of operation.
+	// Description: Output-only Short description of operation.
 	Description string `json:"description,omitempty"`
 
-	// Labels: [Output-only] labels associated with the operation
+	// Labels: Output-only Labels associated with the operation
 	Labels map[string]string `json:"labels,omitempty"`
 
-	// OperationType: [Output-only] The operation type.
+	// OperationType: Output-only The operation type.
 	OperationType string `json:"operationType,omitempty"`
 
-	// Status: [Output-only] Current operation status.
+	// Status: Output-only Current operation status.
 	Status *ClusterOperationStatus `json:"status,omitempty"`
 
-	// StatusHistory: [Output-only] The previous operation status.
+	// StatusHistory: Output-only The previous operation status.
 	StatusHistory []*ClusterOperationStatus `json:"statusHistory,omitempty"`
 
+	// Warnings: Output-only Errors encountered during operation execution.
+	Warnings []string `json:"warnings,omitempty"`
+
 	// ForceSendFields is a list of field names (e.g. "ClusterName") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -379,24 +392,24 @@
 
 // ClusterOperationStatus: The status of the operation.
 type ClusterOperationStatus struct {
-	// Details: [Output-only]A message containing any operation metadata
+	// Details: Output-onlyA message containing any operation metadata
 	// details.
 	Details string `json:"details,omitempty"`
 
-	// InnerState: [Output-only] A message containing the detailed operation
+	// InnerState: Output-only A message containing the detailed operation
 	// state.
 	InnerState string `json:"innerState,omitempty"`
 
-	// State: [Output-only] A message containing the operation state.
+	// State: Output-only A message containing the operation state.
 	//
 	// Possible values:
-	//   "UNKNOWN"
-	//   "PENDING"
-	//   "RUNNING"
-	//   "DONE"
+	//   "UNKNOWN" - Unused.
+	//   "PENDING" - The operation has been created.
+	//   "RUNNING" - The operation is running.
+	//   "DONE" - The operation is done; either cancelled or completed.
 	State string `json:"state,omitempty"`
 
-	// StateStartTime: [Output-only] The time this state was entered.
+	// StateStartTime: Output-only The time this state was entered.
 	StateStartTime string `json:"stateStartTime,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Details") to
@@ -430,12 +443,16 @@
 	// State: The cluster's state.
 	//
 	// Possible values:
-	//   "UNKNOWN"
-	//   "CREATING"
-	//   "RUNNING"
-	//   "ERROR"
-	//   "DELETING"
-	//   "UPDATING"
+	//   "UNKNOWN" - The cluster state is unknown.
+	//   "CREATING" - The cluster is being created and set up. It is not
+	// ready for use.
+	//   "RUNNING" - The cluster is currently running and healthy. It is
+	// ready for use.
+	//   "ERROR" - The cluster encountered an error. It is not ready for
+	// use.
+	//   "DELETING" - The cluster is being deleted. It cannot be used.
+	//   "UPDATING" - The cluster is being updated. It continues to accept
+	// and process jobs.
 	State string `json:"state,omitempty"`
 
 	// StateStartTime: Time when this state was entered.
@@ -467,9 +484,9 @@
 // DiagnoseClusterOutputLocation: The location where output from
 // diagnostic command can be found.
 type DiagnoseClusterOutputLocation struct {
-	// OutputUri: [Output-only] The Google Cloud Storage URI of the
-	// diagnostic output. This will be a plain text file with summary of
-	// collected diagnostics.
+	// OutputUri: Output-only The Google Cloud Storage URI of the diagnostic
+	// output. This will be a plain text file with summary of collected
+	// diagnostics.
 	OutputUri string `json:"outputUri,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "OutputUri") to
@@ -497,9 +514,9 @@
 
 // DiagnoseClusterResults: The location of diagnostic output.
 type DiagnoseClusterResults struct {
-	// OutputUri: [Output-only] The Google Cloud Storage URI of the
-	// diagnostic output. The output report is a plain text file with a
-	// summary of collected diagnostics.
+	// OutputUri: Output-only The Google Cloud Storage URI of the diagnostic
+	// output. The output report is a plain text file with a summary of
+	// collected diagnostics.
 	OutputUri string `json:"outputUri,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "OutputUri") to
@@ -528,15 +545,15 @@
 // DiskConfiguration: Specifies the configuration of disk options for a
 // group of VM instances.
 type DiskConfiguration struct {
-	// BootDiskSizeGb: [Optional] Size in GB of the boot disk (default is
+	// BootDiskSizeGb: Optional Size in GB of the boot disk (default is
 	// 500GB).
 	BootDiskSizeGb int64 `json:"bootDiskSizeGb,omitempty"`
 
-	// NumLocalSsds: [Optional] Number of attached SSDs, from 0 to 4
-	// (default is 0). If SSDs are not attached, the boot disk is used to
-	// store runtime logs, and HDFS data. If one or more SSDs are attached,
-	// this runtime bulk data is spread across them, and the boot disk
-	// contains only basic configuration and installed binaries.
+	// NumLocalSsds: Optional Number of attached SSDs, from 0 to 4 (default
+	// is 0). If SSDs are not attached, the boot disk is used to store
+	// runtime logs, and HDFS data. If one or more SSDs are attached, this
+	// runtime bulk data is spread across them, and the boot disk contains
+	// only basic configuration and installed binaries.
 	NumLocalSsds int64 `json:"numLocalSsds,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "BootDiskSizeGb") to
@@ -566,9 +583,12 @@
 // Empty: A generic empty message that you can re-use to avoid defining
 // duplicated empty messages in your APIs. A typical example is to use
 // it as the request or the response type of an API method. For
-// instance: service Foo { rpc Bar(google.protobuf.Empty) returns
-// (google.protobuf.Empty); } The JSON representation for `Empty` is
-// empty JSON object `{}`.
+// instance:
+// service Foo {
+//   rpc Bar(google.protobuf.Empty) returns
+// (google.protobuf.Empty);
+// }
+// The JSON representation for Empty is empty JSON object {}.
 type Empty struct {
 	// ServerResponse contains the HTTP response code and headers from the
 	// server.
@@ -597,9 +617,19 @@
 	// the project is used, if it exists. Cannot be a "Custom Subnet
 	// Network" (see https://cloud.google.com/compute/docs/subnetworks for
 	// more information). Example:
-	// `compute.googleapis.com/projects/[project_id]/regions/global/default`.
+	// compute.googleapis.com/projects/[project_id]/regions/global/default.
 	NetworkUri string `json:"networkUri,omitempty"`
 
+	// ServiceAccount: Optional The service account of the instances.
+	// Defaults to the default Google Compute Engine service account. Custom
+	// service accounts need permissions equivalent to the folloing IAM
+	// roles:
+	// roles/logging.logWriter
+	// roles/storage.objectAdmin(see
+	// https://cloud.google.com/compute/docs/access/service-accounts#custom_service_accounts for more information). Example:
+	// [account_id]@[project_id].iam.gserviceaccount.com
+	ServiceAccount string `json:"serviceAccount,omitempty"`
+
 	// ServiceAccountScopes: The service account scopes included in Google
 	// Compute Engine instances. Must include devstorage.full_control to
 	// enable the Google Cloud Storage connector. Example
@@ -610,15 +640,15 @@
 	// SubnetworkUri: The Google Compute Engine subnetwork to be used for
 	// machine communications. Cannot be specified with network_uri.
 	// Example:
-	// `compute.googleapis.com/projects/[project_id]/regions/us-east1/sub0`.
+	// compute.googleapis.com/projects/[project_id]/regions/us-east1/sub0.
 	SubnetworkUri string `json:"subnetworkUri,omitempty"`
 
 	// Tags: The Google Compute Engine tags to add to all instances.
 	Tags []string `json:"tags,omitempty"`
 
-	// ZoneUri: [Required] The zone where the Google Compute Engine cluster
-	// will be located. Example:
-	// "compute.googleapis.com/projects/[project_id] /zones/us-east1-a".
+	// ZoneUri: Required The zone where the Google Compute Engine cluster
+	// will be located. Example: "compute.googleapis.com/projects/project_id
+	// /zones/us-east1-a".
 	ZoneUri string `json:"zoneUri,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "InternalIpOnly") to
@@ -645,39 +675,39 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// GceConfiguration: [Deprecated] Common configuration settings for
+// GceConfiguration: Deprecated Common configuration settings for
 // resources of Google Compute Engine cluster instances, applicable to
 // all instances in the cluster.
 type GceConfiguration struct {
-	// ImageUri: [Deprecated] The Google Compute Engine image resource used
+	// ImageUri: Deprecated The Google Compute Engine image resource used
 	// for cluster instances. Example:
 	// "compute.googleapis.com/projects/debian-cloud
 	// /global/images/backports-debian-7-wheezy-v20140904".
 	ImageUri string `json:"imageUri,omitempty"`
 
-	// MachineTypeUri: [Deprecated] The Google Compute Engine machine type
+	// MachineTypeUri: Deprecated The Google Compute Engine machine type
 	// used for cluster instances. Example:
-	// "compute.googleapis.com/projects/[project_id]
+	// "compute.googleapis.com/projects/project_id
 	// /zones/us-east1-a/machineTypes/n1-standard-2".
 	MachineTypeUri string `json:"machineTypeUri,omitempty"`
 
-	// NetworkUri: [Deprecated] The Google Compute Engine network to be used
+	// NetworkUri: Deprecated The Google Compute Engine network to be used
 	// for machine communications. Inbound SSH connections are necessary to
 	// complete cluster configuration. Example
-	// "compute.googleapis.com/projects/[project_id]
+	// "compute.googleapis.com/projects/project_id
 	// /zones/us-east1-a/default".
 	NetworkUri string `json:"networkUri,omitempty"`
 
-	// ServiceAccountScopes: [Deprecated] The service account scopes
-	// included in Google Compute Engine instances. Must include
+	// ServiceAccountScopes: Deprecated The service account scopes included
+	// in Google Compute Engine instances. Must include
 	// devstorage.full_control to enable the Google Cloud Storage connector.
 	// Example "auth.googleapis.com/compute" and
 	// "auth.googleapis.com/devstorage.full_control".
 	ServiceAccountScopes []string `json:"serviceAccountScopes,omitempty"`
 
-	// ZoneUri: [Deprecated] The zone where the Google Compute Engine
-	// cluster will be located. Example:
-	// "compute.googleapis.com/projects/[project_id] /zones/us-east1-a".
+	// ZoneUri: Deprecated The zone where the Google Compute Engine cluster
+	// will be located. Example: "compute.googleapis.com/projects/project_id
+	// /zones/us-east1-a".
 	ZoneUri string `json:"zoneUri,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ImageUri") to
@@ -706,28 +736,28 @@
 // HadoopJob: A Cloud Dataproc job for running Hadoop MapReduce jobs on
 // YARN.
 type HadoopJob struct {
-	// ArchiveUris: [Optional] HCFS URIs of archives to be extracted in the
+	// ArchiveUris: Optional HCFS URIs of archives to be extracted in the
 	// working directory of Hadoop drivers and tasks. Supported file types:
 	// .jar, .tar, .tar.gz, .tgz, or .zip.
 	ArchiveUris []string `json:"archiveUris,omitempty"`
 
-	// Args: [Optional] The arguments to pass to the driver. Do not include
+	// Args: Optional The arguments to pass to the driver. Do not include
 	// arguments, such as -libjars or -Dfoo=bar, that can be set as job
 	// properties, since a collision may occur that causes an incorrect job
 	// submission.
 	Args []string `json:"args,omitempty"`
 
-	// FileUris: [Optional] HCFS URIs of files to be copied to the working
+	// FileUris: Optional HCFS URIs of files to be copied to the working
 	// directory of Hadoop drivers and distributed tasks. Useful for naively
 	// parallel tasks.
 	FileUris []string `json:"fileUris,omitempty"`
 
-	// JarFileUris: [Optional] Jar file URIs to add to the CLASSPATHs of the
+	// JarFileUris: Optional Jar file URIs to add to the CLASSPATHs of the
 	// Hadoop driver and tasks.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfiguration: [Optional] The runtime log configuration for
-	// job execution.
+	// LoggingConfiguration: Optional The runtime log configuration for job
+	// execution.
 	LoggingConfiguration *LoggingConfiguration `json:"loggingConfiguration,omitempty"`
 
 	// MainClass: The name of the driver's main class. The jar file
@@ -742,7 +772,7 @@
 	// file:///home/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar
 	MainJarFileUri string `json:"mainJarFileUri,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure Hadoop. Properties that conflict with values set by the
 	// Cloud Dataproc API may be overwritten. Can include properties set in
 	// /etc/hadoop/conf/*-site and classes in user code.
@@ -773,19 +803,19 @@
 
 // HiveJob: A Cloud Dataproc job for running Hive queries on YARN.
 type HiveJob struct {
-	// ContinueOnFailure: [Optional] Whether to continue executing queries
-	// if a query fails. The default value is false. Setting to true can be
+	// ContinueOnFailure: Optional Whether to continue executing queries if
+	// a query fails. The default value is false. Setting to true can be
 	// useful when executing independent parallel queries.
 	ContinueOnFailure bool `json:"continueOnFailure,omitempty"`
 
-	// JarFileUris: [Optional] HCFS URIs of jar files to add to the
-	// CLASSPATH of the Hive server and Hadoop MapReduce (MR) tasks. Can
-	// contain Hive SerDes and UDFs.
+	// JarFileUris: Optional HCFS URIs of jar files to add to the CLASSPATH
+	// of the Hive server and Hadoop MapReduce (MR) tasks. Can contain Hive
+	// SerDes and UDFs.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// Properties: [Optional] A mapping of property names and values, used
-	// to configure Hive. Properties that conflict with values set by the
-	// Cloud Dataproc API may be overwritten. Can include properties set in
+	// Properties: Optional A mapping of property names and values, used to
+	// configure Hive. Properties that conflict with values set by the Cloud
+	// Dataproc API may be overwritten. Can include properties set in
 	// /etc/hadoop/conf/*-site.xml, /etc/hive/conf/hive-site.xml, and
 	// classes in user code.
 	Properties map[string]string `json:"properties,omitempty"`
@@ -796,7 +826,7 @@
 	// QueryList: A list of queries.
 	QueryList *QueryList `json:"queryList,omitempty"`
 
-	// ScriptVariables: [Optional] Mapping of query variable names to values
+	// ScriptVariables: Optional Mapping of query variable names to values
 	// (equivalent to the Hive command: 'SET name="value";').
 	ScriptVariables map[string]string `json:"scriptVariables,omitempty"`
 
@@ -831,7 +861,7 @@
 	// DiskConfiguration: Disk option configuration settings.
 	DiskConfiguration *DiskConfiguration `json:"diskConfiguration,omitempty"`
 
-	// ImageUri: [Output-only] The Google Compute Engine image resource used
+	// ImageUri: Output-only The Google Compute Engine image resource used
 	// for cluster instances. Inferred from
 	// SoftwareConfiguration.image_version. Example:
 	// "compute.googleapis.com/projects/debian-cloud
@@ -849,11 +879,11 @@
 
 	// MachineTypeUri: The Google Compute Engine machine type used for
 	// cluster instances. Example:
-	// "compute.googleapis.com/projects/[project_id]
+	// "compute.googleapis.com/projects/project_id
 	// /zones/us-east1-a/machineTypes/n1-standard-2".
 	MachineTypeUri string `json:"machineTypeUri,omitempty"`
 
-	// ManagedGroupConfiguration: [Output-only] The configuration for Google
+	// ManagedGroupConfiguration: Output-only The configuration for Google
 	// Compute Engine Instance Group Manager that manages this group. This
 	// is only used for preemptible instance groups.
 	ManagedGroupConfiguration *ManagedGroupConfiguration `json:"managedGroupConfiguration,omitempty"`
@@ -888,24 +918,24 @@
 
 // Job: A Cloud Dataproc job resource.
 type Job struct {
-	// DriverControlFilesUri: [Output-only] If present, the location of
+	// DriverControlFilesUri: Output-only If present, the location of
 	// miscellaneous control files which may be used as part of job setup
 	// and handling. If not present, control files may be placed in the same
 	// location as driver_output_uri.
 	DriverControlFilesUri string `json:"driverControlFilesUri,omitempty"`
 
-	// DriverInputResourceUri: [Output-only] A URI pointing to the location
-	// of the stdin of the job's driver program, only set if the job is
+	// DriverInputResourceUri: Output-only A URI pointing to the location of
+	// the stdin of the job's driver program, only set if the job is
 	// interactive.
 	DriverInputResourceUri string `json:"driverInputResourceUri,omitempty"`
 
-	// DriverOutputResourceUri: [Output-only] A URI pointing to the location
+	// DriverOutputResourceUri: Output-only A URI pointing to the location
 	// of the stdout of the job's driver program.
 	DriverOutputResourceUri string `json:"driverOutputResourceUri,omitempty"`
 
-	// DriverOutputUri: [Output-only] A URI pointing to the location of the
-	// mixed stdout/stderr of the job's driver program—for example,
-	// gs://sysbucket123/foo-cluster/jobid-123/driver/output.
+	// DriverOutputUri: Output-only A URI pointing to the location of the
+	// mixed stdout/stderr of the job's driver program&mdash;for example,
+	// <code>gs://sysbucket123/foo-cluster/jobid-123/driver/output</code>.
 	DriverOutputUri string `json:"driverOutputUri,omitempty"`
 
 	// HadoopJob: Job is a Hadoop job.
@@ -914,55 +944,58 @@
 	// HiveJob: Job is a Hive job.
 	HiveJob *HiveJob `json:"hiveJob,omitempty"`
 
-	// Interactive: [Optional] If set to true, then the driver's stdin will
-	// be kept open and driver_input_uri will be set to provide a path at
-	// which additional input can be sent to the driver.
+	// Interactive: Optional If set to true, then the driver's stdin will be
+	// kept open and driver_input_uri will be set to provide a path at which
+	// additional input can be sent to the driver.
 	Interactive bool `json:"interactive,omitempty"`
 
-	// Labels: [Optional] The labels to associate with this job. Label keys
+	// Labels: Optional The labels to associate with this job.Label keys
 	// must be between 1 and 63 characters long, and must conform to the
-	// following regular expression: \p{Ll}\p{Lo}{0,62} Label values must be
+	// following regular expression: \p{Ll}\p{Lo}{0,62}Label values must be
 	// between 1 and 63 characters long, and must conform to the following
-	// regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63} No more than 64
-	// labels can be associated with a given job.
+	// regular expression: \p{Ll}\p{Lo}\p{N}_-{0,63}No more than 64 labels
+	// can be associated with a given job.
 	Labels map[string]string `json:"labels,omitempty"`
 
 	// PigJob: Job is a Pig job.
 	PigJob *PigJob `json:"pigJob,omitempty"`
 
-	// Placement: [Required] Job information, including how, when, and where
+	// Placement: Required Job information, including how, when, and where
 	// to run the job.
 	Placement *JobPlacement `json:"placement,omitempty"`
 
 	// PysparkJob: Job is a Pyspark job.
 	PysparkJob *PySparkJob `json:"pysparkJob,omitempty"`
 
-	// Reference: [Optional] The fully-qualified reference to the job, which
+	// Reference: Optional The fully-qualified reference to the job, which
 	// can be used to obtain the equivalent REST path of the job resource.
 	// If this property is not specified when a job is created, the server
-	// generates a job_id.
+	// generates a <code>job_id</code>.
 	Reference *JobReference `json:"reference,omitempty"`
 
+	// Scheduling: Optional Job scheduling configuration.
+	Scheduling *JobScheduling `json:"scheduling,omitempty"`
+
 	// SparkJob: Job is a Spark job.
 	SparkJob *SparkJob `json:"sparkJob,omitempty"`
 
 	// SparkSqlJob: Job is a SparkSql job.
 	SparkSqlJob *SparkSqlJob `json:"sparkSqlJob,omitempty"`
 
-	// Status: [Output-only] The job status. Additional application-specific
-	// status information may be contained in the type_job and
-	// yarn_applications fields.
+	// Status: Output-only The job status. Additional application-specific
+	// status information may be contained in the <code>type_job</code> and
+	// <code>yarn_applications</code> fields.
 	Status *JobStatus `json:"status,omitempty"`
 
-	// StatusHistory: [Output-only] The previous job status.
+	// StatusHistory: Output-only The previous job status.
 	StatusHistory []*JobStatus `json:"statusHistory,omitempty"`
 
-	// SubmittedBy: [Output-only] The email address of the user submitting
-	// the job. For jobs submitted on the cluster, the address is
-	// username@hostname.
+	// SubmittedBy: Output-only The email address of the user submitting the
+	// job. For jobs submitted on the cluster, the address is
+	// <code>username@hostname</code>.
 	SubmittedBy string `json:"submittedBy,omitempty"`
 
-	// YarnApplications: [Output-only] The collection of Yarn applications
+	// YarnApplications: Output-only The collection of Yarn applications
 	// spun up by this job.
 	YarnApplications []*YarnApplication `json:"yarnApplications,omitempty"`
 
@@ -997,11 +1030,11 @@
 
 // JobPlacement: Cloud Dataproc job configuration.
 type JobPlacement struct {
-	// ClusterName: [Required] The name of the cluster where the job will be
+	// ClusterName: Required The name of the cluster where the job will be
 	// submitted.
 	ClusterName string `json:"clusterName,omitempty"`
 
-	// ClusterUuid: [Output-only] A cluster UUID generated by the Dataproc
+	// ClusterUuid: Output-only A cluster UUID generated by the Dataproc
 	// service when the job is submitted.
 	ClusterUuid string `json:"clusterUuid,omitempty"`
 
@@ -1030,16 +1063,15 @@
 
 // JobReference: Encapsulates the full scoping used to reference a job.
 type JobReference struct {
-	// JobId: [Required] The job ID, which must be unique within the
-	// project. The job ID is generated by the server upon job submission or
-	// provided by the user as a means to perform retries without creating
-	// duplicate jobs. The ID must contain only letters (a-z, A-Z), numbers
-	// (0-9), underscores (_), or dashes (-). The maximum length is 512
-	// characters.
+	// JobId: Required The job ID, which must be unique within the project.
+	// The job ID is generated by the server upon job submission or provided
+	// by the user as a means to perform retries without creating duplicate
+	// jobs. The ID must contain only letters (a-z, A-Z), numbers (0-9),
+	// underscores (_), or dashes (-). The maximum length is 512 characters.
 	JobId string `json:"jobId,omitempty"`
 
-	// ProjectId: [Required] The ID of the Google Cloud Platform project
-	// that the job belongs to.
+	// ProjectId: Required The ID of the Google Cloud Platform project that
+	// the job belongs to.
 	ProjectId string `json:"projectId,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "JobId") to
@@ -1065,10 +1097,45 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// JobScheduling: Job scheduling options.Beta Feature: These options are
+// available for testing purposes only. They may be changed before final
+// release.
+type JobScheduling struct {
+	// MaxFailuresPerHour: Optional Maximum number of times per hour a
+	// driver may be restarted as a result of driver terminating with
+	// non-zero code before job is reported failed.A job may be reported as
+	// thrashing if driver exits with non-zero code 4 times within 10 minute
+	// window.Maximum value is 10.
+	MaxFailuresPerHour int64 `json:"maxFailuresPerHour,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "MaxFailuresPerHour")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "MaxFailuresPerHour") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *JobScheduling) MarshalJSON() ([]byte, error) {
+	type noMethod JobScheduling
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // JobStatus: Cloud Dataproc job status.
 type JobStatus struct {
-	// Details: [Optional] Job state details, such as an error description
-	// if the state is ERROR.
+	// Details: Optional Job state details, such as an error description if
+	// the state is <code>ERROR</code>.
 	Details string `json:"details,omitempty"`
 
 	// EndTime: The time when the job completed.
@@ -1080,21 +1147,29 @@
 	// StartTime: The time when the server started the job.
 	StartTime string `json:"startTime,omitempty"`
 
-	// State: [Required] A state message specifying the overall job state.
+	// State: Required A state message specifying the overall job state.
 	//
 	// Possible values:
-	//   "STATE_UNSPECIFIED"
-	//   "PENDING"
-	//   "SETUP_DONE"
-	//   "RUNNING"
-	//   "CANCEL_PENDING"
-	//   "CANCEL_STARTED"
-	//   "CANCELLED"
-	//   "DONE"
-	//   "ERROR"
+	//   "STATE_UNSPECIFIED" - The job state is unknown.
+	//   "PENDING" - The job is pending; it has been submitted, but is not
+	// yet running.
+	//   "SETUP_DONE" - Job has been received by the service and completed
+	// initial setup; it will shortly be submitted to the cluster.
+	//   "RUNNING" - The job is running on the cluster.
+	//   "CANCEL_PENDING" - A CancelJob request has been received, but is
+	// pending.
+	//   "CANCEL_STARTED" - Transient in-flight resources have been
+	// canceled, and the request to cancel the running job has been issued
+	// to the cluster.
+	//   "CANCELLED" - The job cancelation was successful.
+	//   "DONE" - The job has completed successfully.
+	//   "ERROR" - The job has completed, but encountered an error.
+	//   "ATTEMPT_FAILURE" - Job attempt has failed. The detail field
+	// contains failure details for this attempt.Applies to restartable jobs
+	// only.
 	State string `json:"state,omitempty"`
 
-	// StateStartTime: [Output-only] The time when this state was entered.
+	// StateStartTime: Output-only The time when this state was entered.
 	StateStartTime string `json:"stateStartTime,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Details") to
@@ -1122,7 +1197,7 @@
 
 // ListClustersResponse: The list of all clusters in a project.
 type ListClustersResponse struct {
-	// Clusters: [Output-only] The clusters in the project.
+	// Clusters: Output-only The clusters in the project.
 	Clusters []*Cluster `json:"clusters,omitempty"`
 
 	// NextPageToken: The standard List next-page token.
@@ -1157,29 +1232,30 @@
 
 // ListJobsRequest: A request to list jobs in a project.
 type ListJobsRequest struct {
-	// ClusterName: [Optional] If set, the returned jobs list includes only
+	// ClusterName: Optional If set, the returned jobs list includes only
 	// jobs that were submitted to the named cluster.
 	ClusterName string `json:"clusterName,omitempty"`
 
-	// Filter: [Optional] A filter constraining which jobs to list. Valid
+	// Filter: Optional A filter constraining which jobs to list. Valid
 	// filters contain job state and label terms such as: labels.key1 = val1
 	// AND (labels.k2 = val2 OR labels.k3 = val3)
 	Filter string `json:"filter,omitempty"`
 
-	// JobStateMatcher: [Optional] Specifies enumerated categories of jobs
-	// to list.
+	// JobStateMatcher: Optional Specifies enumerated categories of jobs to
+	// list.
 	//
 	// Possible values:
-	//   "ALL"
-	//   "ACTIVE"
-	//   "NON_ACTIVE"
+	//   "ALL" - Match all jobs, regardless of state.
+	//   "ACTIVE" - Only match jobs in non-terminal states: PENDING,
+	// RUNNING, CANCEL_PENDING
+	//   "NON_ACTIVE" - Only match jobs in terminal states: CANCELLED, DONE,
+	// ERROR
 	JobStateMatcher string `json:"jobStateMatcher,omitempty"`
 
-	// PageSize: [Optional] The number of results to return in each
-	// response.
+	// PageSize: Optional The number of results to return in each response.
 	PageSize int64 `json:"pageSize,omitempty"`
 
-	// PageToken: [Optional] The page token, returned by a previous call, to
+	// PageToken: Optional The page token, returned by a previous call, to
 	// request the next page of results.
 	PageToken string `json:"pageToken,omitempty"`
 
@@ -1208,14 +1284,19 @@
 
 // ListJobsResponse: A response to a request to list jobs in a project.
 type ListJobsResponse struct {
-	// Jobs: [Output-only] Jobs list.
+	// Jobs: Output-only Jobs list.
 	Jobs []*Job `json:"jobs,omitempty"`
 
-	// NextPageToken: [Optional] This token is included in the response if
+	// NextPageToken: Optional This token is included in the response if
 	// there are more results to fetch. To fetch additional results, provide
-	// this value as the page_token in a subsequent ListJobsRequest.
+	// this value as the page_token in a subsequent
+	// <code>ListJobsRequest</code>.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
 	// ForceSendFields is a list of field names (e.g. "Jobs") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -1310,12 +1391,12 @@
 // ManagedGroupConfiguration: Specifies the resources used to actively
 // manage an instance group.
 type ManagedGroupConfiguration struct {
-	// InstanceGroupManagerName: [Output-only] The name of Instance Group
+	// InstanceGroupManagerName: Output-only The name of Instance Group
 	// Manager managing this group.
 	InstanceGroupManagerName string `json:"instanceGroupManagerName,omitempty"`
 
-	// InstanceTemplateName: [Output-only] The name of Instance Template
-	// used for Managed Instance Group.
+	// InstanceTemplateName: Output-only The name of Instance Template used
+	// for Managed Instance Group.
 	InstanceTemplateName string `json:"instanceTemplateName,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g.
@@ -1346,15 +1427,14 @@
 // NodeInitializationAction: Specifies an executable to run on a fully
 // configured node and a timeout period for executable completion.
 type NodeInitializationAction struct {
-	// ExecutableFile: [Required] Google Cloud Storage URI of executable
-	// file.
+	// ExecutableFile: Required Google Cloud Storage URI of executable file.
 	ExecutableFile string `json:"executableFile,omitempty"`
 
-	// ExecutionTimeout: [Optional] Amount of time executable has to
-	// complete. Default is 10 minutes. Cluster creation fails with an
-	// explanatory error message (the name of the executable that caused the
-	// error and the exceeded timeout period) if the executable is not
-	// completed at end of the timeout period.
+	// ExecutionTimeout: Optional Amount of time executable has to complete.
+	// Default is 10 minutes. Cluster creation fails with an explanatory
+	// error message (the name of the executable that caused the error and
+	// the exceeded timeout period) if the executable is not completed at
+	// end of the timeout period.
 	ExecutionTimeout string `json:"executionTimeout,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ExecutableFile") to
@@ -1387,7 +1467,7 @@
 // a cluster, and deleting a cluster.
 type Operation struct {
 	// Done: Indicates if the operation is done. If true, the operation is
-	// complete and the `result` is available. If false, the operation is
+	// complete and the result is available. If false, the operation is
 	// still in progress.
 	Done bool `json:"done,omitempty"`
 
@@ -1398,15 +1478,15 @@
 	Metadata googleapi.RawMessage `json:"metadata,omitempty"`
 
 	// Name: The name of the operation resource, in the format
-	// projects/[project_id]/operations/[operation_id]
+	// projects/project_id/operations/operation_id
 	Name string `json:"name,omitempty"`
 
 	// Response: The operation response. If the called method returns no
-	// data on success, the response is `google.protobuf.Empty`. If the
-	// called method is `Get`,`Create` or `Update`, the response is the
-	// resource. For all other methods, the response type is a concatenation
-	// of the method name and "Response". For example, if the called method
-	// is `TakeSnapshot()`, the response type is `TakeSnapshotResponse`.
+	// data on success, the response is google.protobuf.Empty. If the called
+	// method is Get,Create or Update, the response is the resource. For all
+	// other methods, the response type is a concatenation of the method
+	// name and "Response". For example, if the called method is
+	// TakeSnapshot(), the response type is TakeSnapshotResponse.
 	Response googleapi.RawMessage `json:"response,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -1444,7 +1524,7 @@
 	// ClusterUuid: Cluster UUId for the operation.
 	ClusterUuid string `json:"clusterUuid,omitempty"`
 
-	// Description: [Output-only] Short description of operation.
+	// Description: Output-only Short description of operation.
 	Description string `json:"description,omitempty"`
 
 	// Details: A message containing any operation metadata details.
@@ -1459,7 +1539,7 @@
 	// InsertTime: The time that the operation was requested.
 	InsertTime string `json:"insertTime,omitempty"`
 
-	// OperationType: [Output-only] The operation type.
+	// OperationType: Output-only The operation type.
 	OperationType string `json:"operationType,omitempty"`
 
 	// StartTime: The time that the operation was started by the server.
@@ -1468,18 +1548,21 @@
 	// State: A message containing the operation state.
 	//
 	// Possible values:
-	//   "UNKNOWN"
-	//   "PENDING"
-	//   "RUNNING"
-	//   "DONE"
+	//   "UNKNOWN" - Unused.
+	//   "PENDING" - The operation has been created.
+	//   "RUNNING" - The operation is currently running.
+	//   "DONE" - The operation is done, either cancelled or completed.
 	State string `json:"state,omitempty"`
 
-	// Status: [Output-only] Current operation status.
+	// Status: Output-only Current operation status.
 	Status *OperationStatus `json:"status,omitempty"`
 
-	// StatusHistory: [Output-only] Previous operation status.
+	// StatusHistory: Output-only Previous operation status.
 	StatusHistory []*OperationStatus `json:"statusHistory,omitempty"`
 
+	// Warnings: Output-only Errors encountered during operation execution.
+	Warnings []string `json:"warnings,omitempty"`
+
 	// ForceSendFields is a list of field names (e.g. "ClusterName") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -1514,10 +1597,10 @@
 	// State: A message containing the operation state.
 	//
 	// Possible values:
-	//   "UNKNOWN"
-	//   "PENDING"
-	//   "RUNNING"
-	//   "DONE"
+	//   "UNKNOWN" - Unused.
+	//   "PENDING" - The operation has been created.
+	//   "RUNNING" - The operation is running.
+	//   "DONE" - The operation is done; either cancelled or completed.
 	State string `json:"state,omitempty"`
 
 	// StateStartTime: The time this state was entered.
@@ -1548,21 +1631,21 @@
 
 // PigJob: A Cloud Dataproc job for running Pig queries on YARN.
 type PigJob struct {
-	// ContinueOnFailure: [Optional] Whether to continue executing queries
-	// if a query fails. The default value is false. Setting to true can be
+	// ContinueOnFailure: Optional Whether to continue executing queries if
+	// a query fails. The default value is false. Setting to true can be
 	// useful when executing independent parallel queries.
 	ContinueOnFailure bool `json:"continueOnFailure,omitempty"`
 
-	// JarFileUris: [Optional] HCFS URIs of jar files to add to the
-	// CLASSPATH of the Pig Client and Hadoop MapReduce (MR) tasks. Can
-	// contain Pig UDFs.
+	// JarFileUris: Optional HCFS URIs of jar files to add to the CLASSPATH
+	// of the Pig Client and Hadoop MapReduce (MR) tasks. Can contain Pig
+	// UDFs.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfiguration: [Optional] The runtime log configuration for
-	// job execution.
+	// LoggingConfiguration: Optional The runtime log configuration for job
+	// execution.
 	LoggingConfiguration *LoggingConfiguration `json:"loggingConfiguration,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure Pig. Properties that conflict with values set by the Cloud
 	// Dataproc API may be overwritten. Can include properties set in
 	// /etc/hadoop/conf/*-site.xml, /etc/pig/conf/pig.properties, and
@@ -1576,8 +1659,8 @@
 	// QueryList: A list of queries.
 	QueryList *QueryList `json:"queryList,omitempty"`
 
-	// ScriptVariables: [Optional] Mapping of query variable names to values
-	// (equivalent to the Pig command: "name=[value]").
+	// ScriptVariables: Optional Mapping of query variable names to values
+	// (equivalent to the Pig command: "name=value").
 	ScriptVariables map[string]string `json:"scriptVariables,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ContinueOnFailure")
@@ -1607,39 +1690,39 @@
 // PySparkJob: A Cloud Dataproc job for running PySpark applications on
 // YARN.
 type PySparkJob struct {
-	// ArchiveUris: [Optional] HCFS URIs of archives to be extracted in the
+	// ArchiveUris: Optional HCFS URIs of archives to be extracted in the
 	// working directory of .jar, .tar, .tar.gz, .tgz, and .zip.
 	ArchiveUris []string `json:"archiveUris,omitempty"`
 
-	// Args: [Optional] The arguments to pass to the driver. Do not include
+	// Args: Optional The arguments to pass to the driver. Do not include
 	// arguments, such as --conf, that can be set as job properties, since a
 	// collision may occur that causes an incorrect job submission.
 	Args []string `json:"args,omitempty"`
 
-	// FileUris: [Optional] HCFS URIs of files to be copied to the working
+	// FileUris: Optional HCFS URIs of files to be copied to the working
 	// directory of Python drivers and distributed tasks. Useful for naively
 	// parallel tasks.
 	FileUris []string `json:"fileUris,omitempty"`
 
-	// JarFileUris: [Optional] HCFS URIs of jar files to add to the
-	// CLASSPATHs of the Python driver and tasks.
+	// JarFileUris: Optional HCFS URIs of jar files to add to the CLASSPATHs
+	// of the Python driver and tasks.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfiguration: [Optional] The runtime log configuration for
-	// job execution.
+	// LoggingConfiguration: Optional The runtime log configuration for job
+	// execution.
 	LoggingConfiguration *LoggingConfiguration `json:"loggingConfiguration,omitempty"`
 
-	// MainPythonFileUri: [Required] The Hadoop Compatible Filesystem (HCFS)
+	// MainPythonFileUri: Required The Hadoop Compatible Filesystem (HCFS)
 	// URI of the main Python file to use as the driver. Must be a .py file.
 	MainPythonFileUri string `json:"mainPythonFileUri,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure PySpark. Properties that conflict with values set by the
 	// Cloud Dataproc API may be overwritten. Can include properties set in
 	// /etc/spark/conf/spark-defaults.conf and classes in user code.
 	Properties map[string]string `json:"properties,omitempty"`
 
-	// PythonFileUris: [Optional] HCFS file URIs of Python files to pass to
+	// PythonFileUris: Optional HCFS file URIs of Python files to pass to
 	// the PySpark framework. Supported file types: .py, .egg, and .zip.
 	PythonFileUris []string `json:"pythonFileUris,omitempty"`
 
@@ -1668,12 +1751,21 @@
 
 // QueryList: A list of queries to run on a cluster.
 type QueryList struct {
-	// Queries: [Required] The queries to execute. You do not need to
+	// Queries: Required The queries to execute. You do not need to
 	// terminate a query with a semicolon. Multiple queries can be specified
 	// in one string by separating each with a semicolon. Here is an example
 	// of an Cloud Dataproc API snippet that uses a QueryList to specify a
-	// HiveJob: "hiveJob": { "queryList": { "queries": [ "query1", "query2",
-	// "query3;query4", ] } }
+	// HiveJob:
+	// "hiveJob": {
+	//   "queryList": {
+	//     "queries": [
+	//       "query1",
+	//       "query2",
+	//       "query3;query4",
+	//     ]
+	//   }
+	// }
+	//
 	Queries []string `json:"queries,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Queries") to
@@ -1702,17 +1794,17 @@
 // SoftwareConfiguration: Specifies the selection and configuration of
 // software inside the cluster.
 type SoftwareConfiguration struct {
-	// ImageVersion: [Optional] The version of software inside the cluster.
-	// It must match the regular expression [0-9]+\.[0-9]+. If unspecified
-	// it will default to latest version.
+	// ImageVersion: Optional The version of software inside the cluster. It
+	// must match the regular expression 0-9+.0-9+. If unspecified it will
+	// default to latest version.
 	ImageVersion string `json:"imageVersion,omitempty"`
 
-	// Properties: [Optional] The properties to set on daemon configuration
-	// files. Property keys are specified in "prefix:property" format, such
+	// Properties: Optional The properties to set on daemon configuration
+	// files.Property keys are specified in "prefix:property" format, such
 	// as "core:fs.defaultFS". The following are supported prefixes and
-	// their mappings: core - core-site.xml hdfs - hdfs-site.xml mapred -
-	// mapred-site.xml yarn - yarn-site.xml hive - hive-site.xml pig -
-	// pig.properties spark - spark-defaults.conf
+	// their mappings:  core - core-site.xml  hdfs - hdfs-site.xml  mapred -
+	// mapred-site.xml  yarn - yarn-site.xml  hive - hive-site.xml  pig -
+	// pig.properties  spark - spark-defaults.conf
 	Properties map[string]string `json:"properties,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ImageVersion") to
@@ -1741,27 +1833,27 @@
 // SparkJob: A Cloud Dataproc job for running Spark applications on
 // YARN.
 type SparkJob struct {
-	// ArchiveUris: [Optional] HCFS URIs of archives to be extracted in the
+	// ArchiveUris: Optional HCFS URIs of archives to be extracted in the
 	// working directory of Spark drivers and tasks. Supported file types:
 	// .jar, .tar, .tar.gz, .tgz, and .zip.
 	ArchiveUris []string `json:"archiveUris,omitempty"`
 
-	// Args: [Optional] The arguments to pass to the driver. Do not include
+	// Args: Optional The arguments to pass to the driver. Do not include
 	// arguments, such as --conf, that can be set as job properties, since a
 	// collision may occur that causes an incorrect job submission.
 	Args []string `json:"args,omitempty"`
 
-	// FileUris: [Optional] HCFS URIs of files to be copied to the working
+	// FileUris: Optional HCFS URIs of files to be copied to the working
 	// directory of Spark drivers and distributed tasks. Useful for naively
 	// parallel tasks.
 	FileUris []string `json:"fileUris,omitempty"`
 
-	// JarFileUris: [Optional] HCFS URIs of jar files to add to the
-	// CLASSPATHs of the Spark driver and tasks.
+	// JarFileUris: Optional HCFS URIs of jar files to add to the CLASSPATHs
+	// of the Spark driver and tasks.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfiguration: [Optional] The runtime log configuration for
-	// job execution.
+	// LoggingConfiguration: Optional The runtime log configuration for job
+	// execution.
 	LoggingConfiguration *LoggingConfiguration `json:"loggingConfiguration,omitempty"`
 
 	// MainClass: The name of the driver's main class. The jar file that
@@ -1773,7 +1865,7 @@
 	// jar file that contains the main class.
 	MainJarFileUri string `json:"mainJarFileUri,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure Spark. Properties that conflict with values set by the
 	// Cloud Dataproc API may be overwritten. Can include properties set in
 	// /etc/spark/conf/spark-defaults.conf and classes in user code.
@@ -1804,15 +1896,15 @@
 
 // SparkSqlJob: A Cloud Dataproc job for running Spark SQL queries.
 type SparkSqlJob struct {
-	// JarFileUris: [Optional] HCFS URIs of jar files to be added to the
-	// Spark CLASSPATH.
+	// JarFileUris: Optional HCFS URIs of jar files to be added to the Spark
+	// CLASSPATH.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfiguration: [Optional] The runtime log configuration for
-	// job execution.
+	// LoggingConfiguration: Optional The runtime log configuration for job
+	// execution.
 	LoggingConfiguration *LoggingConfiguration `json:"loggingConfiguration,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure Spark SQL's SparkConf. Properties that conflict with values
 	// set by the Cloud Dataproc API may be overwritten.
 	Properties map[string]string `json:"properties,omitempty"`
@@ -1823,7 +1915,7 @@
 	// QueryList: A list of queries.
 	QueryList *QueryList `json:"queryList,omitempty"`
 
-	// ScriptVariables: [Optional] Mapping of query variable names to values
+	// ScriptVariables: Optional Mapping of query variable names to values
 	// (equivalent to the Spark SQL command: SET name="value";).
 	ScriptVariables map[string]string `json:"scriptVariables,omitempty"`
 
@@ -1850,42 +1942,45 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// Status: The `Status` type defines a logical error model that is
+// Status: The Status type defines a logical error model that is
 // suitable for different programming environments, including REST APIs
-// and RPC APIs. It is used by [gRPC](https://github.com/grpc). The
-// error model is designed to be: - Simple to use and understand for
-// most users - Flexible enough to meet unexpected needs # Overview The
-// `Status` message contains three pieces of data: error code, error
-// message, and error details. The error code should be an enum value of
-// google.rpc.Code, but it may accept additional error codes if needed.
-// The error message should be a developer-facing English message that
-// helps developers *understand* and *resolve* the error. If a localized
-// user-facing error message is needed, put the localized message in the
-// error details or localize it in the client. The optional error
-// details may contain arbitrary information about the error. There is a
-// predefined set of error detail types in the package `google.rpc`
-// which can be used for common error conditions. # Language mapping The
-// `Status` message is the logical representation of the error model,
-// but it is not necessarily the actual wire format. When the `Status`
-// message is exposed in different client libraries and different wire
-// protocols, it can be mapped differently. For example, it will likely
-// be mapped to some exceptions in Java, but more likely mapped to some
-// error codes in C. # Other uses The error model and the `Status`
-// message can be used in a variety of environments, either with or
-// without APIs, to provide a consistent developer experience across
-// different environments. Example uses of this error model include: -
+// and RPC APIs. It is used by gRPC (https://github.com/grpc). The error
+// model is designed to be:
+// Simple to use and understand for most users
+// Flexible enough to meet unexpected needsOverviewThe Status message
+// contains three pieces of data: error code, error message, and error
+// details. The error code should be an enum value of google.rpc.Code,
+// but it may accept additional error codes if needed. The error message
+// should be a developer-facing English message that helps developers
+// understand and resolve the error. If a localized user-facing error
+// message is needed, put the localized message in the error details or
+// localize it in the client. The optional error details may contain
+// arbitrary information about the error. There is a predefined set of
+// error detail types in the package google.rpc which can be used for
+// common error conditions.Language mappingThe Status message is the
+// logical representation of the error model, but it is not necessarily
+// the actual wire format. When the Status message is exposed in
+// different client libraries and different wire protocols, it can be
+// mapped differently. For example, it will likely be mapped to some
+// exceptions in Java, but more likely mapped to some error codes in
+// C.Other usesThe error model and the Status message can be used in a
+// variety of environments, either with or without APIs, to provide a
+// consistent developer experience across different environments.Example
+// uses of this error model include:
 // Partial errors. If a service needs to return partial errors to the
-// client, it may embed the `Status` in the normal response to indicate
-// the partial errors. - Workflow errors. A typical workflow has
-// multiple steps. Each step may have a `Status` message for error
-// reporting purpose. - Batch operations. If a client uses batch request
-// and batch response, the `Status` message should be used directly
-// inside batch response, one for each error sub-response. -
+// client, it may embed the Status in the normal response to indicate
+// the partial errors.
+// Workflow errors. A typical workflow has multiple steps. Each step may
+// have a Status message for error reporting purpose.
+// Batch operations. If a client uses batch request and batch response,
+// the Status message should be used directly inside batch response, one
+// for each error sub-response.
 // Asynchronous operations. If an API call embeds asynchronous operation
 // results in its response, the status of those operations should be
-// represented directly using the `Status` message. - Logging. If some
-// API errors are stored in logs, the message `Status` could be used
-// directly after any stripping needed for security/privacy reasons.
+// represented directly using the Status message.
+// Logging. If some API errors are stored in logs, the message Status
+// could be used directly after any stripping needed for
+// security/privacy reasons.
 type Status struct {
 	// Code: The status code, which should be an enum value of
 	// google.rpc.Code.
@@ -1925,7 +2020,7 @@
 
 // SubmitJobRequest: A job submission request.
 type SubmitJobRequest struct {
-	// Job: [Required] The job resource.
+	// Job: Required The job resource.
 	Job *Job `json:"job,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Job") to
@@ -1953,30 +2048,31 @@
 
 // YarnApplication: A YARN application created by a job. Application
 // information is a subset of
-// org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto.
+// <code>org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto</
+// code>.
 type YarnApplication struct {
-	// Name: [Required] The application name.
+	// Name: Required The application name.
 	Name string `json:"name,omitempty"`
 
-	// Progress: [Required] The numerical progress of the application, from
-	// 1 to 100.
+	// Progress: Required The numerical progress of the application, from 1
+	// to 100.
 	Progress float64 `json:"progress,omitempty"`
 
-	// State: [Required] The application state.
+	// State: Required The application state.
 	//
 	// Possible values:
-	//   "STATE_UNSPECIFIED"
-	//   "NEW"
-	//   "NEW_SAVING"
-	//   "SUBMITTED"
-	//   "ACCEPTED"
-	//   "RUNNING"
-	//   "FINISHED"
-	//   "FAILED"
-	//   "KILLED"
+	//   "STATE_UNSPECIFIED" - Status is unspecified.
+	//   "NEW" - Status is NEW.
+	//   "NEW_SAVING" - Status is NEW_SAVING.
+	//   "SUBMITTED" - Status is SUBMITTED.
+	//   "ACCEPTED" - Status is ACCEPTED.
+	//   "RUNNING" - Status is RUNNING.
+	//   "FINISHED" - Status is FINISHED.
+	//   "FAILED" - Status is FAILED.
+	//   "KILLED" - Status is KILLED.
 	State string `json:"state,omitempty"`
 
-	// TrackingUrl: [Optional] The HTTP URL of the ApplicationMaster,
+	// TrackingUrl: Optional The HTTP URL of the ApplicationMaster,
 	// HistoryServer, or TimelineServer that provides application-specific
 	// information. The URL uses the internal hostname, and requires a proxy
 	// server for resolution and, possibly, access.
@@ -2033,8 +2129,8 @@
 // Cancel: Starts asynchronous cancellation on a long-running operation.
 // The server makes a best effort to cancel the operation, but success
 // is not guaranteed. If the server doesn't support this method, it
-// returns `google.rpc.Code.UNIMPLEMENTED`. Clients may use
-// [Operations.GetOperation] or other methods to check whether the
+// returns google.rpc.Code.UNIMPLEMENTED. Clients may use
+// Operations.GetOperation or other methods to check whether the
 // cancellation succeeded or the operation completed despite
 // cancellation.
 func (r *OperationsService) Cancel(name string, canceloperationrequest *CancelOperationRequest) *OperationsCancelCall {
@@ -2075,6 +2171,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.canceloperationrequest)
 	if err != nil {
@@ -2130,7 +2227,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`. Clients may use [Operations.GetOperation] or other methods to check whether the cancellation succeeded or the operation completed despite cancellation.",
+	//   "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns google.rpc.Code.UNIMPLEMENTED. Clients may use Operations.GetOperation or other methods to check whether the cancellation succeeded or the operation completed despite cancellation.",
+	//   "flatPath": "v1alpha1/operations/{operationsId}:cancel",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.operations.cancel",
 	//   "parameterOrder": [
@@ -2209,6 +2307,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1alpha1/{+name}")
@@ -2260,6 +2359,7 @@
 	return ret, nil
 	// {
 	//   "description": "Deletes a long-running operation. It indicates the client is no longer interested in the operation result. It does not cancel the operation.",
+	//   "flatPath": "v1alpha1/operations/{operationsId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "dataproc.operations.delete",
 	//   "parameterOrder": [
@@ -2346,6 +2446,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2400,6 +2501,7 @@
 	return ret, nil
 	// {
 	//   "description": "Gets the latest state of a long-running operation. Clients may use this method to poll the operation result at intervals as recommended by the API service.",
+	//   "flatPath": "v1alpha1/operations/{operationsId}",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.operations.get",
 	//   "parameterOrder": [
@@ -2438,21 +2540,21 @@
 
 // List: Lists operations that match the specified filter in the
 // request. If the server doesn't support this method, it returns
-// `google.rpc.Code.UNIMPLEMENTED`.
+// google.rpc.Code.UNIMPLEMENTED.
 func (r *OperationsService) List(name string) *OperationsListCall {
 	c := &OperationsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.name = name
 	return c
 }
 
-// Filter sets the optional parameter "filter": [Required] A JSON object
+// Filter sets the optional parameter "filter": Required A JSON object
 // that contains filters for the list operation, in the format
 // {"key1":"value1","key2":"value2", ..., }. Possible keys include
-// project_id, cluster_name, and operation_state_matcher. If project_id
+// project_id, cluster_name, and operation_state_matcher.If project_id
 // is set, requests the list of operations that belong to the specified
-// Google Cloud Platform project ID. This key is required. If
+// Google Cloud Platform project ID. This key is required.If
 // cluster_name is set, requests the list of operations that were
-// submitted to the specified cluster name. This key is optional. If
+// submitted to the specified cluster name. This key is optional.If
 // operation_state_matcher is set, requests the list of operations that
 // match one of the following status options: ALL, ACTIVE, or
 // NON_ACTIVE.
@@ -2516,6 +2618,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2569,7 +2672,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`.",
+	//   "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns google.rpc.Code.UNIMPLEMENTED.",
+	//   "flatPath": "v1alpha1/operations",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.operations.list",
 	//   "parameterOrder": [
@@ -2577,7 +2681,7 @@
 	//   ],
 	//   "parameters": {
 	//     "filter": {
-	//       "description": "[Required] A JSON object that contains filters for the list operation, in the format {\"key1\":\"value1\",\"key2\":\"value2\", ..., }. Possible keys include project_id, cluster_name, and operation_state_matcher. If project_id is set, requests the list of operations that belong to the specified Google Cloud Platform project ID. This key is required. If cluster_name is set, requests the list of operations that were submitted to the specified cluster name. This key is optional. If operation_state_matcher is set, requests the list of operations that match one of the following status options: ALL, ACTIVE, or NON_ACTIVE.",
+	//       "description": "Required A JSON object that contains filters for the list operation, in the format {\"key1\":\"value1\",\"key2\":\"value2\", ..., }. Possible keys include project_id, cluster_name, and operation_state_matcher.If project_id is set, requests the list of operations that belong to the specified Google Cloud Platform project ID. This key is required.If cluster_name is set, requests the list of operations that were submitted to the specified cluster name. This key is optional.If operation_state_matcher is set, requests the list of operations that match one of the following status options: ALL, ACTIVE, or NON_ACTIVE.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -2684,6 +2788,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cluster)
 	if err != nil {
@@ -2741,6 +2846,7 @@
 	return ret, nil
 	// {
 	//   "description": "Request to create a cluster in a project.",
+	//   "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/clusters",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.projects.regions.clusters.create",
 	//   "parameterOrder": [
@@ -2749,13 +2855,13 @@
 	//   ],
 	//   "parameters": {
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Dataproc region in which to handle the request.",
+	//       "description": "Required The Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -2827,6 +2933,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}")
@@ -2880,6 +2987,7 @@
 	return ret, nil
 	// {
 	//   "description": "Request to delete a cluster in a project.",
+	//   "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
 	//   "httpMethod": "DELETE",
 	//   "id": "dataproc.projects.regions.clusters.delete",
 	//   "parameterOrder": [
@@ -2889,19 +2997,19 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Required] The cluster name.",
+	//       "description": "Required The cluster name.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Dataproc region in which to handle the request.",
+	//       "description": "Required The Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -2982,6 +3090,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3038,6 +3147,7 @@
 	return ret, nil
 	// {
 	//   "description": "Request to get the resource representation for a cluster in a project.",
+	//   "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.regions.clusters.get",
 	//   "parameterOrder": [
@@ -3047,19 +3157,19 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Required] The cluster name.",
+	//       "description": "Required The cluster name.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Dataproc region in which to handle the request.",
+	//       "description": "Required The Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3096,7 +3206,7 @@
 	return c
 }
 
-// Filter sets the optional parameter "filter": [Optional] A filter
+// Filter sets the optional parameter "filter": Optional A filter
 // constraining which clusters to list. Valid filters contain label
 // terms such as: labels.key1 = val1 AND (-labels.k2 = val2 OR labels.k3
 // = val3)
@@ -3160,6 +3270,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3215,6 +3326,7 @@
 	return ret, nil
 	// {
 	//   "description": "Request a list of all regions/{region}/clusters in a project.",
+	//   "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/clusters",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.regions.clusters.list",
 	//   "parameterOrder": [
@@ -3223,7 +3335,7 @@
 	//   ],
 	//   "parameters": {
 	//     "filter": {
-	//       "description": "[Optional] A filter constraining which clusters to list. Valid filters contain label terms such as: labels.key1 = val1 AND (-labels.k2 = val2 OR labels.k3 = val3)",
+	//       "description": "Optional A filter constraining which clusters to list. Valid filters contain label terms such as: labels.key1 = val1 AND (-labels.k2 = val2 OR labels.k3 = val3)",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -3239,13 +3351,13 @@
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Dataproc region in which to handle the request.",
+	//       "description": "Required The Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3306,15 +3418,22 @@
 	return c
 }
 
-// UpdateMask sets the optional parameter "updateMask": [Required]
-// Specifies the path, relative to Cluster, of the field to update. For
-// example, to change the number of workers in a cluster to 5, the
-// update_mask parameter would be specified as
-// "configuration.worker_configuration.num_instances," and the PATCH
-// request body would specify the new value, as follows: {
-// "configuration":{ "workerConfiguration":{ "numInstances":"5" } } }
-// Note: Currently, configuration.worker_configuration.num_instances is
-// the only field that can be updated.
+// UpdateMask sets the optional parameter "updateMask": Required
+// Specifies the path, relative to <code>Cluster</code>, of the field to
+// update. For example, to change the number of workers in a cluster to
+// 5, the <code>update_mask</code> parameter would be specified as
+// <code>"configuration.worker_configuration.num_instances,"</code> and
+// the PATCH request body would specify the new value, as follows:
+// {
+//   "configuration":{
+//     "workerConfiguration":{
+//       "numInstances":"5"
+//     }
+//   }
+// }
+// <strong>Note:</strong> Currently,
+// <code>configuration.worker_configuration.num_instances</code> is the
+// only field that can be updated.
 func (c *ProjectsRegionsClustersPatchCall) UpdateMask(updateMask string) *ProjectsRegionsClustersPatchCall {
 	c.urlParams_.Set("updateMask", updateMask)
 	return c
@@ -3351,6 +3470,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cluster)
 	if err != nil {
@@ -3409,6 +3529,7 @@
 	return ret, nil
 	// {
 	//   "description": "Request to update a cluster in a project.",
+	//   "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/clusters/{clusterName}",
 	//   "httpMethod": "PATCH",
 	//   "id": "dataproc.projects.regions.clusters.patch",
 	//   "parameterOrder": [
@@ -3418,25 +3539,26 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Required] The cluster name.",
+	//       "description": "Required The cluster name.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Dataproc region in which to handle the request.",
+	//       "description": "Required The Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "updateMask": {
-	//       "description": "[Required] Specifies the path, relative to Cluster, of the field to update. For example, to change the number of workers in a cluster to 5, the update_mask parameter would be specified as \"configuration.worker_configuration.num_instances,\" and the PATCH request body would specify the new value, as follows: { \"configuration\":{ \"workerConfiguration\":{ \"numInstances\":\"5\" } } } Note: Currently, configuration.worker_configuration.num_instances is the only field that can be updated.",
+	//       "description": "Required Specifies the path, relative to \u003ccode\u003eCluster\u003c/code\u003e, of the field to update. For example, to change the number of workers in a cluster to 5, the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be specified as \u003ccode\u003e\"configuration.worker_configuration.num_instances,\"\u003c/code\u003e and the PATCH request body would specify the new value, as follows:\n{\n  \"configuration\":{\n    \"workerConfiguration\":{\n      \"numInstances\":\"5\"\n    }\n  }\n}\n\u003cstrong\u003eNote:\u003c/strong\u003e Currently, \u003ccode\u003econfiguration.worker_configuration.num_instances\u003c/code\u003e is the only field that can be updated.",
+	//       "format": "google-fieldmask",
 	//       "location": "query",
 	//       "type": "string"
 	//     }
@@ -3511,6 +3633,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.canceljobrequest)
 	if err != nil {
@@ -3569,6 +3692,7 @@
 	return ret, nil
 	// {
 	//   "description": "Starts a job cancellation request. To access the job resource after cancellation, call regions/{region}/jobs:list or regions/{region}/jobs:get.",
+	//   "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}:cancel",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.projects.regions.jobs.cancel",
 	//   "parameterOrder": [
@@ -3578,19 +3702,19 @@
 	//   ],
 	//   "parameters": {
 	//     "jobId": {
-	//       "description": "[Required] The job ID.",
+	//       "description": "Required The job ID.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Dataproc region in which to handle the request.",
+	//       "description": "Required The Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3623,7 +3747,7 @@
 }
 
 // Delete: Deletes the job from the project. If the job is active, the
-// delete fails, and the response returns `FAILED_PRECONDITION`.
+// delete fails, and the response returns FAILED_PRECONDITION.
 func (r *ProjectsRegionsJobsService) Delete(projectId string, region string, jobId string) *ProjectsRegionsJobsDeleteCall {
 	c := &ProjectsRegionsJobsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.projectId = projectId
@@ -3663,6 +3787,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}")
@@ -3715,7 +3840,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes the job from the project. If the job is active, the delete fails, and the response returns `FAILED_PRECONDITION`.",
+	//   "description": "Deletes the job from the project. If the job is active, the delete fails, and the response returns FAILED_PRECONDITION.",
+	//   "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "dataproc.projects.regions.jobs.delete",
 	//   "parameterOrder": [
@@ -3725,19 +3851,19 @@
 	//   ],
 	//   "parameters": {
 	//     "jobId": {
-	//       "description": "[Required] The job ID.",
+	//       "description": "Required The job ID.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Dataproc region in which to handle the request.",
+	//       "description": "Required The Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3817,6 +3943,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3873,6 +4000,7 @@
 	return ret, nil
 	// {
 	//   "description": "Gets the resource representation for a job in a project.",
+	//   "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.regions.jobs.get",
 	//   "parameterOrder": [
@@ -3882,19 +4010,19 @@
 	//   ],
 	//   "parameters": {
 	//     "jobId": {
-	//       "description": "[Required] The job ID.",
+	//       "description": "Required The job ID.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Dataproc region in which to handle the request.",
+	//       "description": "Required The Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3911,6 +4039,345 @@
 
 }
 
+// method id "dataproc.projects.regions.jobs.list":
+
+type ProjectsRegionsJobsListCall struct {
+	s               *Service
+	projectId       string
+	region          string
+	listjobsrequest *ListJobsRequest
+	urlParams_      gensupport.URLParams
+	ctx_            context.Context
+	header_         http.Header
+}
+
+// List: Lists regions/{region}/jobs in a project.
+func (r *ProjectsRegionsJobsService) List(projectId string, region string, listjobsrequest *ListJobsRequest) *ProjectsRegionsJobsListCall {
+	c := &ProjectsRegionsJobsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.projectId = projectId
+	c.region = region
+	c.listjobsrequest = listjobsrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ProjectsRegionsJobsListCall) Fields(s ...googleapi.Field) *ProjectsRegionsJobsListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ProjectsRegionsJobsListCall) Context(ctx context.Context) *ProjectsRegionsJobsListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ProjectsRegionsJobsListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ProjectsRegionsJobsListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.listjobsrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1alpha1/projects/{projectId}/regions/{region}/jobs:list")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"projectId": c.projectId,
+		"region":    c.region,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "dataproc.projects.regions.jobs.list" call.
+// Exactly one of *ListJobsResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *ListJobsResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *ProjectsRegionsJobsListCall) Do(opts ...googleapi.CallOption) (*ListJobsResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ListJobsResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists regions/{region}/jobs in a project.",
+	//   "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/jobs:list",
+	//   "httpMethod": "POST",
+	//   "id": "dataproc.projects.regions.jobs.list",
+	//   "parameterOrder": [
+	//     "projectId",
+	//     "region"
+	//   ],
+	//   "parameters": {
+	//     "projectId": {
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "Required The Dataproc region in which to handle the request.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1alpha1/projects/{projectId}/regions/{region}/jobs:list",
+	//   "request": {
+	//     "$ref": "ListJobsRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "ListJobsResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform"
+	//   ]
+	// }
+
+}
+
+// Pages invokes f for each page of results.
+// A non-nil error returned from f will halt the iteration.
+// The provided context supersedes any context provided to the Context method.
+func (c *ProjectsRegionsJobsListCall) Pages(ctx context.Context, f func(*ListJobsResponse) error) error {
+	c.ctx_ = ctx
+	defer func(pt string) { c.listjobsrequest.PageToken = pt }(c.listjobsrequest.PageToken) // reset paging to original point
+	for {
+		x, err := c.Do()
+		if err != nil {
+			return err
+		}
+		if err := f(x); err != nil {
+			return err
+		}
+		if x.NextPageToken == "" {
+			return nil
+		}
+		c.listjobsrequest.PageToken = x.NextPageToken
+	}
+}
+
+// method id "dataproc.projects.regions.jobs.patch":
+
+type ProjectsRegionsJobsPatchCall struct {
+	s          *Service
+	projectId  string
+	region     string
+	jobId      string
+	job        *Job
+	urlParams_ gensupport.URLParams
+	ctx_       context.Context
+	header_    http.Header
+}
+
+// Patch: Updates a job in a project.
+func (r *ProjectsRegionsJobsService) Patch(projectId string, region string, jobId string, job *Job) *ProjectsRegionsJobsPatchCall {
+	c := &ProjectsRegionsJobsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.projectId = projectId
+	c.region = region
+	c.jobId = jobId
+	c.job = job
+	return c
+}
+
+// UpdateMask sets the optional parameter "updateMask": Required
+// Specifies the path, relative to <code>Job</code>, of the field to
+// update. For example, to update the labels of a Job the
+// <code>update_mask</code> parameter would be specified as
+// <code>labels</code>, and the PATCH request body would specify the new
+// value. <strong>Note:</strong> Currently, <code>labels</code> is the
+// only field that can be updated.
+func (c *ProjectsRegionsJobsPatchCall) UpdateMask(updateMask string) *ProjectsRegionsJobsPatchCall {
+	c.urlParams_.Set("updateMask", updateMask)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ProjectsRegionsJobsPatchCall) Fields(s ...googleapi.Field) *ProjectsRegionsJobsPatchCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ProjectsRegionsJobsPatchCall) Context(ctx context.Context) *ProjectsRegionsJobsPatchCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ProjectsRegionsJobsPatchCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ProjectsRegionsJobsPatchCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.job)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"projectId": c.projectId,
+		"region":    c.region,
+		"jobId":     c.jobId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "dataproc.projects.regions.jobs.patch" call.
+// Exactly one of *Job or error will be non-nil. Any non-2xx status code
+// is an error. Response headers are in either
+// *Job.ServerResponse.Header or (if a response was returned at all) in
+// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check
+// whether the returned error was because http.StatusNotModified was
+// returned.
+func (c *ProjectsRegionsJobsPatchCall) Do(opts ...googleapi.CallOption) (*Job, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Job{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates a job in a project.",
+	//   "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}",
+	//   "httpMethod": "PATCH",
+	//   "id": "dataproc.projects.regions.jobs.patch",
+	//   "parameterOrder": [
+	//     "projectId",
+	//     "region",
+	//     "jobId"
+	//   ],
+	//   "parameters": {
+	//     "jobId": {
+	//       "description": "Required The job ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "projectId": {
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "region": {
+	//       "description": "Required The Dataproc region in which to handle the request.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "updateMask": {
+	//       "description": "Required Specifies the path, relative to \u003ccode\u003eJob\u003c/code\u003e, of the field to update. For example, to update the labels of a Job the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be specified as \u003ccode\u003elabels\u003c/code\u003e, and the PATCH request body would specify the new value. \u003cstrong\u003eNote:\u003c/strong\u003e Currently, \u003ccode\u003elabels\u003c/code\u003e is the only field that can be updated.",
+	//       "format": "google-fieldmask",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1alpha1/projects/{projectId}/regions/{region}/jobs/{jobId}",
+	//   "request": {
+	//     "$ref": "Job"
+	//   },
+	//   "response": {
+	//     "$ref": "Job"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform"
+	//   ]
+	// }
+
+}
+
 // method id "dataproc.projects.regions.jobs.submit":
 
 type ProjectsRegionsJobsSubmitCall struct {
@@ -3963,6 +4430,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.submitjobrequest)
 	if err != nil {
@@ -4020,6 +4488,7 @@
 	return ret, nil
 	// {
 	//   "description": "Submits a job to a cluster.",
+	//   "flatPath": "v1alpha1/projects/{projectId}/regions/{region}/jobs:submit",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.projects.regions.jobs.submit",
 	//   "parameterOrder": [
@@ -4028,13 +4497,13 @@
 	//   ],
 	//   "parameters": {
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "region": {
-	//       "description": "[Required] The Dataproc region in which to handle the request.",
+	//       "description": "Required The Dataproc region in which to handle the request.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
diff --git a/dataproc/v1beta1/dataproc-api.json b/dataproc/v1beta1/dataproc-api.json
index 907b0ee..2d6d249 100644
--- a/dataproc/v1beta1/dataproc-api.json
+++ b/dataproc/v1beta1/dataproc-api.json
@@ -1,1736 +1,1896 @@
 {
- "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/cZQ-6vqHhMM0YELMHYWsiSzNXAM\"",
- "discoveryVersion": "v1",
- "id": "dataproc:v1beta1",
- "name": "dataproc",
- "version": "v1beta1",
- "revision": "20161102",
- "title": "Google Cloud Dataproc API",
- "description": "An API for managing Hadoop-based clusters and jobs on Google Cloud Platform.",
- "ownerDomain": "google.com",
- "ownerName": "Google",
- "icons": {
-  "x16": "http://www.google.com/images/icons/product/search-16.gif",
-  "x32": "http://www.google.com/images/icons/product/search-32.gif"
- },
- "documentationLink": "https://cloud.google.com/dataproc/",
- "protocol": "rest",
- "baseUrl": "https://dataproc.googleapis.com/",
- "basePath": "",
- "rootUrl": "https://dataproc.googleapis.com/",
- "servicePath": "",
- "batchPath": "batch",
- "parameters": {
-  "access_token": {
-   "type": "string",
-   "description": "OAuth access token.",
-   "location": "query"
-  },
-  "alt": {
-   "type": "string",
-   "description": "Data format for response.",
-   "default": "json",
-   "enumDescriptions": [
-    "Responses with Content-Type of application/json",
-    "Media download with context-dependent Content-Type",
-    "Responses with Content-Type of application/x-protobuf"
-   ],
-   "location": "query"
-  },
-  "bearer_token": {
-   "type": "string",
-   "description": "OAuth bearer token.",
-   "location": "query"
-  },
-  "callback": {
-   "type": "string",
-   "description": "JSONP",
-   "location": "query"
-  },
-  "fields": {
-   "type": "string",
-   "description": "Selector specifying which fields to include in a partial response.",
-   "location": "query"
-  },
-  "key": {
-   "type": "string",
-   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-   "location": "query"
-  },
-  "oauth_token": {
-   "type": "string",
-   "description": "OAuth 2.0 token for the current user.",
-   "location": "query"
-  },
-  "pp": {
-   "type": "boolean",
-   "description": "Pretty-print response.",
-   "default": "true",
-   "location": "query"
-  },
-  "prettyPrint": {
-   "type": "boolean",
-   "description": "Returns response with indentations and line breaks.",
-   "default": "true",
-   "location": "query"
-  },
-  "quotaUser": {
-   "type": "string",
-   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-   "location": "query"
-  },
-  "upload_protocol": {
-   "type": "string",
-   "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-   "location": "query"
-  },
-  "uploadType": {
-   "type": "string",
-   "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-   "location": "query"
-  },
-  "$.xgafv": {
-   "type": "string",
-   "description": "V1 error format.",
-   "enumDescriptions": [
-    "v1 error format",
-    "v2 error format"
-   ],
-   "location": "query"
-  }
- },
- "auth": {
-  "oauth2": {
-   "scopes": {
-    "https://www.googleapis.com/auth/cloud-platform": {
-     "description": "View and manage your data across Google Cloud Platform services"
-    }
-   }
-  }
- },
- "schemas": {
-  "Cluster": {
-   "id": "Cluster",
-   "type": "object",
-   "description": "Describes the identifying information, configuration, and status of a cluster of Google Compute Engine instances.",
-   "properties": {
-    "projectId": {
-     "type": "string",
-     "description": "[Required] The Google Cloud Platform project ID that the cluster belongs to."
-    },
-    "clusterName": {
-     "type": "string",
-     "description": "[Required] The cluster name. Cluster names within a project must be unique. Names from deleted clusters can be reused."
-    },
-    "configuration": {
-     "$ref": "ClusterConfiguration",
-     "description": "[Required] The cluster configuration. Note that Cloud Dataproc may set default values, and values may change when clusters are updated."
-    },
-    "labels": {
-     "type": "object",
-     "description": "[Optional] The labels to associate with this cluster. Label keys must be between 1 and 63 characters long, and must conform to the following PCRE regular expression: \\p{Ll}\\p{Lo}{0,62} Label values must be between 1 and 63 characters long, and must conform to the following PCRE regular expression: [\\p{Ll}\\p{Lo}\\p{N}_-]{0,63} No more than 64 labels can be associated with a given cluster.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "status": {
-     "$ref": "ClusterStatus",
-     "description": "[Output-only] Cluster status."
-    },
-    "statusHistory": {
-     "type": "array",
-     "description": "[Output-only] Previous cluster statuses.",
-     "items": {
-      "$ref": "ClusterStatus"
-     }
-    },
-    "clusterUuid": {
-     "type": "string",
-     "description": "[Output-only] A cluster UUID (Unique Universal Identifier). Cloud Dataproc generates this value when it creates the cluster."
-    },
-    "metrics": {
-     "$ref": "ClusterMetrics",
-     "description": "Contains cluster daemon metrics such as HDFS and YARN stats."
-    }
-   }
-  },
-  "ClusterConfiguration": {
-   "id": "ClusterConfiguration",
-   "type": "object",
-   "description": "The cluster configuration.",
-   "properties": {
-    "configurationBucket": {
-     "type": "string",
-     "description": "[Optional] A Google Cloud Storage staging bucket used for sharing generated SSH keys and configuration. If you do not specify a staging bucket, Cloud Dataproc will determine an appropriate Cloud Storage location (US, ASIA, or EU) for your cluster's staging bucket according to the Google Compute Engine zone where your cluster is deployed, and then it will create and manage this project-level, per-location bucket for you."
-    },
-    "gceClusterConfiguration": {
-     "$ref": "GceClusterConfiguration",
-     "description": "[Required] The shared Google Compute Engine configuration settings for all instances in a cluster."
-    },
-    "masterConfiguration": {
-     "$ref": "InstanceGroupConfiguration",
-     "description": "[Optional] The Google Compute Engine configuration settings for the master instance in a cluster."
-    },
-    "workerConfiguration": {
-     "$ref": "InstanceGroupConfiguration",
-     "description": "[Optional] The Google Compute Engine configuration settings for worker instances in a cluster."
-    },
-    "secondaryWorkerConfiguration": {
-     "$ref": "InstanceGroupConfiguration",
-     "description": "[Optional] The Google Compute Engine configuration settings for additional worker instances in a cluster."
-    },
-    "softwareConfiguration": {
-     "$ref": "SoftwareConfiguration",
-     "description": "[Optional] The configuration settings for software inside the cluster."
-    },
-    "initializationActions": {
-     "type": "array",
-     "description": "[Optional] Commands to execute on each node after configuration is completed. By default, executables are run on master and all worker nodes. You can test a node's role metadata to run an executable on a master or worker node, as shown below: ROLE=$(/usr/share/google/get_metadata_value attributes/role) if [[ \"${ROLE}\" == 'Master' ]]; then ... master specific actions ... else ... worker specific actions ... fi",
-     "items": {
-      "$ref": "NodeInitializationAction"
-     }
-    }
-   }
-  },
-  "GceClusterConfiguration": {
-   "id": "GceClusterConfiguration",
-   "type": "object",
-   "description": "Common configuration settings for resources of Google Compute Engine cluster instances, applicable to all instances in the cluster.",
-   "properties": {
-    "zoneUri": {
-     "type": "string",
-     "description": "[Required] The zone where the Google Compute Engine cluster will be located. Example: `https://www.googleapis.com/compute/v1/projects/[project_id]/zones/[zone]`."
-    },
-    "networkUri": {
-     "type": "string",
-     "description": "The Google Compute Engine network to be used for machine communications. Cannot be specified with subnetwork_uri. If neither network_uri nor subnetwork_uri is specified, the \"default\" network of the project is used, if it exists. Cannot be a \"Custom Subnet Network\" (see https://cloud.google.com/compute/docs/subnetworks for more information). Example: `https://www.googleapis.com/compute/v1/projects/[project_id]/regions/global/default`."
-    },
-    "subnetworkUri": {
-     "type": "string",
-     "description": "The Google Compute Engine subnetwork to be used for machine communications. Cannot be specified with network_uri. Example: `https://www.googleapis.com/compute/v1/projects/[project_id]/regions/us-east1/sub0`."
-    },
-    "internalIpOnly": {
-     "type": "boolean",
-     "description": "If true, all instances in the cluser will only have internal IP addresses. By default, clusters are not restricted to internal IP addresses, and will have ephemeral external IP addresses assigned to each instance. This restriction can only be enabled for subnetwork enabled networks, and all off-cluster dependencies must be configured to be accessible without external IP addresses."
-    },
-    "serviceAccountScopes": {
-     "type": "array",
-     "description": "The URIs of service account scopes to be included in Google Compute Engine instances. The following base set of scopes is always included: - https://www.googleapis.com/auth/cloud.useraccounts.readonly - https://www.googleapis.com/auth/devstorage.read_write - https://www.googleapis.com/auth/logging.write If no scopes are specfied, the following defaults are also provided: - https://www.googleapis.com/auth/bigquery - https://www.googleapis.com/auth/bigtable.admin.table - https://www.googleapis.com/auth/bigtable.data - https://www.googleapis.com/auth/devstorage.full_control",
-     "items": {
-      "type": "string"
-     }
-    },
-    "tags": {
-     "type": "array",
-     "description": "The Google Compute Engine tags to add to all instances.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "metadata": {
-     "type": "object",
-     "description": "The Google Compute Engine metadata entries to add to all instances.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "InstanceGroupConfiguration": {
-   "id": "InstanceGroupConfiguration",
-   "type": "object",
-   "description": "The configuration settings for Google Compute Engine resources in an instance group, such as a master or worker group.",
-   "properties": {
-    "numInstances": {
-     "type": "integer",
-     "description": "The number of VM instances in the instance group. For master instance groups, must be set to 1.",
-     "format": "int32"
-    },
-    "instanceNames": {
-     "type": "array",
-     "description": "The list of instance names. Dataproc derives the names from `cluster_name`, `num_instances`, and the instance group if not set by user (recommended practice is to let Dataproc derive the name).",
-     "items": {
-      "type": "string"
-     }
-    },
-    "imageUri": {
-     "type": "string",
-     "description": "[Output-only] The Google Compute Engine image resource used for cluster instances. Inferred from `SoftwareConfiguration.image_version`."
-    },
-    "machineTypeUri": {
-     "type": "string",
-     "description": "The Google Compute Engine machine type used for cluster instances. Example: `https://www.googleapis.com/compute/v1/projects/[project_id]/zones/us-east1-a/machineTypes/n1-standard-2`."
-    },
-    "diskConfiguration": {
-     "$ref": "DiskConfiguration",
-     "description": "Disk option configuration settings."
-    },
-    "isPreemptible": {
-     "type": "boolean",
-     "description": "Specifies that this instance group contains Preemptible Instances."
-    },
-    "managedGroupConfiguration": {
-     "$ref": "ManagedGroupConfiguration",
-     "description": "[Output-only] The configuration for Google Compute Engine Instance Group Manager that manages this group. This is only used for preemptible instance groups."
-    }
-   }
-  },
-  "DiskConfiguration": {
-   "id": "DiskConfiguration",
-   "type": "object",
-   "description": "Specifies the configuration of disk options for a group of VM instances.",
-   "properties": {
-    "bootDiskSizeGb": {
-     "type": "integer",
-     "description": "[Optional] Size in GB of the boot disk (default is 500GB).",
-     "format": "int32"
-    },
-    "numLocalSsds": {
-     "type": "integer",
-     "description": "[Optional] Number of attached SSDs, from 0 to 4 (default is 0). If SSDs are not attached, the boot disk is used to store runtime logs and HDFS data. If one or more SSDs are attached, this runtime bulk data is spread across them, and the boot disk contains only basic configuration and installed binaries.",
-     "format": "int32"
-    }
-   }
-  },
-  "ManagedGroupConfiguration": {
-   "id": "ManagedGroupConfiguration",
-   "type": "object",
-   "description": "Specifies the resources used to actively manage an instance group.",
-   "properties": {
-    "instanceTemplateName": {
-     "type": "string",
-     "description": "[Output-only] The name of the Instance Template used for the Managed Instance Group."
-    },
-    "instanceGroupManagerName": {
-     "type": "string",
-     "description": "[Output-only] The name of the Instance Group Manager for this group."
-    }
-   }
-  },
-  "SoftwareConfiguration": {
-   "id": "SoftwareConfiguration",
-   "type": "object",
-   "description": "Specifies the selection and configuration of software inside the cluster.",
-   "properties": {
-    "imageVersion": {
-     "type": "string",
-     "description": "[Optional] The version of software inside the cluster. It must match the regular expression `[0-9]+\\.[0-9]+`. If unspecified, it defaults to the latest version (see [Cloud Dataproc Versioning](/dataproc/versioning))."
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] The properties to set on daemon configuration files. Property keys are specified in \"prefix:property\" format, such as \"core:fs.defaultFS\". The following are supported prefixes and their mappings: core - core-site.xml hdfs - hdfs-site.xml mapred - mapred-site.xml yarn - yarn-site.xml hive - hive-site.xml pig - pig.properties spark - spark-defaults.conf",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "NodeInitializationAction": {
-   "id": "NodeInitializationAction",
-   "type": "object",
-   "description": "Specifies an executable to run on a fully configured node and a timeout period for executable completion.",
-   "properties": {
-    "executableFile": {
-     "type": "string",
-     "description": "[Required] Google Cloud Storage URI of executable file."
-    },
-    "executionTimeout": {
-     "type": "string",
-     "description": "[Optional] Amount of time executable has to complete. Default is 10 minutes. Cluster creation fails with an explanatory error message (the name of the executable that caused the error and the exceeded timeout period) if the executable is not completed at end of the timeout period."
-    }
-   }
-  },
-  "ClusterStatus": {
-   "id": "ClusterStatus",
-   "type": "object",
-   "description": "The status of a cluster and its instances.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "The cluster's state.",
-     "enum": [
-      "UNKNOWN",
-      "CREATING",
-      "RUNNING",
-      "ERROR",
-      "DELETING",
-      "UPDATING"
-     ]
-    },
-    "detail": {
-     "type": "string",
-     "description": "Optional details of cluster's state."
-    },
-    "stateStartTime": {
-     "type": "string",
-     "description": "Time when this state was entered."
-    }
-   }
-  },
-  "ClusterMetrics": {
-   "id": "ClusterMetrics",
-   "type": "object",
-   "description": "Contains cluster daemon metrics, such as HDFS and YARN stats.",
-   "properties": {
-    "hdfsMetrics": {
-     "type": "object",
-     "description": "The HDFS metrics.",
-     "additionalProperties": {
-      "type": "string",
-      "format": "int64"
-     }
-    },
-    "yarnMetrics": {
-     "type": "object",
-     "description": "The YARN metrics.",
-     "additionalProperties": {
-      "type": "string",
-      "format": "int64"
-     }
-    }
-   }
-  },
-  "Operation": {
-   "id": "Operation",
-   "type": "object",
-   "description": "This resource represents a long-running operation that is the result of a network API call.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the `name` should have the format of `operations/some/unique/name`."
-    },
-    "metadata": {
-     "type": "object",
-     "description": "Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object. Contains field @type with type URL."
-     }
-    },
-    "done": {
-     "type": "boolean",
-     "description": "If the value is `false`, it means the operation is still in progress. If true, the operation is completed, and either `error` or `response` is available."
-    },
-    "error": {
-     "$ref": "Status",
-     "description": "The error result of the operation in case of failure or cancellation."
-    },
-    "response": {
-     "type": "object",
-     "description": "The normal response of the operation in case of success. If the original method returns no data on success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object. Contains field @type with type URL."
-     }
-    }
-   }
-  },
-  "Status": {
-   "id": "Status",
-   "type": "object",
-   "description": "The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). The error model is designed to be: - Simple to use and understand for most users - Flexible enough to meet unexpected needs # Overview The `Status` message contains three pieces of data: error code, error message, and error details. The error code should be an enum value of google.rpc.Code, but it may accept additional error codes if needed. The error message should be a developer-facing English message that helps developers *understand* and *resolve* the error. If a localized user-facing error message is needed, put the localized message in the error details or localize it in the client. The optional error details may contain arbitrary information about the error. There is a predefined set of error detail types in the package `google.rpc` which can be used for common error conditions. # Language mapping The `Status` message is the logical representation of the error model, but it is not necessarily the actual wire format. When the `Status` message is exposed in different client libraries and different wire protocols, it can be mapped differently. For example, it will likely be mapped to some exceptions in Java, but more likely mapped to some error codes in C. # Other uses The error model and the `Status` message can be used in a variety of environments, either with or without APIs, to provide a consistent developer experience across different environments. Example uses of this error model include: - Partial errors. If a service needs to return partial errors to the client, it may embed the `Status` in the normal response to indicate the partial errors. - Workflow errors. A typical workflow has multiple steps. Each step may have a `Status` message for error reporting purpose. - Batch operations. If a client uses batch request and batch response, the `Status` message should be used directly inside batch response, one for each error sub-response. - Asynchronous operations. If an API call embeds asynchronous operation results in its response, the status of those operations should be represented directly using the `Status` message. - Logging. If some API errors are stored in logs, the message `Status` could be used directly after any stripping needed for security/privacy reasons.",
-   "properties": {
-    "code": {
-     "type": "integer",
-     "description": "The status code, which should be an enum value of google.rpc.Code.",
-     "format": "int32"
-    },
-    "message": {
-     "type": "string",
-     "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client."
-    },
-    "details": {
-     "type": "array",
-     "description": "A list of messages that carry the error details. There will be a common set of message types for APIs to use.",
-     "items": {
-      "type": "object",
-      "additionalProperties": {
-       "type": "any",
-       "description": "Properties of the object. Contains field @type with type URL."
-      }
-     }
-    }
-   }
-  },
-  "ListClustersResponse": {
-   "id": "ListClustersResponse",
-   "type": "object",
-   "description": "The list of all clusters in a project.",
-   "properties": {
-    "clusters": {
-     "type": "array",
-     "description": "[Output-only] The clusters in the project.",
-     "items": {
-      "$ref": "Cluster"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The standard List next-page token."
-    }
-   }
-  },
-  "DiagnoseClusterRequest": {
-   "id": "DiagnoseClusterRequest",
-   "type": "object",
-   "description": "A request to collect cluster diagnostic information."
-  },
-  "SubmitJobRequest": {
-   "id": "SubmitJobRequest",
-   "type": "object",
-   "description": "A request to submit a job.",
-   "properties": {
-    "job": {
-     "$ref": "Job",
-     "description": "[Required] The job resource."
-    }
-   }
-  },
-  "Job": {
-   "id": "Job",
-   "type": "object",
-   "description": "A Cloud Dataproc job resource.",
-   "properties": {
-    "reference": {
-     "$ref": "JobReference",
-     "description": "[Optional] The fully qualified reference to the job, which can be used to obtain the equivalent REST path of the job resource. If this property is not specified when a job is created, the server generates a job_id."
-    },
-    "placement": {
-     "$ref": "JobPlacement",
-     "description": "[Required] Job information, including how, when, and where to run the job."
-    },
-    "hadoopJob": {
-     "$ref": "HadoopJob",
-     "description": "Job is a Hadoop job."
-    },
-    "sparkJob": {
-     "$ref": "SparkJob",
-     "description": "Job is a Spark job."
-    },
-    "pysparkJob": {
-     "$ref": "PySparkJob",
-     "description": "Job is a Pyspark job."
-    },
-    "hiveJob": {
-     "$ref": "HiveJob",
-     "description": "Job is a Hive job."
-    },
-    "pigJob": {
-     "$ref": "PigJob",
-     "description": "Job is a Pig job."
-    },
-    "sparkSqlJob": {
-     "$ref": "SparkSqlJob",
-     "description": "Job is a SparkSql job."
-    },
-    "status": {
-     "$ref": "JobStatus",
-     "description": "[Output-only] The job status. Additional application-specific status information may be contained in the type_job and yarn_applications fields."
-    },
-    "statusHistory": {
-     "type": "array",
-     "description": "[Output-only] The previous job status.",
-     "items": {
-      "$ref": "JobStatus"
-     }
-    },
-    "yarnApplications": {
-     "type": "array",
-     "description": "[Output-only] The collection of YARN applications spun up by this job.",
-     "items": {
-      "$ref": "YarnApplication"
-     }
-    },
-    "submittedBy": {
-     "type": "string",
-     "description": "[Output-only] The email address of the user submitting the job. For jobs submitted on the cluster, the address is username@hostname."
-    },
-    "driverInputResourceUri": {
-     "type": "string",
-     "description": "[Output-only] A URI pointing to the location of the stdin of the job's driver program, only set if the job is interactive."
-    },
-    "driverOutputResourceUri": {
-     "type": "string",
-     "description": "[Output-only] A URI pointing to the location of the stdout of the job's driver program."
-    },
-    "driverControlFilesUri": {
-     "type": "string",
-     "description": "[Output-only] If present, the location of miscellaneous control files which may be used as part of job setup and handling. If not present, control files may be placed in the same location as `driver_output_uri`."
-    },
-    "interactive": {
-     "type": "boolean",
-     "description": "[Optional] If set to `true`, the driver's stdin will be kept open and `driver_input_uri` will be set to provide a path at which additional input can be sent to the driver."
-    },
-    "labels": {
-     "type": "object",
-     "description": "[Optional] The labels to associate with this job. Label keys must be between 1 and 63 characters long, and must conform to the following regular expression: \\p{Ll}\\p{Lo}{0,62} Label values must be between 1 and 63 characters long, and must conform to the following regular expression: [\\p{Ll}\\p{Lo}\\p{N}_-]{0,63} No more than 64 labels can be associated with a given job.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "JobReference": {
-   "id": "JobReference",
-   "type": "object",
-   "description": "Encapsulates the full scoping used to reference a job.",
-   "properties": {
-    "projectId": {
-     "type": "string",
-     "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to."
-    },
-    "jobId": {
-     "type": "string",
-     "description": "[Required] The job ID, which must be unique within the project. The job ID is generated by the server upon job submission or provided by the user as a means to perform retries without creating duplicate jobs. The ID must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), or hyphens (-). The maximum length is 512 characters."
-    }
-   }
-  },
-  "JobPlacement": {
-   "id": "JobPlacement",
-   "type": "object",
-   "description": "Cloud Dataproc job configuration.",
-   "properties": {
-    "clusterName": {
-     "type": "string",
-     "description": "[Required] The name of the cluster where the job will be submitted."
-    },
-    "clusterUuid": {
-     "type": "string",
-     "description": "[Output-only] A cluster UUID generated by the Dataproc service when the job is submitted."
-    }
-   }
-  },
-  "HadoopJob": {
-   "id": "HadoopJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running Hadoop MapReduce jobs on YARN.",
-   "properties": {
-    "mainJarFileUri": {
-     "type": "string",
-     "description": "The Hadoop Compatible Filesystem (HCFS) URI of the jar file containing the main class. Examples: 'gs://foo-bucket/analytics-binaries/extract-useful-metrics-mr.jar' 'hdfs:/tmp/test-samples/custom-wordcount.jar' 'file:///home/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar'"
-    },
-    "mainClass": {
-     "type": "string",
-     "description": "The name of the driver's main class. The jar file containing the class must be in the default CLASSPATH or specified in `jar_file_uris`."
-    },
-    "args": {
-     "type": "array",
-     "description": "[Optional] The arguments to pass to the driver. Do not include arguments, such as `-libjars` or `-Dfoo=bar`, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] Jar file URIs to add to the CLASSPATHs of the Hadoop driver and tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "fileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of files to be copied to the working directory of Hadoop drivers and distributed tasks. Useful for naively parallel tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "archiveUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of archives to be extracted in the working directory of Hadoop drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, or .zip.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure Hadoop. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "loggingConfiguration": {
-     "$ref": "LoggingConfiguration",
-     "description": "[Optional] The runtime log configuration for job execution."
-    }
-   }
-  },
-  "LoggingConfiguration": {
-   "id": "LoggingConfiguration",
-   "type": "object",
-   "description": "The runtime logging configuration of the job.",
-   "properties": {
-    "driverLogLevels": {
-     "type": "object",
-     "description": "The per-package log levels for the driver. This may include \"root\" package name to configure rootLogger. Examples: 'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'",
-     "additionalProperties": {
-      "type": "string",
-      "enum": [
-       "LEVEL_UNSPECIFIED",
-       "ALL",
-       "TRACE",
-       "DEBUG",
-       "INFO",
-       "WARN",
-       "ERROR",
-       "FATAL",
-       "OFF"
-      ]
-     }
-    }
-   }
-  },
-  "SparkJob": {
-   "id": "SparkJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running Spark applications on YARN.",
-   "properties": {
-    "mainJarFileUri": {
-     "type": "string",
-     "description": "The Hadoop Compatible Filesystem (HCFS) URI of the jar file that contains the main class."
-    },
-    "mainClass": {
-     "type": "string",
-     "description": "The name of the driver's main class. The jar file that contains the class must be in the default CLASSPATH or specified in `jar_file_uris`."
-    },
-    "args": {
-     "type": "array",
-     "description": "[Optional] The arguments to pass to the driver. Do not include arguments, such as `--conf`, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to add to the CLASSPATHs of the Spark driver and tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "fileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of files to be copied to the working directory of Spark drivers and distributed tasks. Useful for naively parallel tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "archiveUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of archives to be extracted in the working directory of Spark drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, and .zip.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure Spark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "loggingConfiguration": {
-     "$ref": "LoggingConfiguration",
-     "description": "[Optional] The runtime log configuration for job execution."
-    }
-   }
-  },
-  "PySparkJob": {
-   "id": "PySparkJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running PySpark applications on YARN.",
-   "properties": {
-    "mainPythonFileUri": {
-     "type": "string",
-     "description": "[Required] The Hadoop Compatible Filesystem (HCFS) URI of the main Python file to use as the driver. Must be a .py file."
-    },
-    "args": {
-     "type": "array",
-     "description": "[Optional] The arguments to pass to the driver. Do not include arguments, such as `--conf`, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "pythonFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS file URIs of Python files to pass to the PySpark framework. Supported file types: .py, .egg, and .zip.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to add to the CLASSPATHs of the Python driver and tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "fileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of files to be copied to the working directory of Python drivers and distributed tasks. Useful for naively parallel tasks.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "archiveUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of archives to be extracted in the working directory of .jar, .tar, .tar.gz, .tgz, and .zip.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure PySpark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "loggingConfiguration": {
-     "$ref": "LoggingConfiguration",
-     "description": "[Optional] The runtime log configuration for job execution."
-    }
-   }
-  },
-  "HiveJob": {
-   "id": "HiveJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running Hive queries on YARN.",
-   "properties": {
-    "queryFileUri": {
-     "type": "string",
-     "description": "The HCFS URI of the script that contains Hive queries."
-    },
-    "queryList": {
-     "$ref": "QueryList",
-     "description": "A list of queries."
-    },
-    "continueOnFailure": {
-     "type": "boolean",
-     "description": "[Optional] Whether to continue executing queries if a query fails. The default value is `false`. Setting to `true` can be useful when executing independent parallel queries."
-    },
-    "scriptVariables": {
-     "type": "object",
-     "description": "[Optional] Mapping of query variable names to values (equivalent to the Hive command: `SET name=\"value\";`).",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names and values, used to configure Hive. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/hive/conf/hive-site.xml, and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to add to the CLASSPATH of the Hive server and Hadoop MapReduce (MR) tasks. Can contain Hive SerDes and UDFs.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "QueryList": {
-   "id": "QueryList",
-   "type": "object",
-   "description": "A list of queries to run on a cluster.",
-   "properties": {
-    "queries": {
-     "type": "array",
-     "description": "[Required] The queries to execute. You do not need to terminate a query with a semicolon. Multiple queries can be specified in one string by separating each with a semicolon. Here is an example of an Cloud Dataproc API snippet that uses a QueryList to specify a HiveJob: \"hiveJob\": { \"queryList\": { \"queries\": [ \"query1\", \"query2\", \"query3;query4\", ] } }",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "PigJob": {
-   "id": "PigJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running Pig queries on YARN.",
-   "properties": {
-    "queryFileUri": {
-     "type": "string",
-     "description": "The HCFS URI of the script that contains the Pig queries."
-    },
-    "queryList": {
-     "$ref": "QueryList",
-     "description": "A list of queries."
-    },
-    "continueOnFailure": {
-     "type": "boolean",
-     "description": "[Optional] Whether to continue executing queries if a query fails. The default value is `false`. Setting to `true` can be useful when executing independent parallel queries."
-    },
-    "scriptVariables": {
-     "type": "object",
-     "description": "[Optional] Mapping of query variable names to values (equivalent to the Pig command: `name=[value]`).",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure Pig. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/pig/conf/pig.properties, and classes in user code.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to add to the CLASSPATH of the Pig Client and Hadoop MapReduce (MR) tasks. Can contain Pig UDFs.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "loggingConfiguration": {
-     "$ref": "LoggingConfiguration",
-     "description": "[Optional] The runtime log configuration for job execution."
-    }
-   }
-  },
-  "SparkSqlJob": {
-   "id": "SparkSqlJob",
-   "type": "object",
-   "description": "A Cloud Dataproc job for running Spark SQL queries.",
-   "properties": {
-    "queryFileUri": {
-     "type": "string",
-     "description": "The HCFS URI of the script that contains SQL queries."
-    },
-    "queryList": {
-     "$ref": "QueryList",
-     "description": "A list of queries."
-    },
-    "scriptVariables": {
-     "type": "object",
-     "description": "[Optional] Mapping of query variable names to values (equivalent to the Spark SQL command: SET `name=\"value\";`).",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "properties": {
-     "type": "object",
-     "description": "[Optional] A mapping of property names to values, used to configure Spark SQL's SparkConf. Properties that conflict with values set by the Cloud Dataproc API may be overwritten.",
-     "additionalProperties": {
-      "type": "string"
-     }
-    },
-    "jarFileUris": {
-     "type": "array",
-     "description": "[Optional] HCFS URIs of jar files to be added to the Spark CLASSPATH.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "loggingConfiguration": {
-     "$ref": "LoggingConfiguration",
-     "description": "[Optional] The runtime log configuration for job execution."
-    }
-   }
-  },
-  "JobStatus": {
-   "id": "JobStatus",
-   "type": "object",
-   "description": "Cloud Dataproc job status.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "[Required] A state message specifying the overall job state.",
-     "enum": [
-      "STATE_UNSPECIFIED",
-      "PENDING",
-      "SETUP_DONE",
-      "RUNNING",
-      "CANCEL_PENDING",
-      "CANCEL_STARTED",
-      "CANCELLED",
-      "DONE",
-      "ERROR"
-     ]
-    },
-    "details": {
-     "type": "string",
-     "description": "[Optional] Job state details, such as an error description if the state is ERROR."
-    },
-    "stateStartTime": {
-     "type": "string",
-     "description": "[Output-only] The time when this state was entered."
-    }
-   }
-  },
-  "YarnApplication": {
-   "id": "YarnApplication",
-   "type": "object",
-   "description": "A YARN application created by a job. Application information is a subset of org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "[Required] The application name."
-    },
-    "state": {
-     "type": "string",
-     "description": "[Required] The application state.",
-     "enum": [
-      "STATE_UNSPECIFIED",
-      "NEW",
-      "NEW_SAVING",
-      "SUBMITTED",
-      "ACCEPTED",
-      "RUNNING",
-      "FINISHED",
-      "FAILED",
-      "KILLED"
-     ]
-    },
-    "progress": {
-     "type": "number",
-     "description": "[Required] The numerical progress of the application, from 1 to 100.",
-     "format": "float"
-    },
-    "trackingUrl": {
-     "type": "string",
-     "description": "[Optional] The HTTP URL of the ApplicationMaster, HistoryServer, or TimelineServer that provides application-specific information. The URL uses the internal hostname, and requires a proxy server for resolution and, possibly, access."
-    }
-   }
-  },
-  "ListJobsResponse": {
-   "id": "ListJobsResponse",
-   "type": "object",
-   "description": "A list of jobs in a project.",
-   "properties": {
-    "jobs": {
-     "type": "array",
-     "description": "[Output-only] Jobs list.",
-     "items": {
-      "$ref": "Job"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "[Optional] This token is included in the response if there are more results to fetch. To fetch additional results, provide this value as the `page_token` in a subsequent ListJobsRequest."
-    }
-   }
-  },
-  "CancelJobRequest": {
-   "id": "CancelJobRequest",
-   "type": "object",
-   "description": "A request to cancel a job."
-  },
-  "Empty": {
-   "id": "Empty",
-   "type": "object",
-   "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance: service Foo { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); } The JSON representation for `Empty` is empty JSON object `{}`."
-  },
-  "ListOperationsResponse": {
-   "id": "ListOperationsResponse",
-   "type": "object",
-   "description": "The response message for Operations.ListOperations.",
-   "properties": {
+  "ownerDomain": "google.com",
+  "name": "dataproc",
+  "batchPath": "batch",
+  "revision": "20170207",
+  "documentationLink": "https://cloud.google.com/dataproc/",
+  "id": "dataproc:v1beta1",
+  "title": "Google Cloud Dataproc API",
+  "ownerName": "Google",
+  "discoveryVersion": "v1",
+  "resources": {
     "operations": {
-     "type": "array",
-     "description": "A list of operations that matches the specified filter in the request.",
-     "items": {
-      "$ref": "Operation"
-     }
+      "methods": {
+        "cancel": {
+          "flatPath": "v1beta1/operations/{operationsId}:cancel",
+          "path": "v1beta1/{+name}:cancel",
+          "id": "dataproc.operations.cancel",
+          "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns google.rpc.Code.UNIMPLEMENTED. Clients can use operations.get or other methods to check whether the cancellation succeeded or whether the operation completed despite cancellation.",
+          "request": {
+            "$ref": "CancelOperationRequest"
+          },
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameterOrder": [
+            "name"
+          ],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "name": {
+              "description": "The name of the operation resource to be cancelled.",
+              "required": true,
+              "type": "string",
+              "pattern": "^operations/.+$",
+              "location": "path"
+            }
+          }
+        },
+        "delete": {
+          "httpMethod": "DELETE",
+          "parameterOrder": [
+            "name"
+          ],
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameters": {
+            "name": {
+              "pattern": "^operations/.+$",
+              "location": "path",
+              "description": "The name of the operation resource to be deleted.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "flatPath": "v1beta1/operations/{operationsId}",
+          "id": "dataproc.operations.delete",
+          "path": "v1beta1/{+name}",
+          "description": "Deletes a long-running operation. This method indicates that the client is no longer interested in the operation result. It does not cancel the operation. If the server doesn't support this method, it returns google.rpc.Code.UNIMPLEMENTED."
+        },
+        "get": {
+          "httpMethod": "GET",
+          "parameterOrder": [
+            "name"
+          ],
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "name": {
+              "description": "The name of the operation resource.",
+              "required": true,
+              "type": "string",
+              "pattern": "^operations/.+$",
+              "location": "path"
+            }
+          },
+          "flatPath": "v1beta1/operations/{operationsId}",
+          "id": "dataproc.operations.get",
+          "path": "v1beta1/{+name}",
+          "description": "Gets the latest state of a long-running operation. Clients can use this method to poll the operation result at intervals as recommended by the API service."
+        },
+        "list": {
+          "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns UNIMPLEMENTED.NOTE: the name binding below allows API services to override the binding to use different resource name schemes, such as users/*/operations.",
+          "httpMethod": "GET",
+          "parameterOrder": [
+            "name"
+          ],
+          "response": {
+            "$ref": "ListOperationsResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "name": {
+              "location": "path",
+              "description": "The name of the operation collection.",
+              "required": true,
+              "type": "string",
+              "pattern": "^operations$"
+            },
+            "pageToken": {
+              "location": "query",
+              "description": "The standard list page token.",
+              "type": "string"
+            },
+            "pageSize": {
+              "location": "query",
+              "description": "The standard list page size.",
+              "format": "int32",
+              "type": "integer"
+            },
+            "filter": {
+              "location": "query",
+              "description": "The standard list filter.",
+              "type": "string"
+            }
+          },
+          "flatPath": "v1beta1/operations",
+          "id": "dataproc.operations.list",
+          "path": "v1beta1/{+name}"
+        }
+      }
     },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The standard List next-page token."
+    "projects": {
+      "resources": {
+        "jobs": {
+          "methods": {
+            "cancel": {
+              "response": {
+                "$ref": "Job"
+              },
+              "parameterOrder": [
+                "projectId",
+                "jobId"
+              ],
+              "httpMethod": "POST",
+              "parameters": {
+                "projectId": {
+                  "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                },
+                "jobId": {
+                  "description": "Required The job ID.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1beta1/projects/{projectId}/jobs/{jobId}:cancel",
+              "path": "v1beta1/projects/{projectId}/jobs/{jobId}:cancel",
+              "id": "dataproc.projects.jobs.cancel",
+              "request": {
+                "$ref": "CancelJobRequest"
+              },
+              "description": "Starts a job cancellation request. To access the job resource after cancellation, call jobs.list or jobs.get."
+            },
+            "get": {
+              "description": "Gets the resource representation for a job in a project.",
+              "httpMethod": "GET",
+              "response": {
+                "$ref": "Job"
+              },
+              "parameterOrder": [
+                "projectId",
+                "jobId"
+              ],
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "projectId": {
+                  "location": "path",
+                  "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                  "required": true,
+                  "type": "string"
+                },
+                "jobId": {
+                  "description": "Required The job ID.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectId}/jobs/{jobId}",
+              "id": "dataproc.projects.jobs.get",
+              "path": "v1beta1/projects/{projectId}/jobs/{jobId}"
+            },
+            "patch": {
+              "description": "Updates a job in a project.",
+              "request": {
+                "$ref": "Job"
+              },
+              "response": {
+                "$ref": "Job"
+              },
+              "parameterOrder": [
+                "projectId",
+                "jobId"
+              ],
+              "httpMethod": "PATCH",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "updateMask": {
+                  "location": "query",
+                  "description": "Required Specifies the path, relative to \u003ccode\u003eJob\u003c/code\u003e, of the field to update. For example, to update the labels of a Job the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be specified as \u003ccode\u003elabels\u003c/code\u003e, and the PATCH request body would specify the new value. \u003cstrong\u003eNote:\u003c/strong\u003e Currently, \u003ccode\u003elabels\u003c/code\u003e is the only field that can be updated.",
+                  "format": "google-fieldmask",
+                  "type": "string"
+                },
+                "projectId": {
+                  "location": "path",
+                  "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                  "required": true,
+                  "type": "string"
+                },
+                "jobId": {
+                  "location": "path",
+                  "description": "Required The job ID.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectId}/jobs/{jobId}",
+              "path": "v1beta1/projects/{projectId}/jobs/{jobId}",
+              "id": "dataproc.projects.jobs.patch"
+            },
+            "submit": {
+              "description": "Submits a job to a cluster.",
+              "request": {
+                "$ref": "SubmitJobRequest"
+              },
+              "response": {
+                "$ref": "Job"
+              },
+              "parameterOrder": [
+                "projectId"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "projectId": {
+                  "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectId}/jobs:submit",
+              "path": "v1beta1/projects/{projectId}/jobs:submit",
+              "id": "dataproc.projects.jobs.submit"
+            },
+            "delete": {
+              "response": {
+                "$ref": "Empty"
+              },
+              "httpMethod": "DELETE",
+              "parameterOrder": [
+                "projectId",
+                "jobId"
+              ],
+              "parameters": {
+                "projectId": {
+                  "location": "path",
+                  "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                  "required": true,
+                  "type": "string"
+                },
+                "jobId": {
+                  "description": "Required The job ID.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1beta1/projects/{projectId}/jobs/{jobId}",
+              "path": "v1beta1/projects/{projectId}/jobs/{jobId}",
+              "id": "dataproc.projects.jobs.delete",
+              "description": "Deletes the job from the project. If the job is active, the delete fails, and the response returns FAILED_PRECONDITION."
+            },
+            "list": {
+              "response": {
+                "$ref": "ListJobsResponse"
+              },
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "projectId"
+              ],
+              "parameters": {
+                "pageToken": {
+                  "description": "Optional The page token, returned by a previous call, to request the next page of results.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "description": "Optional The number of results to return in each response.",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                },
+                "clusterName": {
+                  "description": "Optional If set, the returned jobs list includes only jobs that were submitted to the named cluster.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "projectId": {
+                  "location": "path",
+                  "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+                  "required": true,
+                  "type": "string"
+                },
+                "filter": {
+                  "description": "Optional A filter constraining which jobs to list. Valid filters contain job state and label terms such as: labels.key1 = val1 AND (labels.k2 = val2 OR labels.k3 = val3)",
+                  "type": "string",
+                  "location": "query"
+                },
+                "jobStateMatcher": {
+                  "location": "query",
+                  "enum": [
+                    "ALL",
+                    "ACTIVE",
+                    "NON_ACTIVE"
+                  ],
+                  "description": "Optional Specifies enumerated categories of jobs to list.",
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1beta1/projects/{projectId}/jobs",
+              "path": "v1beta1/projects/{projectId}/jobs",
+              "id": "dataproc.projects.jobs.list",
+              "description": "Lists jobs in a project."
+            }
+          }
+        },
+        "clusters": {
+          "methods": {
+            "diagnose": {
+              "description": "Gets cluster diagnostic information. After the operation completes, the Operation.response field contains DiagnoseClusterOutputLocation.",
+              "request": {
+                "$ref": "DiagnoseClusterRequest"
+              },
+              "response": {
+                "$ref": "Operation"
+              },
+              "parameterOrder": [
+                "projectId",
+                "clusterName"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "clusterName": {
+                  "required": true,
+                  "type": "string",
+                  "location": "path",
+                  "description": "Required The cluster name."
+                },
+                "projectId": {
+                  "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectId}/clusters/{clusterName}:diagnose",
+              "path": "v1beta1/projects/{projectId}/clusters/{clusterName}:diagnose",
+              "id": "dataproc.projects.clusters.diagnose"
+            },
+            "delete": {
+              "description": "Deletes a cluster in a project.",
+              "response": {
+                "$ref": "Operation"
+              },
+              "parameterOrder": [
+                "projectId",
+                "clusterName"
+              ],
+              "httpMethod": "DELETE",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "clusterName": {
+                  "location": "path",
+                  "description": "Required The cluster name.",
+                  "required": true,
+                  "type": "string"
+                },
+                "projectId": {
+                  "location": "path",
+                  "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectId}/clusters/{clusterName}",
+              "path": "v1beta1/projects/{projectId}/clusters/{clusterName}",
+              "id": "dataproc.projects.clusters.delete"
+            },
+            "list": {
+              "description": "Lists all clusters in a project.",
+              "parameterOrder": [
+                "projectId"
+              ],
+              "response": {
+                "$ref": "ListClustersResponse"
+              },
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "pageToken": {
+                  "description": "The standard List page token.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "description": "The standard List page size.",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                },
+                "projectId": {
+                  "required": true,
+                  "type": "string",
+                  "location": "path",
+                  "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to."
+                },
+                "filter": {
+                  "location": "query",
+                  "description": "Optional A filter constraining which clusters to list. Valid filters contain label terms such as: labels.key1 = val1 AND (-labels.k2 = val2 OR labels.k3 = val3)",
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectId}/clusters",
+              "path": "v1beta1/projects/{projectId}/clusters",
+              "id": "dataproc.projects.clusters.list"
+            },
+            "create": {
+              "request": {
+                "$ref": "Cluster"
+              },
+              "description": "Creates a cluster in a project.",
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "projectId"
+              ],
+              "response": {
+                "$ref": "Operation"
+              },
+              "parameters": {
+                "projectId": {
+                  "required": true,
+                  "type": "string",
+                  "location": "path",
+                  "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to."
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1beta1/projects/{projectId}/clusters",
+              "id": "dataproc.projects.clusters.create",
+              "path": "v1beta1/projects/{projectId}/clusters"
+            },
+            "patch": {
+              "flatPath": "v1beta1/projects/{projectId}/clusters/{clusterName}",
+              "path": "v1beta1/projects/{projectId}/clusters/{clusterName}",
+              "id": "dataproc.projects.clusters.patch",
+              "request": {
+                "$ref": "Cluster"
+              },
+              "description": "Updates a cluster in a project.",
+              "response": {
+                "$ref": "Operation"
+              },
+              "parameterOrder": [
+                "projectId",
+                "clusterName"
+              ],
+              "httpMethod": "PATCH",
+              "parameters": {
+                "updateMask": {
+                  "description": "Required Specifies the path, relative to \u003ccode\u003eCluster\u003c/code\u003e, of the field to update. For example, to change the number of workers in a cluster to 5, the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be specified as \u003ccode\u003econfiguration.worker_configuration.num_instances\u003c/code\u003e, and the PATCH request body would specify the new value, as follows:\n{\n  \"configuration\":{\n    \"workerConfiguration\":{\n      \"numInstances\":\"5\"\n    }\n  }\n}\nSimilarly, to change the number of preemptible workers in a cluster to 5, the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be \u003ccode\u003econfig.secondary_worker_config.num_instances\u003c/code\u003e, and the PATCH request body would be set as follows:\n{\n  \"config\":{\n    \"secondaryWorkerConfig\":{\n      \"numInstances\":\"5\"\n    }\n  }\n}\n\u003cstrong\u003eNote:\u003c/strong\u003e Currently, \u003ccode\u003econfig.worker_config.num_instances\u003c/code\u003e and \u003ccode\u003econfig.secondary_worker_config.num_instances\u003c/code\u003e are the only fields that can be updated.",
+                  "format": "google-fieldmask",
+                  "type": "string",
+                  "location": "query"
+                },
+                "clusterName": {
+                  "location": "path",
+                  "description": "Required The cluster name.",
+                  "required": true,
+                  "type": "string"
+                },
+                "projectId": {
+                  "description": "Required The ID of the Google Cloud Platform project the cluster belongs to.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ]
+            },
+            "get": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "projectId",
+                "clusterName"
+              ],
+              "response": {
+                "$ref": "Cluster"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "clusterName": {
+                  "description": "Required The cluster name.",
+                  "required": true,
+                  "type": "string",
+                  "location": "path"
+                },
+                "projectId": {
+                  "location": "path",
+                  "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectId}/clusters/{clusterName}",
+              "id": "dataproc.projects.clusters.get",
+              "path": "v1beta1/projects/{projectId}/clusters/{clusterName}",
+              "description": "Gets the resource representation for a cluster in a project."
+            }
+          }
+        }
+      }
     }
-   }
   },
-  "CancelOperationRequest": {
-   "id": "CancelOperationRequest",
-   "type": "object",
-   "description": "The request message for Operations.CancelOperation."
-  },
-  "DiagnoseClusterResults": {
-   "id": "DiagnoseClusterResults",
-   "type": "object",
-   "description": "The location of diagnostic output.",
-   "properties": {
-    "outputUri": {
-     "type": "string",
-     "description": "[Output-only] The Google Cloud Storage URI of the diagnostic output. The output report is a plain text file with a summary of collected diagnostics."
-    }
-   }
-  },
-  "ClusterOperationMetadata": {
-   "id": "ClusterOperationMetadata",
-   "type": "object",
-   "description": "Metadata describing the operation.",
-   "properties": {
-    "clusterName": {
-     "type": "string",
-     "description": "[Output-only] Name of the cluster for the operation."
-    },
-    "clusterUuid": {
-     "type": "string",
-     "description": "[Output-only] Cluster UUID for the operation."
-    },
-    "status": {
-     "$ref": "ClusterOperationStatus",
-     "description": "[Output-only] Current operation status."
-    },
-    "statusHistory": {
-     "type": "array",
-     "description": "[Output-only] The previous operation status.",
-     "items": {
-      "$ref": "ClusterOperationStatus"
-     }
-    },
-    "operationType": {
-     "type": "string",
-     "description": "[Output-only] The operation type."
-    },
-    "description": {
-     "type": "string",
-     "description": "[Output-only] Short description of operation."
-    },
-    "labels": {
-     "type": "object",
-     "description": "[Output-only] labels associated with the operation",
-     "additionalProperties": {
+  "parameters": {
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
       "type": "string"
-     }
+    },
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
+    },
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    },
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "type": "boolean",
+      "default": "true",
+      "location": "query",
+      "description": "Returns response with indentations and line breaks."
+    },
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ]
+    },
+    "alt": {
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json"
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
     }
-   }
   },
-  "ClusterOperationStatus": {
-   "id": "ClusterOperationStatus",
-   "type": "object",
-   "description": "The status of the operation.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "[Output-only] A message containing the operation state.",
-     "enum": [
-      "UNKNOWN",
-      "PENDING",
-      "RUNNING",
-      "DONE"
-     ]
-    },
-    "innerState": {
-     "type": "string",
-     "description": "[Output-only] A message containing the detailed operation state."
-    },
-    "details": {
-     "type": "string",
-     "description": "[Output-only]A message containing any operation metadata details."
-    },
-    "stateStartTime": {
-     "type": "string",
-     "description": "[Output-only] The time this state was entered."
-    }
-   }
-  },
-  "DiagnoseClusterOutputLocation": {
-   "id": "DiagnoseClusterOutputLocation",
-   "type": "object",
-   "description": "The location where output from diagnostic command can be found.",
-   "properties": {
-    "outputUri": {
-     "type": "string",
-     "description": "[Output-only] The Google Cloud Storage URI of the diagnostic output. This will be a plain text file with summary of collected diagnostics."
-    }
-   }
-  },
-  "OperationMetadata": {
-   "id": "OperationMetadata",
-   "type": "object",
-   "description": "Metadata describing the operation.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "A message containing the operation state.",
-     "enum": [
-      "UNKNOWN",
-      "PENDING",
-      "RUNNING",
-      "DONE"
-     ]
-    },
-    "innerState": {
-     "type": "string",
-     "description": "A message containing the detailed operation state."
-    },
-    "details": {
-     "type": "string",
-     "description": "A message containing any operation metadata details."
-    },
-    "insertTime": {
-     "type": "string",
-     "description": "The time that the operation was requested."
-    },
-    "startTime": {
-     "type": "string",
-     "description": "The time that the operation was started by the server."
-    },
-    "endTime": {
-     "type": "string",
-     "description": "The time that the operation completed."
-    },
-    "clusterName": {
-     "type": "string",
-     "description": "Name of the cluster for the operation."
-    },
-    "clusterUuid": {
-     "type": "string",
-     "description": "Cluster UUId for the operation."
-    },
-    "status": {
-     "$ref": "OperationStatus",
-     "description": "[Output-only] Current operation status."
-    },
-    "statusHistory": {
-     "type": "array",
-     "description": "[Output-only] Previous operation status.",
-     "items": {
-      "$ref": "OperationStatus"
-     }
-    },
-    "operationType": {
-     "type": "string",
-     "description": "[Output-only] The operation type."
-    },
-    "description": {
-     "type": "string",
-     "description": "[Output-only] Short description of operation."
-    }
-   }
-  },
-  "OperationStatus": {
-   "id": "OperationStatus",
-   "type": "object",
-   "description": "The status of the operation.",
-   "properties": {
-    "state": {
-     "type": "string",
-     "description": "A message containing the operation state.",
-     "enum": [
-      "UNKNOWN",
-      "PENDING",
-      "RUNNING",
-      "DONE"
-     ]
-    },
-    "innerState": {
-     "type": "string",
-     "description": "A message containing the detailed operation state."
-    },
-    "details": {
-     "type": "string",
-     "description": "A message containing any operation metadata details."
-    },
-    "stateStartTime": {
-     "type": "string",
-     "description": "The time this state was entered."
-    }
-   }
-  }
- },
- "resources": {
-  "projects": {
-   "resources": {
-    "clusters": {
-     "methods": {
-      "create": {
-       "id": "dataproc.projects.clusters.create",
-       "path": "v1beta1/projects/{projectId}/clusters",
-       "httpMethod": "POST",
-       "description": "Creates a cluster in a project.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-         "required": true,
-         "location": "path"
+  "schemas": {
+    "JobScheduling": {
+      "description": "Job scheduling options.Beta Feature: These options are available for testing purposes only. They may be changed before final release.",
+      "type": "object",
+      "properties": {
+        "maxFailuresPerHour": {
+          "description": "Optional Maximum number of times per hour a driver may be restarted as a result of driver terminating with non-zero code before job is reported failed.A job may be reported as thrashing if driver exits with non-zero code 4 times within 10 minute window.Maximum value is 10.",
+          "format": "int32",
+          "type": "integer"
         }
-       },
-       "parameterOrder": [
-        "projectId"
-       ],
-       "request": {
-        "$ref": "Cluster"
-       },
-       "response": {
-        "$ref": "Operation"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
       },
-      "patch": {
-       "id": "dataproc.projects.clusters.patch",
-       "path": "v1beta1/projects/{projectId}/clusters/{clusterName}",
-       "httpMethod": "PATCH",
-       "description": "Updates a cluster in a project.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "[Required] The ID of the Google Cloud Platform project the cluster belongs to.",
-         "required": true,
-         "location": "path"
+      "id": "JobScheduling"
+    },
+    "ListJobsResponse": {
+      "id": "ListJobsResponse",
+      "description": "A list of jobs in a project.",
+      "type": "object",
+      "properties": {
+        "jobs": {
+          "description": "Output-only Jobs list.",
+          "type": "array",
+          "items": {
+            "$ref": "Job"
+          }
         },
-        "clusterName": {
-         "type": "string",
-         "description": "[Required] The cluster name.",
-         "required": true,
-         "location": "path"
-        },
-        "updateMask": {
-         "type": "string",
-         "description": "[Required] Specifies the path, relative to Cluster, of the field to update. For example, to change the number of workers in a cluster to 5, the update_mask parameter would be specified as configuration.worker_configuration.num_instances, and the `PATCH` request body would specify the new value, as follows: { \"configuration\":{ \"workerConfiguration\":{ \"numInstances\":\"5\" } } } Similarly, to change the number of preemptible workers in a cluster to 5, the update_mask parameter would be config.secondary_worker_config.num_instances, and the `PATCH` request body would be set as follows: { \"config\":{ \"secondaryWorkerConfig\":{ \"numInstances\":\"5\" } } } Note: Currently, config.worker_config.num_instances and config.secondary_worker_config.num_instances are the only fields that can be updated.",
-         "location": "query"
+        "nextPageToken": {
+          "type": "string",
+          "description": "Optional This token is included in the response if there are more results to fetch. To fetch additional results, provide this value as the page_token in a subsequent \u003ccode\u003eListJobsRequest\u003c/code\u003e."
         }
-       },
-       "parameterOrder": [
-        "projectId",
-        "clusterName"
-       ],
-       "request": {
-        "$ref": "Cluster"
-       },
-       "response": {
-        "$ref": "Operation"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "delete": {
-       "id": "dataproc.projects.clusters.delete",
-       "path": "v1beta1/projects/{projectId}/clusters/{clusterName}",
-       "httpMethod": "DELETE",
-       "description": "Deletes a cluster in a project.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-         "required": true,
-         "location": "path"
-        },
-        "clusterName": {
-         "type": "string",
-         "description": "[Required] The cluster name.",
-         "required": true,
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "projectId",
-        "clusterName"
-       ],
-       "response": {
-        "$ref": "Operation"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "get": {
-       "id": "dataproc.projects.clusters.get",
-       "path": "v1beta1/projects/{projectId}/clusters/{clusterName}",
-       "httpMethod": "GET",
-       "description": "Gets the resource representation for a cluster in a project.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-         "required": true,
-         "location": "path"
-        },
-        "clusterName": {
-         "type": "string",
-         "description": "[Required] The cluster name.",
-         "required": true,
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "projectId",
-        "clusterName"
-       ],
-       "response": {
-        "$ref": "Cluster"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "list": {
-       "id": "dataproc.projects.clusters.list",
-       "path": "v1beta1/projects/{projectId}/clusters",
-       "httpMethod": "GET",
-       "description": "Lists all clusters in a project.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-         "required": true,
-         "location": "path"
-        },
-        "filter": {
-         "type": "string",
-         "description": "[Optional] A filter constraining which clusters to list. Valid filters contain label terms such as: labels.key1 = val1 AND (-labels.k2 = val2 OR labels.k3 = val3)",
-         "location": "query"
-        },
-        "pageSize": {
-         "type": "integer",
-         "description": "The standard List page size.",
-         "format": "int32",
-         "location": "query"
-        },
-        "pageToken": {
-         "type": "string",
-         "description": "The standard List page token.",
-         "location": "query"
-        }
-       },
-       "parameterOrder": [
-        "projectId"
-       ],
-       "response": {
-        "$ref": "ListClustersResponse"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "diagnose": {
-       "id": "dataproc.projects.clusters.diagnose",
-       "path": "v1beta1/projects/{projectId}/clusters/{clusterName}:diagnose",
-       "httpMethod": "POST",
-       "description": "Gets cluster diagnostic information. After the operation completes, the Operation.response field contains `DiagnoseClusterOutputLocation`.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
-         "required": true,
-         "location": "path"
-        },
-        "clusterName": {
-         "type": "string",
-         "description": "[Required] The cluster name.",
-         "required": true,
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "projectId",
-        "clusterName"
-       ],
-       "request": {
-        "$ref": "DiagnoseClusterRequest"
-       },
-       "response": {
-        "$ref": "Operation"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
       }
-     }
     },
-    "jobs": {
-     "methods": {
-      "submit": {
-       "id": "dataproc.projects.jobs.submit",
-       "path": "v1beta1/projects/{projectId}/jobs:submit",
-       "httpMethod": "POST",
-       "description": "Submits a job to a cluster.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-         "required": true,
-         "location": "path"
+    "NodeInitializationAction": {
+      "type": "object",
+      "properties": {
+        "executableFile": {
+          "description": "Required Google Cloud Storage URI of executable file.",
+          "type": "string"
+        },
+        "executionTimeout": {
+          "description": "Optional Amount of time executable has to complete. Default is 10 minutes. Cluster creation fails with an explanatory error message (the name of the executable that caused the error and the exceeded timeout period) if the executable is not completed at end of the timeout period.",
+          "format": "google-duration",
+          "type": "string"
         }
-       },
-       "parameterOrder": [
-        "projectId"
-       ],
-       "request": {
-        "$ref": "SubmitJobRequest"
-       },
-       "response": {
-        "$ref": "Job"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
       },
-      "get": {
-       "id": "dataproc.projects.jobs.get",
-       "path": "v1beta1/projects/{projectId}/jobs/{jobId}",
-       "httpMethod": "GET",
-       "description": "Gets the resource representation for a job in a project.",
-       "parameters": {
+      "id": "NodeInitializationAction",
+      "description": "Specifies an executable to run on a fully configured node and a timeout period for executable completion."
+    },
+    "CancelJobRequest": {
+      "type": "object",
+      "properties": {},
+      "id": "CancelJobRequest",
+      "description": "A request to cancel a job."
+    },
+    "SparkSqlJob": {
+      "properties": {
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to be added to the Spark CLASSPATH.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "scriptVariables": {
+          "description": "Optional Mapping of query variable names to values (equivalent to the Spark SQL command: SET name=\"value\";).",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "loggingConfiguration": {
+          "$ref": "LoggingConfiguration",
+          "description": "Optional The runtime log configuration for job execution."
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional A mapping of property names to values, used to configure Spark SQL's SparkConf. Properties that conflict with values set by the Cloud Dataproc API may be overwritten.",
+          "type": "object"
+        },
+        "queryList": {
+          "description": "A list of queries.",
+          "$ref": "QueryList"
+        },
+        "queryFileUri": {
+          "description": "The HCFS URI of the script that contains SQL queries.",
+          "type": "string"
+        }
+      },
+      "id": "SparkSqlJob",
+      "description": "A Cloud Dataproc job for running Spark SQL queries.",
+      "type": "object"
+    },
+    "Cluster": {
+      "description": "Describes the identifying information, configuration, and status of a cluster of Google Compute Engine instances.",
+      "type": "object",
+      "properties": {
+        "metrics": {
+          "$ref": "ClusterMetrics",
+          "description": "Contains cluster daemon metrics such as HDFS and YARN stats."
+        },
+        "status": {
+          "$ref": "ClusterStatus",
+          "description": "Output-only Cluster status."
+        },
+        "statusHistory": {
+          "type": "array",
+          "items": {
+            "$ref": "ClusterStatus"
+          },
+          "description": "Output-only Previous cluster statuses."
+        },
+        "clusterName": {
+          "description": "Required The cluster name. Cluster names within a project must be unique. Names from deleted clusters can be reused.",
+          "type": "string"
+        },
+        "clusterUuid": {
+          "description": "Output-only A cluster UUID (Unique Universal Identifier). Cloud Dataproc generates this value when it creates the cluster.",
+          "type": "string"
+        },
         "projectId": {
-         "type": "string",
-         "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-         "required": true,
-         "location": "path"
+          "type": "string",
+          "description": "Required The Google Cloud Platform project ID that the cluster belongs to."
+        },
+        "configuration": {
+          "description": "Required The cluster configuration. Note that Cloud Dataproc may set default values, and values may change when clusters are updated.",
+          "$ref": "ClusterConfiguration"
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional The labels to associate with this cluster.Label keys must be between 1 and 63 characters long, and must conform to the following PCRE regular expression: \\p{Ll}\\p{Lo}{0,62}Label values must be between 1 and 63 characters long, and must conform to the following PCRE regular expression: \\p{Ll}\\p{Lo}\\p{N}_-{0,63}No more than 64 labels can be associated with a given cluster.",
+          "type": "object"
+        }
+      },
+      "id": "Cluster"
+    },
+    "ListOperationsResponse": {
+      "properties": {
+        "nextPageToken": {
+          "description": "The standard List next-page token.",
+          "type": "string"
+        },
+        "operations": {
+          "description": "A list of operations that matches the specified filter in the request.",
+          "type": "array",
+          "items": {
+            "$ref": "Operation"
+          }
+        }
+      },
+      "id": "ListOperationsResponse",
+      "description": "The response message for Operations.ListOperations.",
+      "type": "object"
+    },
+    "OperationMetadata": {
+      "description": "Metadata describing the operation.",
+      "type": "object",
+      "properties": {
+        "innerState": {
+          "description": "A message containing the detailed operation state.",
+          "type": "string"
+        },
+        "endTime": {
+          "description": "The time that the operation completed.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "startTime": {
+          "description": "The time that the operation was started by the server.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "warnings": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "Output-only Errors encountered during operation execution."
+        },
+        "insertTime": {
+          "description": "The time that the operation was requested.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "statusHistory": {
+          "description": "Output-only Previous operation status.",
+          "type": "array",
+          "items": {
+            "$ref": "OperationStatus"
+          }
+        },
+        "operationType": {
+          "description": "Output-only The operation type.",
+          "type": "string"
+        },
+        "description": {
+          "description": "Output-only Short description of operation.",
+          "type": "string"
+        },
+        "status": {
+          "$ref": "OperationStatus",
+          "description": "Output-only Current operation status."
+        },
+        "state": {
+          "enum": [
+            "UNKNOWN",
+            "PENDING",
+            "RUNNING",
+            "DONE"
+          ],
+          "description": "A message containing the operation state.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unused.",
+            "The operation has been created.",
+            "The operation is currently running.",
+            "The operation is done, either cancelled or completed."
+          ]
+        },
+        "details": {
+          "description": "A message containing any operation metadata details.",
+          "type": "string"
+        },
+        "clusterUuid": {
+          "description": "Cluster UUId for the operation.",
+          "type": "string"
+        },
+        "clusterName": {
+          "description": "Name of the cluster for the operation.",
+          "type": "string"
+        }
+      },
+      "id": "OperationMetadata"
+    },
+    "JobPlacement": {
+      "description": "Cloud Dataproc job configuration.",
+      "type": "object",
+      "properties": {
+        "clusterName": {
+          "description": "Required The name of the cluster where the job will be submitted.",
+          "type": "string"
+        },
+        "clusterUuid": {
+          "description": "Output-only A cluster UUID generated by the Dataproc service when the job is submitted.",
+          "type": "string"
+        }
+      },
+      "id": "JobPlacement"
+    },
+    "PigJob": {
+      "properties": {
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to add to the CLASSPATH of the Pig Client and Hadoop MapReduce (MR) tasks. Can contain Pig UDFs.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "scriptVariables": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional Mapping of query variable names to values (equivalent to the Pig command: name=[value]).",
+          "type": "object"
+        },
+        "loggingConfiguration": {
+          "description": "Optional The runtime log configuration for job execution.",
+          "$ref": "LoggingConfiguration"
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional A mapping of property names to values, used to configure Pig. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/pig/conf/pig.properties, and classes in user code.",
+          "type": "object"
+        },
+        "continueOnFailure": {
+          "description": "Optional Whether to continue executing queries if a query fails. The default value is false. Setting to true can be useful when executing independent parallel queries.",
+          "type": "boolean"
+        },
+        "queryList": {
+          "$ref": "QueryList",
+          "description": "A list of queries."
+        },
+        "queryFileUri": {
+          "description": "The HCFS URI of the script that contains the Pig queries.",
+          "type": "string"
+        }
+      },
+      "id": "PigJob",
+      "description": "A Cloud Dataproc job for running Pig queries on YARN.",
+      "type": "object"
+    },
+    "ClusterStatus": {
+      "type": "object",
+      "properties": {
+        "stateStartTime": {
+          "type": "string",
+          "description": "Time when this state was entered.",
+          "format": "google-datetime"
+        },
+        "detail": {
+          "type": "string",
+          "description": "Optional details of cluster's state."
+        },
+        "state": {
+          "description": "The cluster's state.",
+          "type": "string",
+          "enumDescriptions": [
+            "The cluster state is unknown.",
+            "The cluster is being created and set up. It is not ready for use.",
+            "The cluster is currently running and healthy. It is ready for use.",
+            "The cluster encountered an error. It is not ready for use.",
+            "The cluster is being deleted. It cannot be used.",
+            "The cluster is being updated. It continues to accept and process jobs."
+          ],
+          "enum": [
+            "UNKNOWN",
+            "CREATING",
+            "RUNNING",
+            "ERROR",
+            "DELETING",
+            "UPDATING"
+          ]
+        }
+      },
+      "id": "ClusterStatus",
+      "description": "The status of a cluster and its instances."
+    },
+    "ManagedGroupConfiguration": {
+      "properties": {
+        "instanceGroupManagerName": {
+          "description": "Output-only The name of the Instance Group Manager for this group.",
+          "type": "string"
+        },
+        "instanceTemplateName": {
+          "description": "Output-only The name of the Instance Template used for the Managed Instance Group.",
+          "type": "string"
+        }
+      },
+      "id": "ManagedGroupConfiguration",
+      "description": "Specifies the resources used to actively manage an instance group.",
+      "type": "object"
+    },
+    "ListClustersResponse": {
+      "type": "object",
+      "properties": {
+        "clusters": {
+          "description": "Output-only The clusters in the project.",
+          "type": "array",
+          "items": {
+            "$ref": "Cluster"
+          }
+        },
+        "nextPageToken": {
+          "description": "The standard List next-page token.",
+          "type": "string"
+        }
+      },
+      "id": "ListClustersResponse",
+      "description": "The list of all clusters in a project."
+    },
+    "Job": {
+      "properties": {
+        "scheduling": {
+          "description": "Optional Job scheduling configuration.",
+          "$ref": "JobScheduling"
+        },
+        "pigJob": {
+          "description": "Job is a Pig job.",
+          "$ref": "PigJob"
+        },
+        "hiveJob": {
+          "description": "Job is a Hive job.",
+          "$ref": "HiveJob"
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional The labels to associate with this job.Label keys must be between 1 and 63 characters long, and must conform to the following regular expression: \\p{Ll}\\p{Lo}{0,62}Label values must be between 1 and 63 characters long, and must conform to the following regular expression: \\p{Ll}\\p{Lo}\\p{N}_-{0,63}No more than 64 labels can be associated with a given job.",
+          "type": "object"
+        },
+        "driverOutputResourceUri": {
+          "description": "Output-only A URI pointing to the location of the stdout of the job's driver program.",
+          "type": "string"
+        },
+        "sparkJob": {
+          "description": "Job is a Spark job.",
+          "$ref": "SparkJob"
+        },
+        "sparkSqlJob": {
+          "$ref": "SparkSqlJob",
+          "description": "Job is a SparkSql job."
+        },
+        "statusHistory": {
+          "description": "Output-only The previous job status.",
+          "type": "array",
+          "items": {
+            "$ref": "JobStatus"
+          }
+        },
+        "yarnApplications": {
+          "description": "Output-only The collection of YARN applications spun up by this job.",
+          "type": "array",
+          "items": {
+            "$ref": "YarnApplication"
+          }
+        },
+        "pysparkJob": {
+          "$ref": "PySparkJob",
+          "description": "Job is a Pyspark job."
+        },
+        "reference": {
+          "description": "Optional The fully qualified reference to the job, which can be used to obtain the equivalent REST path of the job resource. If this property is not specified when a job is created, the server generates a \u003ccode\u003ejob_id\u003c/code\u003e.",
+          "$ref": "JobReference"
+        },
+        "interactive": {
+          "type": "boolean",
+          "description": "Optional If set to true, the driver's stdin will be kept open and driver_input_uri will be set to provide a path at which additional input can be sent to the driver."
+        },
+        "driverInputResourceUri": {
+          "description": "Output-only A URI pointing to the location of the stdin of the job's driver program, only set if the job is interactive.",
+          "type": "string"
+        },
+        "hadoopJob": {
+          "$ref": "HadoopJob",
+          "description": "Job is a Hadoop job."
+        },
+        "placement": {
+          "$ref": "JobPlacement",
+          "description": "Required Job information, including how, when, and where to run the job."
+        },
+        "status": {
+          "$ref": "JobStatus",
+          "description": "Output-only The job status. Additional application-specific status information may be contained in the \u003ccode\u003etype_job\u003c/code\u003e and \u003ccode\u003eyarn_applications\u003c/code\u003e fields."
+        },
+        "driverControlFilesUri": {
+          "description": "Output-only If present, the location of miscellaneous control files which may be used as part of job setup and handling. If not present, control files may be placed in the same location as driver_output_uri.",
+          "type": "string"
+        },
+        "submittedBy": {
+          "description": "Output-only The email address of the user submitting the job. For jobs submitted on the cluster, the address is \u003ccode\u003eusername@hostname\u003c/code\u003e.",
+          "type": "string"
+        }
+      },
+      "id": "Job",
+      "description": "A Cloud Dataproc job resource.",
+      "type": "object"
+    },
+    "SparkJob": {
+      "id": "SparkJob",
+      "description": "A Cloud Dataproc job for running Spark applications on YARN.",
+      "type": "object",
+      "properties": {
+        "mainJarFileUri": {
+          "type": "string",
+          "description": "The Hadoop Compatible Filesystem (HCFS) URI of the jar file that contains the main class."
+        },
+        "jarFileUris": {
+          "description": "Optional HCFS URIs of jar files to add to the CLASSPATHs of the Spark driver and tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "loggingConfiguration": {
+          "description": "Optional The runtime log configuration for job execution.",
+          "$ref": "LoggingConfiguration"
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional A mapping of property names to values, used to configure Spark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code.",
+          "type": "object"
+        },
+        "args": {
+          "description": "Optional The arguments to pass to the driver. Do not include arguments, such as --conf, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "fileUris": {
+          "description": "Optional HCFS URIs of files to be copied to the working directory of Spark drivers and distributed tasks. Useful for naively parallel tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainClass": {
+          "description": "The name of the driver's main class. The jar file that contains the class must be in the default CLASSPATH or specified in jar_file_uris.",
+          "type": "string"
+        },
+        "archiveUris": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "Optional HCFS URIs of archives to be extracted in the working directory of Spark drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, and .zip."
+        }
+      }
+    },
+    "JobStatus": {
+      "description": "Cloud Dataproc job status.",
+      "type": "object",
+      "properties": {
+        "state": {
+          "type": "string",
+          "enumDescriptions": [
+            "The job state is unknown.",
+            "The job is pending; it has been submitted, but is not yet running.",
+            "Job has been received by the service and completed initial setup; it will shortly be submitted to the cluster.",
+            "The job is running on the cluster.",
+            "A CancelJob request has been received, but is pending.",
+            "Transient in-flight resources have been canceled, and the request to cancel the running job has been issued to the cluster.",
+            "The job cancelation was successful.",
+            "The job has completed successfully.",
+            "The job has completed, but encountered an error.",
+            "Job attempt has failed. The detail field contains failure details for this attempt.Applies to restartable jobs only."
+          ],
+          "enum": [
+            "STATE_UNSPECIFIED",
+            "PENDING",
+            "SETUP_DONE",
+            "RUNNING",
+            "CANCEL_PENDING",
+            "CANCEL_STARTED",
+            "CANCELLED",
+            "DONE",
+            "ERROR",
+            "ATTEMPT_FAILURE"
+          ],
+          "description": "Required A state message specifying the overall job state."
+        },
+        "details": {
+          "type": "string",
+          "description": "Optional Job state details, such as an error description if the state is \u003ccode\u003eERROR\u003c/code\u003e."
+        },
+        "stateStartTime": {
+          "description": "Output-only The time when this state was entered.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "JobStatus"
+    },
+    "DiskConfiguration": {
+      "description": "Specifies the configuration of disk options for a group of VM instances.",
+      "type": "object",
+      "properties": {
+        "numLocalSsds": {
+          "type": "integer",
+          "description": "Optional Number of attached SSDs, from 0 to 4 (default is 0). If SSDs are not attached, the boot disk is used to store runtime logs and HDFS data. If one or more SSDs are attached, this runtime bulk data is spread across them, and the boot disk contains only basic configuration and installed binaries.",
+          "format": "int32"
+        },
+        "bootDiskSizeGb": {
+          "description": "Optional Size in GB of the boot disk (default is 500GB).",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "DiskConfiguration"
+    },
+    "ClusterOperationStatus": {
+      "description": "The status of the operation.",
+      "type": "object",
+      "properties": {
+        "state": {
+          "type": "string",
+          "enumDescriptions": [
+            "Unused.",
+            "The operation has been created.",
+            "The operation is running.",
+            "The operation is done; either cancelled or completed."
+          ],
+          "enum": [
+            "UNKNOWN",
+            "PENDING",
+            "RUNNING",
+            "DONE"
+          ],
+          "description": "Output-only A message containing the operation state."
+        },
+        "details": {
+          "description": "Output-onlyA message containing any operation metadata details.",
+          "type": "string"
+        },
+        "innerState": {
+          "description": "Output-only A message containing the detailed operation state.",
+          "type": "string"
+        },
+        "stateStartTime": {
+          "description": "Output-only The time this state was entered.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "ClusterOperationStatus"
+    },
+    "YarnApplication": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "Required The application name.",
+          "type": "string"
+        },
+        "trackingUrl": {
+          "description": "Optional The HTTP URL of the ApplicationMaster, HistoryServer, or TimelineServer that provides application-specific information. The URL uses the internal hostname, and requires a proxy server for resolution and, possibly, access.",
+          "type": "string"
+        },
+        "progress": {
+          "description": "Required The numerical progress of the application, from 1 to 100.",
+          "format": "float",
+          "type": "number"
+        },
+        "state": {
+          "description": "Required The application state.",
+          "type": "string",
+          "enumDescriptions": [
+            "Status is unspecified.",
+            "Status is NEW.",
+            "Status is NEW_SAVING.",
+            "Status is SUBMITTED.",
+            "Status is ACCEPTED.",
+            "Status is RUNNING.",
+            "Status is FINISHED.",
+            "Status is FAILED.",
+            "Status is KILLED."
+          ],
+          "enum": [
+            "STATE_UNSPECIFIED",
+            "NEW",
+            "NEW_SAVING",
+            "SUBMITTED",
+            "ACCEPTED",
+            "RUNNING",
+            "FINISHED",
+            "FAILED",
+            "KILLED"
+          ]
+        }
+      },
+      "id": "YarnApplication",
+      "description": "A YARN application created by a job. Application information is a subset of \u003ccode\u003eorg.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto\u003c/code\u003e."
+    },
+    "QueryList": {
+      "id": "QueryList",
+      "description": "A list of queries to run on a cluster.",
+      "type": "object",
+      "properties": {
+        "queries": {
+          "description": "Required The queries to execute. You do not need to terminate a query with a semicolon. Multiple queries can be specified in one string by separating each with a semicolon. Here is an example of an Cloud Dataproc API snippet that uses a QueryList to specify a HiveJob:\n\"hiveJob\": {\n  \"queryList\": {\n    \"queries\": [\n      \"query1\",\n      \"query2\",\n      \"query3;query4\",\n    ]\n  }\n}\n",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "HadoopJob": {
+      "description": "A Cloud Dataproc job for running Hadoop MapReduce jobs on YARN.",
+      "type": "object",
+      "properties": {
+        "args": {
+          "description": "Optional The arguments to pass to the driver. Do not include arguments, such as -libjars or -Dfoo=bar, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "fileUris": {
+          "description": "Optional HCFS URIs of files to be copied to the working directory of Hadoop drivers and distributed tasks. Useful for naively parallel tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainClass": {
+          "description": "The name of the driver's main class. The jar file containing the class must be in the default CLASSPATH or specified in jar_file_uris.",
+          "type": "string"
+        },
+        "archiveUris": {
+          "description": "Optional HCFS URIs of archives to be extracted in the working directory of Hadoop drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, or .zip.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainJarFileUri": {
+          "description": "The Hadoop Compatible Filesystem (HCFS) URI of the jar file containing the main class. Examples:  'gs://foo-bucket/analytics-binaries/extract-useful-metrics-mr.jar'  'hdfs:/tmp/test-samples/custom-wordcount.jar'  'file:///home/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar'",
+          "type": "string"
+        },
+        "jarFileUris": {
+          "description": "Optional Jar file URIs to add to the CLASSPATHs of the Hadoop driver and tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "loggingConfiguration": {
+          "description": "Optional The runtime log configuration for job execution.",
+          "$ref": "LoggingConfiguration"
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional A mapping of property names to values, used to configure Hadoop. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site and classes in user code.",
+          "type": "object"
+        }
+      },
+      "id": "HadoopJob"
+    },
+    "DiagnoseClusterRequest": {
+      "properties": {},
+      "id": "DiagnoseClusterRequest",
+      "description": "A request to collect cluster diagnostic information.",
+      "type": "object"
+    },
+    "ClusterOperationMetadata": {
+      "description": "Metadata describing the operation.",
+      "type": "object",
+      "properties": {
+        "status": {
+          "description": "Output-only Current operation status.",
+          "$ref": "ClusterOperationStatus"
+        },
+        "statusHistory": {
+          "type": "array",
+          "items": {
+            "$ref": "ClusterOperationStatus"
+          },
+          "description": "Output-only The previous operation status."
+        },
+        "clusterName": {
+          "description": "Output-only Name of the cluster for the operation.",
+          "type": "string"
+        },
+        "clusterUuid": {
+          "description": "Output-only Cluster UUID for the operation.",
+          "type": "string"
+        },
+        "operationType": {
+          "description": "Output-only The operation type.",
+          "type": "string"
+        },
+        "description": {
+          "description": "Output-only Short description of operation.",
+          "type": "string"
+        },
+        "warnings": {
+          "description": "Output-only Errors encountered during operation execution.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Output-only Labels associated with the operation",
+          "type": "object"
+        }
+      },
+      "id": "ClusterOperationMetadata"
+    },
+    "Empty": {
+      "properties": {},
+      "id": "Empty",
+      "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:\nservice Foo {\n  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n}\nThe JSON representation for Empty is empty JSON object {}.",
+      "type": "object"
+    },
+    "HiveJob": {
+      "description": "A Cloud Dataproc job for running Hive queries on YARN.",
+      "type": "object",
+      "properties": {
+        "continueOnFailure": {
+          "description": "Optional Whether to continue executing queries if a query fails. The default value is false. Setting to true can be useful when executing independent parallel queries.",
+          "type": "boolean"
+        },
+        "queryList": {
+          "description": "A list of queries.",
+          "$ref": "QueryList"
+        },
+        "queryFileUri": {
+          "description": "The HCFS URI of the script that contains Hive queries.",
+          "type": "string"
+        },
+        "jarFileUris": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "Optional HCFS URIs of jar files to add to the CLASSPATH of the Hive server and Hadoop MapReduce (MR) tasks. Can contain Hive SerDes and UDFs."
+        },
+        "scriptVariables": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional Mapping of query variable names to values (equivalent to the Hive command: SET name=\"value\";).",
+          "type": "object"
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional A mapping of property names and values, used to configure Hive. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/hive/conf/hive-site.xml, and classes in user code.",
+          "type": "object"
+        }
+      },
+      "id": "HiveJob"
+    },
+    "DiagnoseClusterResults": {
+      "type": "object",
+      "properties": {
+        "outputUri": {
+          "description": "Output-only The Google Cloud Storage URI of the diagnostic output. The output report is a plain text file with a summary of collected diagnostics.",
+          "type": "string"
+        }
+      },
+      "id": "DiagnoseClusterResults",
+      "description": "The location of diagnostic output."
+    },
+    "SoftwareConfiguration": {
+      "properties": {
+        "imageVersion": {
+          "description": "Optional The version of software inside the cluster. It must match the regular expression [0-9]+\\.[0-9]+. If unspecified, it defaults to the latest version (see Cloud Dataproc Versioning).",
+          "type": "string"
+        },
+        "properties": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional The properties to set on daemon configuration files.Property keys are specified in \"prefix:property\" format, such as \"core:fs.defaultFS\". The following are supported prefixes and their mappings:  core - core-site.xml  hdfs - hdfs-site.xml  mapred - mapred-site.xml  yarn - yarn-site.xml  hive - hive-site.xml  pig - pig.properties  spark - spark-defaults.conf",
+          "type": "object"
+        }
+      },
+      "id": "SoftwareConfiguration",
+      "description": "Specifies the selection and configuration of software inside the cluster.",
+      "type": "object"
+    },
+    "PySparkJob": {
+      "description": "A Cloud Dataproc job for running PySpark applications on YARN.",
+      "type": "object",
+      "properties": {
+        "pythonFileUris": {
+          "description": "Optional HCFS file URIs of Python files to pass to the PySpark framework. Supported file types: .py, .egg, and .zip.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "mainPythonFileUri": {
+          "description": "Required The Hadoop Compatible Filesystem (HCFS) URI of the main Python file to use as the driver. Must be a .py file.",
+          "type": "string"
+        },
+        "archiveUris": {
+          "description": "Optional HCFS URIs of archives to be extracted in the working directory of .jar, .tar, .tar.gz, .tgz, and .zip.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "jarFileUris": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "Optional HCFS URIs of jar files to add to the CLASSPATHs of the Python driver and tasks."
+        },
+        "loggingConfiguration": {
+          "$ref": "LoggingConfiguration",
+          "description": "Optional The runtime log configuration for job execution."
+        },
+        "properties": {
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional A mapping of property names to values, used to configure PySpark. Properties that conflict with values set by the Cloud Dataproc API may be overwritten. Can include properties set in /etc/spark/conf/spark-defaults.conf and classes in user code."
+        },
+        "args": {
+          "description": "Optional The arguments to pass to the driver. Do not include arguments, such as --conf, that can be set as job properties, since a collision may occur that causes an incorrect job submission.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "fileUris": {
+          "description": "Optional HCFS URIs of files to be copied to the working directory of Python drivers and distributed tasks. Useful for naively parallel tasks.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "PySparkJob"
+    },
+    "ClusterMetrics": {
+      "description": "Contains cluster daemon metrics, such as HDFS and YARN stats.",
+      "type": "object",
+      "properties": {
+        "yarnMetrics": {
+          "additionalProperties": {
+            "format": "int64",
+            "type": "string"
+          },
+          "description": "The YARN metrics.",
+          "type": "object"
+        },
+        "hdfsMetrics": {
+          "description": "The HDFS metrics.",
+          "type": "object",
+          "additionalProperties": {
+            "format": "int64",
+            "type": "string"
+          }
+        }
+      },
+      "id": "ClusterMetrics"
+    },
+    "ClusterConfiguration": {
+      "description": "The cluster configuration.",
+      "type": "object",
+      "properties": {
+        "initializationActions": {
+          "description": "Optional Commands to execute on each node after configuration is completed. By default, executables are run on master and all worker nodes. You can test a node's \u003ccode\u003erole\u003c/code\u003e metadata to run an executable on a master or worker node, as shown below:\nROLE=$(/usr/share/google/get_metadata_value attributes/role)\nif [[ \"${ROLE}\" == 'Master' ]]; then\n  ... master specific actions ...\nelse\n  ... worker specific actions ...\nfi\n",
+          "type": "array",
+          "items": {
+            "$ref": "NodeInitializationAction"
+          }
+        },
+        "workerConfiguration": {
+          "$ref": "InstanceGroupConfiguration",
+          "description": "Optional The Google Compute Engine configuration settings for worker instances in a cluster."
+        },
+        "softwareConfiguration": {
+          "description": "Optional The configuration settings for software inside the cluster.",
+          "$ref": "SoftwareConfiguration"
+        },
+        "gceClusterConfiguration": {
+          "description": "Required The shared Google Compute Engine configuration settings for all instances in a cluster.",
+          "$ref": "GceClusterConfiguration"
+        },
+        "configurationBucket": {
+          "description": "Optional A Google Cloud Storage staging bucket used for sharing generated SSH keys and configuration. If you do not specify a staging bucket, Cloud Dataproc will determine an appropriate Cloud Storage location (US, ASIA, or EU) for your cluster's staging bucket according to the Google Compute Engine zone where your cluster is deployed, and then it will create and manage this project-level, per-location bucket for you.",
+          "type": "string"
+        },
+        "masterConfiguration": {
+          "description": "Optional The Google Compute Engine configuration settings for the master instance in a cluster.",
+          "$ref": "InstanceGroupConfiguration"
+        },
+        "secondaryWorkerConfiguration": {
+          "$ref": "InstanceGroupConfiguration",
+          "description": "Optional The Google Compute Engine configuration settings for additional worker instances in a cluster."
+        }
+      },
+      "id": "ClusterConfiguration"
+    },
+    "LoggingConfiguration": {
+      "properties": {
+        "driverLogLevels": {
+          "description": "The per-package log levels for the driver. This may include \"root\" package name to configure rootLogger. Examples:  'com.google = FATAL', 'root = INFO', 'org.apache = DEBUG'",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string",
+            "enum": [
+              "LEVEL_UNSPECIFIED",
+              "ALL",
+              "TRACE",
+              "DEBUG",
+              "INFO",
+              "WARN",
+              "ERROR",
+              "FATAL",
+              "OFF"
+            ]
+          }
+        }
+      },
+      "id": "LoggingConfiguration",
+      "description": "The runtime logging configuration of the job.",
+      "type": "object"
+    },
+    "InstanceGroupConfiguration": {
+      "description": "The configuration settings for Google Compute Engine resources in an instance group, such as a master or worker group.",
+      "type": "object",
+      "properties": {
+        "diskConfiguration": {
+          "description": "Disk option configuration settings.",
+          "$ref": "DiskConfiguration"
+        },
+        "isPreemptible": {
+          "description": "Specifies that this instance group contains Preemptible Instances.",
+          "type": "boolean"
+        },
+        "imageUri": {
+          "description": "Output-only The Google Compute Engine image resource used for cluster instances. Inferred from SoftwareConfiguration.image_version.",
+          "type": "string"
+        },
+        "machineTypeUri": {
+          "description": "The Google Compute Engine machine type used for cluster instances. Example: https://www.googleapis.com/compute/v1/projects/[project_id]/zones/us-east1-a/machineTypes/n1-standard-2.",
+          "type": "string"
+        },
+        "managedGroupConfiguration": {
+          "$ref": "ManagedGroupConfiguration",
+          "description": "Output-only The configuration for Google Compute Engine Instance Group Manager that manages this group. This is only used for preemptible instance groups."
+        },
+        "instanceNames": {
+          "description": "The list of instance names. Dataproc derives the names from cluster_name, num_instances, and the instance group if not set by user (recommended practice is to let Dataproc derive the name).",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "numInstances": {
+          "description": "The number of VM instances in the instance group. For master instance groups, must be set to 1.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "InstanceGroupConfiguration"
+    },
+    "GceClusterConfiguration": {
+      "description": "Common configuration settings for resources of Google Compute Engine cluster instances, applicable to all instances in the cluster.",
+      "type": "object",
+      "properties": {
+        "serviceAccountScopes": {
+          "description": "The URIs of service account scopes to be included in Google Compute Engine instances. The following base set of scopes is always included: - https://www.googleapis.com/auth/cloud.useraccounts.readonly - https://www.googleapis.com/auth/devstorage.read_write - https://www.googleapis.com/auth/logging.write If no scopes are specfied, the following defaults are also provided: - https://www.googleapis.com/auth/bigquery - https://www.googleapis.com/auth/bigtable.admin.table - https://www.googleapis.com/auth/bigtable.data - https://www.googleapis.com/auth/devstorage.full_control",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "tags": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "The Google Compute Engine tags to add to all instances."
+        },
+        "serviceAccount": {
+          "description": "Optional The service account of the instances. Defaults to the default Google Compute Engine service account. Custom service accounts need permissions equivalent to the folloing IAM roles:\nroles/logging.logWriter\nroles/storage.objectAdmin(see https://cloud.google.com/compute/docs/access/service-accounts#custom_service_accounts for more information). Example: [account_id]@[project_id].iam.gserviceaccount.com",
+          "type": "string"
+        },
+        "subnetworkUri": {
+          "description": "The Google Compute Engine subnetwork to be used for machine communications. Cannot be specified with network_uri. Example: https://www.googleapis.com/compute/v1/projects/[project_id]/regions/us-east1/sub0.",
+          "type": "string"
+        },
+        "networkUri": {
+          "description": "The Google Compute Engine network to be used for machine communications. Cannot be specified with subnetwork_uri. If neither network_uri nor subnetwork_uri is specified, the \"default\" network of the project is used, if it exists. Cannot be a \"Custom Subnet Network\" (see https://cloud.google.com/compute/docs/subnetworks for more information). Example: https://www.googleapis.com/compute/v1/projects/[project_id]/regions/global/default.",
+          "type": "string"
+        },
+        "zoneUri": {
+          "description": "Required The zone where the Google Compute Engine cluster will be located. Example: https://www.googleapis.com/compute/v1/projects/[project_id]/zones/[zone].",
+          "type": "string"
+        },
+        "internalIpOnly": {
+          "description": "If true, all instances in the cluser will only have internal IP addresses. By default, clusters are not restricted to internal IP addresses, and will have ephemeral external IP addresses assigned to each instance. This restriction can only be enabled for subnetwork enabled networks, and all off-cluster dependencies must be configured to be accessible without external IP addresses.",
+          "type": "boolean"
+        },
+        "metadata": {
+          "description": "The Google Compute Engine metadata entries to add to all instances.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "GceClusterConfiguration"
+    },
+    "CancelOperationRequest": {
+      "description": "The request message for Operations.CancelOperation.",
+      "type": "object",
+      "properties": {},
+      "id": "CancelOperationRequest"
+    },
+    "DiagnoseClusterOutputLocation": {
+      "properties": {
+        "outputUri": {
+          "description": "Output-only The Google Cloud Storage URI of the diagnostic output. This will be a plain text file with summary of collected diagnostics.",
+          "type": "string"
+        }
+      },
+      "id": "DiagnoseClusterOutputLocation",
+      "description": "The location where output from diagnostic command can be found.",
+      "type": "object"
+    },
+    "Operation": {
+      "description": "This resource represents a long-running operation that is the result of a network API call.",
+      "type": "object",
+      "properties": {
+        "done": {
+          "description": "If the value is false, it means the operation is still in progress. If true, the operation is completed, and either error or response is available.",
+          "type": "boolean"
+        },
+        "response": {
+          "additionalProperties": {
+            "type": "any",
+            "description": "Properties of the object. Contains field @type with type URL."
+          },
+          "description": "The normal response of the operation in case of success. If the original method returns no data on success, such as Delete, the response is google.protobuf.Empty. If the original method is standard Get/Create/Update, the response should be the resource. For other methods, the response should have the type XxxResponse, where Xxx is the original method name. For example, if the original method name is TakeSnapshot(), the inferred response type is TakeSnapshotResponse.",
+          "type": "object"
+        },
+        "name": {
+          "description": "The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the name should have the format of operations/some/unique/name.",
+          "type": "string"
+        },
+        "error": {
+          "$ref": "Status",
+          "description": "The error result of the operation in case of failure or cancellation."
+        },
+        "metadata": {
+          "description": "Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.",
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          }
+        }
+      },
+      "id": "Operation"
+    },
+    "OperationStatus": {
+      "description": "The status of the operation.",
+      "type": "object",
+      "properties": {
+        "state": {
+          "enumDescriptions": [
+            "Unused.",
+            "The operation has been created.",
+            "The operation is running.",
+            "The operation is done; either cancelled or completed."
+          ],
+          "enum": [
+            "UNKNOWN",
+            "PENDING",
+            "RUNNING",
+            "DONE"
+          ],
+          "description": "A message containing the operation state.",
+          "type": "string"
+        },
+        "details": {
+          "description": "A message containing any operation metadata details.",
+          "type": "string"
+        },
+        "innerState": {
+          "description": "A message containing the detailed operation state.",
+          "type": "string"
+        },
+        "stateStartTime": {
+          "description": "The time this state was entered.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "OperationStatus"
+    },
+    "JobReference": {
+      "type": "object",
+      "properties": {
+        "projectId": {
+          "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+          "type": "string"
         },
         "jobId": {
-         "type": "string",
-         "description": "[Required] The job ID.",
-         "required": true,
-         "location": "path"
+          "description": "Required The job ID, which must be unique within the project. The job ID is generated by the server upon job submission or provided by the user as a means to perform retries without creating duplicate jobs. The ID must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), or hyphens (-). The maximum length is 512 characters.",
+          "type": "string"
         }
-       },
-       "parameterOrder": [
-        "projectId",
-        "jobId"
-       ],
-       "response": {
-        "$ref": "Job"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
       },
-      "list": {
-       "id": "dataproc.projects.jobs.list",
-       "path": "v1beta1/projects/{projectId}/jobs",
-       "httpMethod": "GET",
-       "description": "Lists jobs in a project.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-         "required": true,
-         "location": "path"
-        },
-        "pageSize": {
-         "type": "integer",
-         "description": "[Optional] The number of results to return in each response.",
-         "format": "int32",
-         "location": "query"
-        },
-        "pageToken": {
-         "type": "string",
-         "description": "[Optional] The page token, returned by a previous call, to request the next page of results.",
-         "location": "query"
-        },
-        "clusterName": {
-         "type": "string",
-         "description": "[Optional] If set, the returned jobs list includes only jobs that were submitted to the named cluster.",
-         "location": "query"
-        },
-        "jobStateMatcher": {
-         "type": "string",
-         "description": "[Optional] Specifies enumerated categories of jobs to list.",
-         "enum": [
-          "ALL",
-          "ACTIVE",
-          "NON_ACTIVE"
-         ],
-         "location": "query"
-        },
-        "filter": {
-         "type": "string",
-         "description": "[Optional] A filter constraining which jobs to list. Valid filters contain job state and label terms such as: labels.key1 = val1 AND (labels.k2 = val2 OR labels.k3 = val3)",
-         "location": "query"
+      "id": "JobReference",
+      "description": "Encapsulates the full scoping used to reference a job."
+    },
+    "SubmitJobRequest": {
+      "description": "A request to submit a job.",
+      "type": "object",
+      "properties": {
+        "job": {
+          "$ref": "Job",
+          "description": "Required The job resource."
         }
-       },
-       "parameterOrder": [
-        "projectId"
-       ],
-       "response": {
-        "$ref": "ListJobsResponse"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
       },
-      "cancel": {
-       "id": "dataproc.projects.jobs.cancel",
-       "path": "v1beta1/projects/{projectId}/jobs/{jobId}:cancel",
-       "httpMethod": "POST",
-       "description": "Starts a job cancellation request. To access the job resource after cancellation, call [jobs.list](/dataproc/reference/rest/v1beta1/projects.jobs/list) or [jobs.get](/dataproc/reference/rest/v1beta1/projects.jobs/get).",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-         "required": true,
-         "location": "path"
+      "id": "SubmitJobRequest"
+    },
+    "Status": {
+      "id": "Status",
+      "description": "The Status type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by gRPC (https://github.com/grpc). The error model is designed to be:\nSimple to use and understand for most users\nFlexible enough to meet unexpected needsOverviewThe Status message contains three pieces of data: error code, error message, and error details. The error code should be an enum value of google.rpc.Code, but it may accept additional error codes if needed. The error message should be a developer-facing English message that helps developers understand and resolve the error. If a localized user-facing error message is needed, put the localized message in the error details or localize it in the client. The optional error details may contain arbitrary information about the error. There is a predefined set of error detail types in the package google.rpc which can be used for common error conditions.Language mappingThe Status message is the logical representation of the error model, but it is not necessarily the actual wire format. When the Status message is exposed in different client libraries and different wire protocols, it can be mapped differently. For example, it will likely be mapped to some exceptions in Java, but more likely mapped to some error codes in C.Other usesThe error model and the Status message can be used in a variety of environments, either with or without APIs, to provide a consistent developer experience across different environments.Example uses of this error model include:\nPartial errors. If a service needs to return partial errors to the client, it may embed the Status in the normal response to indicate the partial errors.\nWorkflow errors. A typical workflow has multiple steps. Each step may have a Status message for error reporting purpose.\nBatch operations. If a client uses batch request and batch response, the Status message should be used directly inside batch response, one for each error sub-response.\nAsynchronous operations. If an API call embeds asynchronous operation results in its response, the status of those operations should be represented directly using the Status message.\nLogging. If some API errors are stored in logs, the message Status could be used directly after any stripping needed for security/privacy reasons.",
+      "type": "object",
+      "properties": {
+        "code": {
+          "description": "The status code, which should be an enum value of google.rpc.Code.",
+          "format": "int32",
+          "type": "integer"
         },
-        "jobId": {
-         "type": "string",
-         "description": "[Required] The job ID.",
-         "required": true,
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "projectId",
-        "jobId"
-       ],
-       "request": {
-        "$ref": "CancelJobRequest"
-       },
-       "response": {
-        "$ref": "Job"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "delete": {
-       "id": "dataproc.projects.jobs.delete",
-       "path": "v1beta1/projects/{projectId}/jobs/{jobId}",
-       "httpMethod": "DELETE",
-       "description": "Deletes the job from the project. If the job is active, the delete fails, and the response returns `FAILED_PRECONDITION`.",
-       "parameters": {
-        "projectId": {
-         "type": "string",
-         "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
-         "required": true,
-         "location": "path"
+        "message": {
+          "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.",
+          "type": "string"
         },
-        "jobId": {
-         "type": "string",
-         "description": "[Required] The job ID.",
-         "required": true,
-         "location": "path"
+        "details": {
+          "type": "array",
+          "items": {
+            "additionalProperties": {
+              "description": "Properties of the object. Contains field @type with type URL.",
+              "type": "any"
+            },
+            "type": "object"
+          },
+          "description": "A list of messages that carry the error details. There will be a common set of message types for APIs to use."
         }
-       },
-       "parameterOrder": [
-        "projectId",
-        "jobId"
-       ],
-       "response": {
-        "$ref": "Empty"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
       }
-     }
     }
-   }
   },
-  "operations": {
-   "methods": {
-    "get": {
-     "id": "dataproc.operations.get",
-     "path": "v1beta1/{+name}",
-     "httpMethod": "GET",
-     "description": "Gets the latest state of a long-running operation. Clients can use this method to poll the operation result at intervals as recommended by the API service.",
-     "parameters": {
-      "name": {
-       "type": "string",
-       "description": "The name of the operation resource.",
-       "required": true,
-       "pattern": "^operations/.+$",
-       "location": "path"
+  "protocol": "rest",
+  "icons": {
+    "x32": "http://www.google.com/images/icons/product/search-32.gif",
+    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+  },
+  "version": "v1beta1",
+  "baseUrl": "https://dataproc.googleapis.com/",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
       }
-     },
-     "parameterOrder": [
-      "name"
-     ],
-     "response": {
-      "$ref": "Operation"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform"
-     ]
-    },
-    "list": {
-     "id": "dataproc.operations.list",
-     "path": "v1beta1/{+name}",
-     "httpMethod": "GET",
-     "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns `UNIMPLEMENTED`. NOTE: the `name` binding below allows API services to override the binding to use different resource name schemes, such as `users/*/operations`.",
-     "parameters": {
-      "name": {
-       "type": "string",
-       "description": "The name of the operation collection.",
-       "required": true,
-       "pattern": "^operations$",
-       "location": "path"
-      },
-      "filter": {
-       "type": "string",
-       "description": "The standard list filter.",
-       "location": "query"
-      },
-      "pageSize": {
-       "type": "integer",
-       "description": "The standard list page size.",
-       "format": "int32",
-       "location": "query"
-      },
-      "pageToken": {
-       "type": "string",
-       "description": "The standard list page token.",
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "name"
-     ],
-     "response": {
-      "$ref": "ListOperationsResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform"
-     ]
-    },
-    "cancel": {
-     "id": "dataproc.operations.cancel",
-     "path": "v1beta1/{+name}:cancel",
-     "httpMethod": "POST",
-     "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`. Clients can use [operations.get](/dataproc/reference/rest/v1beta1/operations/get) or other methods to check whether the cancellation succeeded or whether the operation completed despite cancellation.",
-     "parameters": {
-      "name": {
-       "type": "string",
-       "description": "The name of the operation resource to be cancelled.",
-       "required": true,
-       "pattern": "^operations/.+$",
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "name"
-     ],
-     "request": {
-      "$ref": "CancelOperationRequest"
-     },
-     "response": {
-      "$ref": "Empty"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform"
-     ]
-    },
-    "delete": {
-     "id": "dataproc.operations.delete",
-     "path": "v1beta1/{+name}",
-     "httpMethod": "DELETE",
-     "description": "Deletes a long-running operation. This method indicates that the client is no longer interested in the operation result. It does not cancel the operation. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`.",
-     "parameters": {
-      "name": {
-       "type": "string",
-       "description": "The name of the operation resource to be deleted.",
-       "required": true,
-       "pattern": "^operations/.+$",
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "name"
-     ],
-     "response": {
-      "$ref": "Empty"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform"
-     ]
     }
-   }
-  }
- }
+  },
+  "description": "Manages Hadoop-based clusters and jobs on Google Cloud Platform.",
+  "servicePath": "",
+  "kind": "discovery#restDescription",
+  "rootUrl": "https://dataproc.googleapis.com/",
+  "basePath": ""
 }
diff --git a/dataproc/v1beta1/dataproc-gen.go b/dataproc/v1beta1/dataproc-gen.go
index 80645db..8fc189f 100644
--- a/dataproc/v1beta1/dataproc-gen.go
+++ b/dataproc/v1beta1/dataproc-gen.go
@@ -62,9 +62,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Operations *OperationsService
 
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewOperationsService(s *Service) *OperationsService {
 	rs := &OperationsService{s: s}
 	return rs
@@ -132,39 +137,39 @@
 // Cluster: Describes the identifying information, configuration, and
 // status of a cluster of Google Compute Engine instances.
 type Cluster struct {
-	// ClusterName: [Required] The cluster name. Cluster names within a
+	// ClusterName: Required The cluster name. Cluster names within a
 	// project must be unique. Names from deleted clusters can be reused.
 	ClusterName string `json:"clusterName,omitempty"`
 
-	// ClusterUuid: [Output-only] A cluster UUID (Unique Universal
+	// ClusterUuid: Output-only A cluster UUID (Unique Universal
 	// Identifier). Cloud Dataproc generates this value when it creates the
 	// cluster.
 	ClusterUuid string `json:"clusterUuid,omitempty"`
 
-	// Configuration: [Required] The cluster configuration. Note that Cloud
+	// Configuration: Required The cluster configuration. Note that Cloud
 	// Dataproc may set default values, and values may change when clusters
 	// are updated.
 	Configuration *ClusterConfiguration `json:"configuration,omitempty"`
 
-	// Labels: [Optional] The labels to associate with this cluster. Label
-	// keys must be between 1 and 63 characters long, and must conform to
-	// the following PCRE regular expression: \p{Ll}\p{Lo}{0,62} Label
-	// values must be between 1 and 63 characters long, and must conform to
-	// the following PCRE regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63} No
-	// more than 64 labels can be associated with a given cluster.
+	// Labels: Optional The labels to associate with this cluster.Label keys
+	// must be between 1 and 63 characters long, and must conform to the
+	// following PCRE regular expression: \p{Ll}\p{Lo}{0,62}Label values
+	// must be between 1 and 63 characters long, and must conform to the
+	// following PCRE regular expression: \p{Ll}\p{Lo}\p{N}_-{0,63}No more
+	// than 64 labels can be associated with a given cluster.
 	Labels map[string]string `json:"labels,omitempty"`
 
 	// Metrics: Contains cluster daemon metrics such as HDFS and YARN stats.
 	Metrics *ClusterMetrics `json:"metrics,omitempty"`
 
-	// ProjectId: [Required] The Google Cloud Platform project ID that the
+	// ProjectId: Required The Google Cloud Platform project ID that the
 	// cluster belongs to.
 	ProjectId string `json:"projectId,omitempty"`
 
-	// Status: [Output-only] Cluster status.
+	// Status: Output-only Cluster status.
 	Status *ClusterStatus `json:"status,omitempty"`
 
-	// StatusHistory: [Output-only] Previous cluster statuses.
+	// StatusHistory: Output-only Previous cluster statuses.
 	StatusHistory []*ClusterStatus `json:"statusHistory,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -196,7 +201,7 @@
 
 // ClusterConfiguration: The cluster configuration.
 type ClusterConfiguration struct {
-	// ConfigurationBucket: [Optional] A Google Cloud Storage staging bucket
+	// ConfigurationBucket: Optional A Google Cloud Storage staging bucket
 	// used for sharing generated SSH keys and configuration. If you do not
 	// specify a staging bucket, Cloud Dataproc will determine an
 	// appropriate Cloud Storage location (US, ASIA, or EU) for your
@@ -205,33 +210,38 @@
 	// this project-level, per-location bucket for you.
 	ConfigurationBucket string `json:"configurationBucket,omitempty"`
 
-	// GceClusterConfiguration: [Required] The shared Google Compute Engine
+	// GceClusterConfiguration: Required The shared Google Compute Engine
 	// configuration settings for all instances in a cluster.
 	GceClusterConfiguration *GceClusterConfiguration `json:"gceClusterConfiguration,omitempty"`
 
-	// InitializationActions: [Optional] Commands to execute on each node
+	// InitializationActions: Optional Commands to execute on each node
 	// after configuration is completed. By default, executables are run on
-	// master and all worker nodes. You can test a node's role metadata to
-	// run an executable on a master or worker node, as shown below:
-	// ROLE=$(/usr/share/google/get_metadata_value attributes/role) if [[
-	// "${ROLE}" == 'Master' ]]; then ... master specific actions ... else
-	// ... worker specific actions ... fi
+	// master and all worker nodes. You can test a node's <code>role</code>
+	// metadata to run an executable on a master or worker node, as shown
+	// below:
+	// ROLE=$(/usr/share/google/get_metadata_value attributes/role)
+	// if [[ "${ROLE}" == 'Master' ]]; then
+	//   ... master specific actions ...
+	// else
+	//   ... worker specific actions ...
+	// fi
+	//
 	InitializationActions []*NodeInitializationAction `json:"initializationActions,omitempty"`
 
-	// MasterConfiguration: [Optional] The Google Compute Engine
-	// configuration settings for the master instance in a cluster.
+	// MasterConfiguration: Optional The Google Compute Engine configuration
+	// settings for the master instance in a cluster.
 	MasterConfiguration *InstanceGroupConfiguration `json:"masterConfiguration,omitempty"`
 
-	// SecondaryWorkerConfiguration: [Optional] The Google Compute Engine
+	// SecondaryWorkerConfiguration: Optional The Google Compute Engine
 	// configuration settings for additional worker instances in a cluster.
 	SecondaryWorkerConfiguration *InstanceGroupConfiguration `json:"secondaryWorkerConfiguration,omitempty"`
 
-	// SoftwareConfiguration: [Optional] The configuration settings for
+	// SoftwareConfiguration: Optional The configuration settings for
 	// software inside the cluster.
 	SoftwareConfiguration *SoftwareConfiguration `json:"softwareConfiguration,omitempty"`
 
-	// WorkerConfiguration: [Optional] The Google Compute Engine
-	// configuration settings for worker instances in a cluster.
+	// WorkerConfiguration: Optional The Google Compute Engine configuration
+	// settings for worker instances in a cluster.
 	WorkerConfiguration *InstanceGroupConfiguration `json:"workerConfiguration,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ConfigurationBucket")
@@ -292,27 +302,30 @@
 
 // ClusterOperationMetadata: Metadata describing the operation.
 type ClusterOperationMetadata struct {
-	// ClusterName: [Output-only] Name of the cluster for the operation.
+	// ClusterName: Output-only Name of the cluster for the operation.
 	ClusterName string `json:"clusterName,omitempty"`
 
-	// ClusterUuid: [Output-only] Cluster UUID for the operation.
+	// ClusterUuid: Output-only Cluster UUID for the operation.
 	ClusterUuid string `json:"clusterUuid,omitempty"`
 
-	// Description: [Output-only] Short description of operation.
+	// Description: Output-only Short description of operation.
 	Description string `json:"description,omitempty"`
 
-	// Labels: [Output-only] labels associated with the operation
+	// Labels: Output-only Labels associated with the operation
 	Labels map[string]string `json:"labels,omitempty"`
 
-	// OperationType: [Output-only] The operation type.
+	// OperationType: Output-only The operation type.
 	OperationType string `json:"operationType,omitempty"`
 
-	// Status: [Output-only] Current operation status.
+	// Status: Output-only Current operation status.
 	Status *ClusterOperationStatus `json:"status,omitempty"`
 
-	// StatusHistory: [Output-only] The previous operation status.
+	// StatusHistory: Output-only The previous operation status.
 	StatusHistory []*ClusterOperationStatus `json:"statusHistory,omitempty"`
 
+	// Warnings: Output-only Errors encountered during operation execution.
+	Warnings []string `json:"warnings,omitempty"`
+
 	// ForceSendFields is a list of field names (e.g. "ClusterName") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -338,24 +351,24 @@
 
 // ClusterOperationStatus: The status of the operation.
 type ClusterOperationStatus struct {
-	// Details: [Output-only]A message containing any operation metadata
+	// Details: Output-onlyA message containing any operation metadata
 	// details.
 	Details string `json:"details,omitempty"`
 
-	// InnerState: [Output-only] A message containing the detailed operation
+	// InnerState: Output-only A message containing the detailed operation
 	// state.
 	InnerState string `json:"innerState,omitempty"`
 
-	// State: [Output-only] A message containing the operation state.
+	// State: Output-only A message containing the operation state.
 	//
 	// Possible values:
-	//   "UNKNOWN"
-	//   "PENDING"
-	//   "RUNNING"
-	//   "DONE"
+	//   "UNKNOWN" - Unused.
+	//   "PENDING" - The operation has been created.
+	//   "RUNNING" - The operation is running.
+	//   "DONE" - The operation is done; either cancelled or completed.
 	State string `json:"state,omitempty"`
 
-	// StateStartTime: [Output-only] The time this state was entered.
+	// StateStartTime: Output-only The time this state was entered.
 	StateStartTime string `json:"stateStartTime,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Details") to
@@ -389,12 +402,16 @@
 	// State: The cluster's state.
 	//
 	// Possible values:
-	//   "UNKNOWN"
-	//   "CREATING"
-	//   "RUNNING"
-	//   "ERROR"
-	//   "DELETING"
-	//   "UPDATING"
+	//   "UNKNOWN" - The cluster state is unknown.
+	//   "CREATING" - The cluster is being created and set up. It is not
+	// ready for use.
+	//   "RUNNING" - The cluster is currently running and healthy. It is
+	// ready for use.
+	//   "ERROR" - The cluster encountered an error. It is not ready for
+	// use.
+	//   "DELETING" - The cluster is being deleted. It cannot be used.
+	//   "UPDATING" - The cluster is being updated. It continues to accept
+	// and process jobs.
 	State string `json:"state,omitempty"`
 
 	// StateStartTime: Time when this state was entered.
@@ -426,9 +443,9 @@
 // DiagnoseClusterOutputLocation: The location where output from
 // diagnostic command can be found.
 type DiagnoseClusterOutputLocation struct {
-	// OutputUri: [Output-only] The Google Cloud Storage URI of the
-	// diagnostic output. This will be a plain text file with summary of
-	// collected diagnostics.
+	// OutputUri: Output-only The Google Cloud Storage URI of the diagnostic
+	// output. This will be a plain text file with summary of collected
+	// diagnostics.
 	OutputUri string `json:"outputUri,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "OutputUri") to
@@ -461,9 +478,9 @@
 
 // DiagnoseClusterResults: The location of diagnostic output.
 type DiagnoseClusterResults struct {
-	// OutputUri: [Output-only] The Google Cloud Storage URI of the
-	// diagnostic output. The output report is a plain text file with a
-	// summary of collected diagnostics.
+	// OutputUri: Output-only The Google Cloud Storage URI of the diagnostic
+	// output. The output report is a plain text file with a summary of
+	// collected diagnostics.
 	OutputUri string `json:"outputUri,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "OutputUri") to
@@ -492,15 +509,15 @@
 // DiskConfiguration: Specifies the configuration of disk options for a
 // group of VM instances.
 type DiskConfiguration struct {
-	// BootDiskSizeGb: [Optional] Size in GB of the boot disk (default is
+	// BootDiskSizeGb: Optional Size in GB of the boot disk (default is
 	// 500GB).
 	BootDiskSizeGb int64 `json:"bootDiskSizeGb,omitempty"`
 
-	// NumLocalSsds: [Optional] Number of attached SSDs, from 0 to 4
-	// (default is 0). If SSDs are not attached, the boot disk is used to
-	// store runtime logs and HDFS data. If one or more SSDs are attached,
-	// this runtime bulk data is spread across them, and the boot disk
-	// contains only basic configuration and installed binaries.
+	// NumLocalSsds: Optional Number of attached SSDs, from 0 to 4 (default
+	// is 0). If SSDs are not attached, the boot disk is used to store
+	// runtime logs and HDFS data. If one or more SSDs are attached, this
+	// runtime bulk data is spread across them, and the boot disk contains
+	// only basic configuration and installed binaries.
 	NumLocalSsds int64 `json:"numLocalSsds,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "BootDiskSizeGb") to
@@ -530,9 +547,12 @@
 // Empty: A generic empty message that you can re-use to avoid defining
 // duplicated empty messages in your APIs. A typical example is to use
 // it as the request or the response type of an API method. For
-// instance: service Foo { rpc Bar(google.protobuf.Empty) returns
-// (google.protobuf.Empty); } The JSON representation for `Empty` is
-// empty JSON object `{}`.
+// instance:
+// service Foo {
+//   rpc Bar(google.protobuf.Empty) returns
+// (google.protobuf.Empty);
+// }
+// The JSON representation for Empty is empty JSON object {}.
 type Empty struct {
 	// ServerResponse contains the HTTP response code and headers from the
 	// server.
@@ -561,10 +581,19 @@
 	// the project is used, if it exists. Cannot be a "Custom Subnet
 	// Network" (see https://cloud.google.com/compute/docs/subnetworks for
 	// more information). Example:
-	// `https://www.googleapis.com/compute/v1/projects/[project_id]/regions/g
-	// lobal/default`.
+	// https://www.googleapis.com/compute/v1/projects/[project_id]/regions/global/default.
 	NetworkUri string `json:"networkUri,omitempty"`
 
+	// ServiceAccount: Optional The service account of the instances.
+	// Defaults to the default Google Compute Engine service account. Custom
+	// service accounts need permissions equivalent to the folloing IAM
+	// roles:
+	// roles/logging.logWriter
+	// roles/storage.objectAdmin(see
+	// https://cloud.google.com/compute/docs/access/service-accounts#custom_service_accounts for more information). Example:
+	// [account_id]@[project_id].iam.gserviceaccount.com
+	ServiceAccount string `json:"serviceAccount,omitempty"`
+
 	// ServiceAccountScopes: The URIs of service account scopes to be
 	// included in Google Compute Engine instances. The following base set
 	// of scopes is always included: -
@@ -581,17 +610,15 @@
 	// SubnetworkUri: The Google Compute Engine subnetwork to be used for
 	// machine communications. Cannot be specified with network_uri.
 	// Example:
-	// `https://www.googleapis.com/compute/v1/projects/[project_id]/regions/u
-	// s-east1/sub0`.
+	// https://www.googleapis.com/compute/v1/projects/[project_id]/regions/us-east1/sub0.
 	SubnetworkUri string `json:"subnetworkUri,omitempty"`
 
 	// Tags: The Google Compute Engine tags to add to all instances.
 	Tags []string `json:"tags,omitempty"`
 
-	// ZoneUri: [Required] The zone where the Google Compute Engine cluster
+	// ZoneUri: Required The zone where the Google Compute Engine cluster
 	// will be located. Example:
-	// `https://www.googleapis.com/compute/v1/projects/[project_id]/zones/[zo
-	// ne]`.
+	// https://www.googleapis.com/compute/v1/projects/[project_id]/zones/[zone].
 	ZoneUri string `json:"zoneUri,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "InternalIpOnly") to
@@ -621,33 +648,33 @@
 // HadoopJob: A Cloud Dataproc job for running Hadoop MapReduce jobs on
 // YARN.
 type HadoopJob struct {
-	// ArchiveUris: [Optional] HCFS URIs of archives to be extracted in the
+	// ArchiveUris: Optional HCFS URIs of archives to be extracted in the
 	// working directory of Hadoop drivers and tasks. Supported file types:
 	// .jar, .tar, .tar.gz, .tgz, or .zip.
 	ArchiveUris []string `json:"archiveUris,omitempty"`
 
-	// Args: [Optional] The arguments to pass to the driver. Do not include
-	// arguments, such as `-libjars` or `-Dfoo=bar`, that can be set as job
+	// Args: Optional The arguments to pass to the driver. Do not include
+	// arguments, such as -libjars or -Dfoo=bar, that can be set as job
 	// properties, since a collision may occur that causes an incorrect job
 	// submission.
 	Args []string `json:"args,omitempty"`
 
-	// FileUris: [Optional] HCFS URIs of files to be copied to the working
+	// FileUris: Optional HCFS URIs of files to be copied to the working
 	// directory of Hadoop drivers and distributed tasks. Useful for naively
 	// parallel tasks.
 	FileUris []string `json:"fileUris,omitempty"`
 
-	// JarFileUris: [Optional] Jar file URIs to add to the CLASSPATHs of the
+	// JarFileUris: Optional Jar file URIs to add to the CLASSPATHs of the
 	// Hadoop driver and tasks.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfiguration: [Optional] The runtime log configuration for
-	// job execution.
+	// LoggingConfiguration: Optional The runtime log configuration for job
+	// execution.
 	LoggingConfiguration *LoggingConfiguration `json:"loggingConfiguration,omitempty"`
 
 	// MainClass: The name of the driver's main class. The jar file
 	// containing the class must be in the default CLASSPATH or specified in
-	// `jar_file_uris`.
+	// jar_file_uris.
 	MainClass string `json:"mainClass,omitempty"`
 
 	// MainJarFileUri: The Hadoop Compatible Filesystem (HCFS) URI of the
@@ -657,7 +684,7 @@
 	// 'file:///home/usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar'
 	MainJarFileUri string `json:"mainJarFileUri,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure Hadoop. Properties that conflict with values set by the
 	// Cloud Dataproc API may be overwritten. Can include properties set in
 	// /etc/hadoop/conf/*-site and classes in user code.
@@ -688,19 +715,19 @@
 
 // HiveJob: A Cloud Dataproc job for running Hive queries on YARN.
 type HiveJob struct {
-	// ContinueOnFailure: [Optional] Whether to continue executing queries
-	// if a query fails. The default value is `false`. Setting to `true` can
-	// be useful when executing independent parallel queries.
+	// ContinueOnFailure: Optional Whether to continue executing queries if
+	// a query fails. The default value is false. Setting to true can be
+	// useful when executing independent parallel queries.
 	ContinueOnFailure bool `json:"continueOnFailure,omitempty"`
 
-	// JarFileUris: [Optional] HCFS URIs of jar files to add to the
-	// CLASSPATH of the Hive server and Hadoop MapReduce (MR) tasks. Can
-	// contain Hive SerDes and UDFs.
+	// JarFileUris: Optional HCFS URIs of jar files to add to the CLASSPATH
+	// of the Hive server and Hadoop MapReduce (MR) tasks. Can contain Hive
+	// SerDes and UDFs.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// Properties: [Optional] A mapping of property names and values, used
-	// to configure Hive. Properties that conflict with values set by the
-	// Cloud Dataproc API may be overwritten. Can include properties set in
+	// Properties: Optional A mapping of property names and values, used to
+	// configure Hive. Properties that conflict with values set by the Cloud
+	// Dataproc API may be overwritten. Can include properties set in
 	// /etc/hadoop/conf/*-site.xml, /etc/hive/conf/hive-site.xml, and
 	// classes in user code.
 	Properties map[string]string `json:"properties,omitempty"`
@@ -711,8 +738,8 @@
 	// QueryList: A list of queries.
 	QueryList *QueryList `json:"queryList,omitempty"`
 
-	// ScriptVariables: [Optional] Mapping of query variable names to values
-	// (equivalent to the Hive command: `SET name="value";`).
+	// ScriptVariables: Optional Mapping of query variable names to values
+	// (equivalent to the Hive command: SET name="value";).
 	ScriptVariables map[string]string `json:"scriptVariables,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ContinueOnFailure")
@@ -746,15 +773,14 @@
 	// DiskConfiguration: Disk option configuration settings.
 	DiskConfiguration *DiskConfiguration `json:"diskConfiguration,omitempty"`
 
-	// ImageUri: [Output-only] The Google Compute Engine image resource used
+	// ImageUri: Output-only The Google Compute Engine image resource used
 	// for cluster instances. Inferred from
-	// `SoftwareConfiguration.image_version`.
+	// SoftwareConfiguration.image_version.
 	ImageUri string `json:"imageUri,omitempty"`
 
 	// InstanceNames: The list of instance names. Dataproc derives the names
-	// from `cluster_name`, `num_instances`, and the instance group if not
-	// set by user (recommended practice is to let Dataproc derive the
-	// name).
+	// from cluster_name, num_instances, and the instance group if not set
+	// by user (recommended practice is to let Dataproc derive the name).
 	InstanceNames []string `json:"instanceNames,omitempty"`
 
 	// IsPreemptible: Specifies that this instance group contains
@@ -763,11 +789,10 @@
 
 	// MachineTypeUri: The Google Compute Engine machine type used for
 	// cluster instances. Example:
-	// `https://www.googleapis.com/compute/v1/projects/[project_id]/zones/us-
-	// east1-a/machineTypes/n1-standard-2`.
+	// https://www.googleapis.com/compute/v1/projects/[project_id]/zones/us-east1-a/machineTypes/n1-standard-2.
 	MachineTypeUri string `json:"machineTypeUri,omitempty"`
 
-	// ManagedGroupConfiguration: [Output-only] The configuration for Google
+	// ManagedGroupConfiguration: Output-only The configuration for Google
 	// Compute Engine Instance Group Manager that manages this group. This
 	// is only used for preemptible instance groups.
 	ManagedGroupConfiguration *ManagedGroupConfiguration `json:"managedGroupConfiguration,omitempty"`
@@ -802,18 +827,18 @@
 
 // Job: A Cloud Dataproc job resource.
 type Job struct {
-	// DriverControlFilesUri: [Output-only] If present, the location of
+	// DriverControlFilesUri: Output-only If present, the location of
 	// miscellaneous control files which may be used as part of job setup
 	// and handling. If not present, control files may be placed in the same
-	// location as `driver_output_uri`.
+	// location as driver_output_uri.
 	DriverControlFilesUri string `json:"driverControlFilesUri,omitempty"`
 
-	// DriverInputResourceUri: [Output-only] A URI pointing to the location
-	// of the stdin of the job's driver program, only set if the job is
+	// DriverInputResourceUri: Output-only A URI pointing to the location of
+	// the stdin of the job's driver program, only set if the job is
 	// interactive.
 	DriverInputResourceUri string `json:"driverInputResourceUri,omitempty"`
 
-	// DriverOutputResourceUri: [Output-only] A URI pointing to the location
+	// DriverOutputResourceUri: Output-only A URI pointing to the location
 	// of the stdout of the job's driver program.
 	DriverOutputResourceUri string `json:"driverOutputResourceUri,omitempty"`
 
@@ -823,55 +848,58 @@
 	// HiveJob: Job is a Hive job.
 	HiveJob *HiveJob `json:"hiveJob,omitempty"`
 
-	// Interactive: [Optional] If set to `true`, the driver's stdin will be
-	// kept open and `driver_input_uri` will be set to provide a path at
-	// which additional input can be sent to the driver.
+	// Interactive: Optional If set to true, the driver's stdin will be kept
+	// open and driver_input_uri will be set to provide a path at which
+	// additional input can be sent to the driver.
 	Interactive bool `json:"interactive,omitempty"`
 
-	// Labels: [Optional] The labels to associate with this job. Label keys
+	// Labels: Optional The labels to associate with this job.Label keys
 	// must be between 1 and 63 characters long, and must conform to the
-	// following regular expression: \p{Ll}\p{Lo}{0,62} Label values must be
+	// following regular expression: \p{Ll}\p{Lo}{0,62}Label values must be
 	// between 1 and 63 characters long, and must conform to the following
-	// regular expression: [\p{Ll}\p{Lo}\p{N}_-]{0,63} No more than 64
-	// labels can be associated with a given job.
+	// regular expression: \p{Ll}\p{Lo}\p{N}_-{0,63}No more than 64 labels
+	// can be associated with a given job.
 	Labels map[string]string `json:"labels,omitempty"`
 
 	// PigJob: Job is a Pig job.
 	PigJob *PigJob `json:"pigJob,omitempty"`
 
-	// Placement: [Required] Job information, including how, when, and where
+	// Placement: Required Job information, including how, when, and where
 	// to run the job.
 	Placement *JobPlacement `json:"placement,omitempty"`
 
 	// PysparkJob: Job is a Pyspark job.
 	PysparkJob *PySparkJob `json:"pysparkJob,omitempty"`
 
-	// Reference: [Optional] The fully qualified reference to the job, which
+	// Reference: Optional The fully qualified reference to the job, which
 	// can be used to obtain the equivalent REST path of the job resource.
 	// If this property is not specified when a job is created, the server
-	// generates a job_id.
+	// generates a <code>job_id</code>.
 	Reference *JobReference `json:"reference,omitempty"`
 
+	// Scheduling: Optional Job scheduling configuration.
+	Scheduling *JobScheduling `json:"scheduling,omitempty"`
+
 	// SparkJob: Job is a Spark job.
 	SparkJob *SparkJob `json:"sparkJob,omitempty"`
 
 	// SparkSqlJob: Job is a SparkSql job.
 	SparkSqlJob *SparkSqlJob `json:"sparkSqlJob,omitempty"`
 
-	// Status: [Output-only] The job status. Additional application-specific
-	// status information may be contained in the type_job and
-	// yarn_applications fields.
+	// Status: Output-only The job status. Additional application-specific
+	// status information may be contained in the <code>type_job</code> and
+	// <code>yarn_applications</code> fields.
 	Status *JobStatus `json:"status,omitempty"`
 
-	// StatusHistory: [Output-only] The previous job status.
+	// StatusHistory: Output-only The previous job status.
 	StatusHistory []*JobStatus `json:"statusHistory,omitempty"`
 
-	// SubmittedBy: [Output-only] The email address of the user submitting
-	// the job. For jobs submitted on the cluster, the address is
-	// username@hostname.
+	// SubmittedBy: Output-only The email address of the user submitting the
+	// job. For jobs submitted on the cluster, the address is
+	// <code>username@hostname</code>.
 	SubmittedBy string `json:"submittedBy,omitempty"`
 
-	// YarnApplications: [Output-only] The collection of YARN applications
+	// YarnApplications: Output-only The collection of YARN applications
 	// spun up by this job.
 	YarnApplications []*YarnApplication `json:"yarnApplications,omitempty"`
 
@@ -906,11 +934,11 @@
 
 // JobPlacement: Cloud Dataproc job configuration.
 type JobPlacement struct {
-	// ClusterName: [Required] The name of the cluster where the job will be
+	// ClusterName: Required The name of the cluster where the job will be
 	// submitted.
 	ClusterName string `json:"clusterName,omitempty"`
 
-	// ClusterUuid: [Output-only] A cluster UUID generated by the Dataproc
+	// ClusterUuid: Output-only A cluster UUID generated by the Dataproc
 	// service when the job is submitted.
 	ClusterUuid string `json:"clusterUuid,omitempty"`
 
@@ -939,16 +967,16 @@
 
 // JobReference: Encapsulates the full scoping used to reference a job.
 type JobReference struct {
-	// JobId: [Required] The job ID, which must be unique within the
-	// project. The job ID is generated by the server upon job submission or
-	// provided by the user as a means to perform retries without creating
-	// duplicate jobs. The ID must contain only letters (a-z, A-Z), numbers
-	// (0-9), underscores (_), or hyphens (-). The maximum length is 512
+	// JobId: Required The job ID, which must be unique within the project.
+	// The job ID is generated by the server upon job submission or provided
+	// by the user as a means to perform retries without creating duplicate
+	// jobs. The ID must contain only letters (a-z, A-Z), numbers (0-9),
+	// underscores (_), or hyphens (-). The maximum length is 512
 	// characters.
 	JobId string `json:"jobId,omitempty"`
 
-	// ProjectId: [Required] The ID of the Google Cloud Platform project
-	// that the job belongs to.
+	// ProjectId: Required The ID of the Google Cloud Platform project that
+	// the job belongs to.
 	ProjectId string `json:"projectId,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "JobId") to
@@ -974,27 +1002,70 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// JobScheduling: Job scheduling options.Beta Feature: These options are
+// available for testing purposes only. They may be changed before final
+// release.
+type JobScheduling struct {
+	// MaxFailuresPerHour: Optional Maximum number of times per hour a
+	// driver may be restarted as a result of driver terminating with
+	// non-zero code before job is reported failed.A job may be reported as
+	// thrashing if driver exits with non-zero code 4 times within 10 minute
+	// window.Maximum value is 10.
+	MaxFailuresPerHour int64 `json:"maxFailuresPerHour,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "MaxFailuresPerHour")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "MaxFailuresPerHour") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *JobScheduling) MarshalJSON() ([]byte, error) {
+	type noMethod JobScheduling
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // JobStatus: Cloud Dataproc job status.
 type JobStatus struct {
-	// Details: [Optional] Job state details, such as an error description
-	// if the state is ERROR.
+	// Details: Optional Job state details, such as an error description if
+	// the state is <code>ERROR</code>.
 	Details string `json:"details,omitempty"`
 
-	// State: [Required] A state message specifying the overall job state.
+	// State: Required A state message specifying the overall job state.
 	//
 	// Possible values:
-	//   "STATE_UNSPECIFIED"
-	//   "PENDING"
-	//   "SETUP_DONE"
-	//   "RUNNING"
-	//   "CANCEL_PENDING"
-	//   "CANCEL_STARTED"
-	//   "CANCELLED"
-	//   "DONE"
-	//   "ERROR"
+	//   "STATE_UNSPECIFIED" - The job state is unknown.
+	//   "PENDING" - The job is pending; it has been submitted, but is not
+	// yet running.
+	//   "SETUP_DONE" - Job has been received by the service and completed
+	// initial setup; it will shortly be submitted to the cluster.
+	//   "RUNNING" - The job is running on the cluster.
+	//   "CANCEL_PENDING" - A CancelJob request has been received, but is
+	// pending.
+	//   "CANCEL_STARTED" - Transient in-flight resources have been
+	// canceled, and the request to cancel the running job has been issued
+	// to the cluster.
+	//   "CANCELLED" - The job cancelation was successful.
+	//   "DONE" - The job has completed successfully.
+	//   "ERROR" - The job has completed, but encountered an error.
+	//   "ATTEMPT_FAILURE" - Job attempt has failed. The detail field
+	// contains failure details for this attempt.Applies to restartable jobs
+	// only.
 	State string `json:"state,omitempty"`
 
-	// StateStartTime: [Output-only] The time when this state was entered.
+	// StateStartTime: Output-only The time when this state was entered.
 	StateStartTime string `json:"stateStartTime,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Details") to
@@ -1022,7 +1093,7 @@
 
 // ListClustersResponse: The list of all clusters in a project.
 type ListClustersResponse struct {
-	// Clusters: [Output-only] The clusters in the project.
+	// Clusters: Output-only The clusters in the project.
 	Clusters []*Cluster `json:"clusters,omitempty"`
 
 	// NextPageToken: The standard List next-page token.
@@ -1057,12 +1128,13 @@
 
 // ListJobsResponse: A list of jobs in a project.
 type ListJobsResponse struct {
-	// Jobs: [Output-only] Jobs list.
+	// Jobs: Output-only Jobs list.
 	Jobs []*Job `json:"jobs,omitempty"`
 
-	// NextPageToken: [Optional] This token is included in the response if
+	// NextPageToken: Optional This token is included in the response if
 	// there are more results to fetch. To fetch additional results, provide
-	// this value as the `page_token` in a subsequent ListJobsRequest.
+	// this value as the page_token in a subsequent
+	// <code>ListJobsRequest</code>.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -1163,11 +1235,11 @@
 // ManagedGroupConfiguration: Specifies the resources used to actively
 // manage an instance group.
 type ManagedGroupConfiguration struct {
-	// InstanceGroupManagerName: [Output-only] The name of the Instance
-	// Group Manager for this group.
+	// InstanceGroupManagerName: Output-only The name of the Instance Group
+	// Manager for this group.
 	InstanceGroupManagerName string `json:"instanceGroupManagerName,omitempty"`
 
-	// InstanceTemplateName: [Output-only] The name of the Instance Template
+	// InstanceTemplateName: Output-only The name of the Instance Template
 	// used for the Managed Instance Group.
 	InstanceTemplateName string `json:"instanceTemplateName,omitempty"`
 
@@ -1199,15 +1271,14 @@
 // NodeInitializationAction: Specifies an executable to run on a fully
 // configured node and a timeout period for executable completion.
 type NodeInitializationAction struct {
-	// ExecutableFile: [Required] Google Cloud Storage URI of executable
-	// file.
+	// ExecutableFile: Required Google Cloud Storage URI of executable file.
 	ExecutableFile string `json:"executableFile,omitempty"`
 
-	// ExecutionTimeout: [Optional] Amount of time executable has to
-	// complete. Default is 10 minutes. Cluster creation fails with an
-	// explanatory error message (the name of the executable that caused the
-	// error and the exceeded timeout period) if the executable is not
-	// completed at end of the timeout period.
+	// ExecutionTimeout: Optional Amount of time executable has to complete.
+	// Default is 10 minutes. Cluster creation fails with an explanatory
+	// error message (the name of the executable that caused the error and
+	// the exceeded timeout period) if the executable is not completed at
+	// end of the timeout period.
 	ExecutionTimeout string `json:"executionTimeout,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ExecutableFile") to
@@ -1237,9 +1308,9 @@
 // Operation: This resource represents a long-running operation that is
 // the result of a network API call.
 type Operation struct {
-	// Done: If the value is `false`, it means the operation is still in
-	// progress. If true, the operation is completed, and either `error` or
-	// `response` is available.
+	// Done: If the value is false, it means the operation is still in
+	// progress. If true, the operation is completed, and either error or
+	// response is available.
 	Done bool `json:"done,omitempty"`
 
 	// Error: The error result of the operation in case of failure or
@@ -1255,18 +1326,17 @@
 
 	// Name: The server-assigned name, which is only unique within the same
 	// service that originally returns it. If you use the default HTTP
-	// mapping, the `name` should have the format of
-	// `operations/some/unique/name`.
+	// mapping, the name should have the format of
+	// operations/some/unique/name.
 	Name string `json:"name,omitempty"`
 
 	// Response: The normal response of the operation in case of success. If
-	// the original method returns no data on success, such as `Delete`, the
-	// response is `google.protobuf.Empty`. If the original method is
-	// standard `Get`/`Create`/`Update`, the response should be the
-	// resource. For other methods, the response should have the type
-	// `XxxResponse`, where `Xxx` is the original method name. For example,
-	// if the original method name is `TakeSnapshot()`, the inferred
-	// response type is `TakeSnapshotResponse`.
+	// the original method returns no data on success, such as Delete, the
+	// response is google.protobuf.Empty. If the original method is standard
+	// Get/Create/Update, the response should be the resource. For other
+	// methods, the response should have the type XxxResponse, where Xxx is
+	// the original method name. For example, if the original method name is
+	// TakeSnapshot(), the inferred response type is TakeSnapshotResponse.
 	Response googleapi.RawMessage `json:"response,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -1304,7 +1374,7 @@
 	// ClusterUuid: Cluster UUId for the operation.
 	ClusterUuid string `json:"clusterUuid,omitempty"`
 
-	// Description: [Output-only] Short description of operation.
+	// Description: Output-only Short description of operation.
 	Description string `json:"description,omitempty"`
 
 	// Details: A message containing any operation metadata details.
@@ -1319,7 +1389,7 @@
 	// InsertTime: The time that the operation was requested.
 	InsertTime string `json:"insertTime,omitempty"`
 
-	// OperationType: [Output-only] The operation type.
+	// OperationType: Output-only The operation type.
 	OperationType string `json:"operationType,omitempty"`
 
 	// StartTime: The time that the operation was started by the server.
@@ -1328,18 +1398,21 @@
 	// State: A message containing the operation state.
 	//
 	// Possible values:
-	//   "UNKNOWN"
-	//   "PENDING"
-	//   "RUNNING"
-	//   "DONE"
+	//   "UNKNOWN" - Unused.
+	//   "PENDING" - The operation has been created.
+	//   "RUNNING" - The operation is currently running.
+	//   "DONE" - The operation is done, either cancelled or completed.
 	State string `json:"state,omitempty"`
 
-	// Status: [Output-only] Current operation status.
+	// Status: Output-only Current operation status.
 	Status *OperationStatus `json:"status,omitempty"`
 
-	// StatusHistory: [Output-only] Previous operation status.
+	// StatusHistory: Output-only Previous operation status.
 	StatusHistory []*OperationStatus `json:"statusHistory,omitempty"`
 
+	// Warnings: Output-only Errors encountered during operation execution.
+	Warnings []string `json:"warnings,omitempty"`
+
 	// ForceSendFields is a list of field names (e.g. "ClusterName") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -1374,10 +1447,10 @@
 	// State: A message containing the operation state.
 	//
 	// Possible values:
-	//   "UNKNOWN"
-	//   "PENDING"
-	//   "RUNNING"
-	//   "DONE"
+	//   "UNKNOWN" - Unused.
+	//   "PENDING" - The operation has been created.
+	//   "RUNNING" - The operation is running.
+	//   "DONE" - The operation is done; either cancelled or completed.
 	State string `json:"state,omitempty"`
 
 	// StateStartTime: The time this state was entered.
@@ -1408,21 +1481,21 @@
 
 // PigJob: A Cloud Dataproc job for running Pig queries on YARN.
 type PigJob struct {
-	// ContinueOnFailure: [Optional] Whether to continue executing queries
-	// if a query fails. The default value is `false`. Setting to `true` can
-	// be useful when executing independent parallel queries.
+	// ContinueOnFailure: Optional Whether to continue executing queries if
+	// a query fails. The default value is false. Setting to true can be
+	// useful when executing independent parallel queries.
 	ContinueOnFailure bool `json:"continueOnFailure,omitempty"`
 
-	// JarFileUris: [Optional] HCFS URIs of jar files to add to the
-	// CLASSPATH of the Pig Client and Hadoop MapReduce (MR) tasks. Can
-	// contain Pig UDFs.
+	// JarFileUris: Optional HCFS URIs of jar files to add to the CLASSPATH
+	// of the Pig Client and Hadoop MapReduce (MR) tasks. Can contain Pig
+	// UDFs.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfiguration: [Optional] The runtime log configuration for
-	// job execution.
+	// LoggingConfiguration: Optional The runtime log configuration for job
+	// execution.
 	LoggingConfiguration *LoggingConfiguration `json:"loggingConfiguration,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure Pig. Properties that conflict with values set by the Cloud
 	// Dataproc API may be overwritten. Can include properties set in
 	// /etc/hadoop/conf/*-site.xml, /etc/pig/conf/pig.properties, and
@@ -1436,8 +1509,8 @@
 	// QueryList: A list of queries.
 	QueryList *QueryList `json:"queryList,omitempty"`
 
-	// ScriptVariables: [Optional] Mapping of query variable names to values
-	// (equivalent to the Pig command: `name=[value]`).
+	// ScriptVariables: Optional Mapping of query variable names to values
+	// (equivalent to the Pig command: name=[value]).
 	ScriptVariables map[string]string `json:"scriptVariables,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ContinueOnFailure")
@@ -1467,39 +1540,39 @@
 // PySparkJob: A Cloud Dataproc job for running PySpark applications on
 // YARN.
 type PySparkJob struct {
-	// ArchiveUris: [Optional] HCFS URIs of archives to be extracted in the
+	// ArchiveUris: Optional HCFS URIs of archives to be extracted in the
 	// working directory of .jar, .tar, .tar.gz, .tgz, and .zip.
 	ArchiveUris []string `json:"archiveUris,omitempty"`
 
-	// Args: [Optional] The arguments to pass to the driver. Do not include
-	// arguments, such as `--conf`, that can be set as job properties, since
-	// a collision may occur that causes an incorrect job submission.
+	// Args: Optional The arguments to pass to the driver. Do not include
+	// arguments, such as --conf, that can be set as job properties, since a
+	// collision may occur that causes an incorrect job submission.
 	Args []string `json:"args,omitempty"`
 
-	// FileUris: [Optional] HCFS URIs of files to be copied to the working
+	// FileUris: Optional HCFS URIs of files to be copied to the working
 	// directory of Python drivers and distributed tasks. Useful for naively
 	// parallel tasks.
 	FileUris []string `json:"fileUris,omitempty"`
 
-	// JarFileUris: [Optional] HCFS URIs of jar files to add to the
-	// CLASSPATHs of the Python driver and tasks.
+	// JarFileUris: Optional HCFS URIs of jar files to add to the CLASSPATHs
+	// of the Python driver and tasks.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfiguration: [Optional] The runtime log configuration for
-	// job execution.
+	// LoggingConfiguration: Optional The runtime log configuration for job
+	// execution.
 	LoggingConfiguration *LoggingConfiguration `json:"loggingConfiguration,omitempty"`
 
-	// MainPythonFileUri: [Required] The Hadoop Compatible Filesystem (HCFS)
+	// MainPythonFileUri: Required The Hadoop Compatible Filesystem (HCFS)
 	// URI of the main Python file to use as the driver. Must be a .py file.
 	MainPythonFileUri string `json:"mainPythonFileUri,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure PySpark. Properties that conflict with values set by the
 	// Cloud Dataproc API may be overwritten. Can include properties set in
 	// /etc/spark/conf/spark-defaults.conf and classes in user code.
 	Properties map[string]string `json:"properties,omitempty"`
 
-	// PythonFileUris: [Optional] HCFS file URIs of Python files to pass to
+	// PythonFileUris: Optional HCFS file URIs of Python files to pass to
 	// the PySpark framework. Supported file types: .py, .egg, and .zip.
 	PythonFileUris []string `json:"pythonFileUris,omitempty"`
 
@@ -1528,12 +1601,21 @@
 
 // QueryList: A list of queries to run on a cluster.
 type QueryList struct {
-	// Queries: [Required] The queries to execute. You do not need to
+	// Queries: Required The queries to execute. You do not need to
 	// terminate a query with a semicolon. Multiple queries can be specified
 	// in one string by separating each with a semicolon. Here is an example
 	// of an Cloud Dataproc API snippet that uses a QueryList to specify a
-	// HiveJob: "hiveJob": { "queryList": { "queries": [ "query1", "query2",
-	// "query3;query4", ] } }
+	// HiveJob:
+	// "hiveJob": {
+	//   "queryList": {
+	//     "queries": [
+	//       "query1",
+	//       "query2",
+	//       "query3;query4",
+	//     ]
+	//   }
+	// }
+	//
 	Queries []string `json:"queries,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Queries") to
@@ -1562,18 +1644,17 @@
 // SoftwareConfiguration: Specifies the selection and configuration of
 // software inside the cluster.
 type SoftwareConfiguration struct {
-	// ImageVersion: [Optional] The version of software inside the cluster.
-	// It must match the regular expression `[0-9]+\.[0-9]+`. If
-	// unspecified, it defaults to the latest version (see [Cloud Dataproc
-	// Versioning](/dataproc/versioning)).
+	// ImageVersion: Optional The version of software inside the cluster. It
+	// must match the regular expression [0-9]+\.[0-9]+. If unspecified, it
+	// defaults to the latest version (see Cloud Dataproc Versioning).
 	ImageVersion string `json:"imageVersion,omitempty"`
 
-	// Properties: [Optional] The properties to set on daemon configuration
-	// files. Property keys are specified in "prefix:property" format, such
+	// Properties: Optional The properties to set on daemon configuration
+	// files.Property keys are specified in "prefix:property" format, such
 	// as "core:fs.defaultFS". The following are supported prefixes and
-	// their mappings: core - core-site.xml hdfs - hdfs-site.xml mapred -
-	// mapred-site.xml yarn - yarn-site.xml hive - hive-site.xml pig -
-	// pig.properties spark - spark-defaults.conf
+	// their mappings:  core - core-site.xml  hdfs - hdfs-site.xml  mapred -
+	// mapred-site.xml  yarn - yarn-site.xml  hive - hive-site.xml  pig -
+	// pig.properties  spark - spark-defaults.conf
 	Properties map[string]string `json:"properties,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ImageVersion") to
@@ -1602,39 +1683,39 @@
 // SparkJob: A Cloud Dataproc job for running Spark applications on
 // YARN.
 type SparkJob struct {
-	// ArchiveUris: [Optional] HCFS URIs of archives to be extracted in the
+	// ArchiveUris: Optional HCFS URIs of archives to be extracted in the
 	// working directory of Spark drivers and tasks. Supported file types:
 	// .jar, .tar, .tar.gz, .tgz, and .zip.
 	ArchiveUris []string `json:"archiveUris,omitempty"`
 
-	// Args: [Optional] The arguments to pass to the driver. Do not include
-	// arguments, such as `--conf`, that can be set as job properties, since
-	// a collision may occur that causes an incorrect job submission.
+	// Args: Optional The arguments to pass to the driver. Do not include
+	// arguments, such as --conf, that can be set as job properties, since a
+	// collision may occur that causes an incorrect job submission.
 	Args []string `json:"args,omitempty"`
 
-	// FileUris: [Optional] HCFS URIs of files to be copied to the working
+	// FileUris: Optional HCFS URIs of files to be copied to the working
 	// directory of Spark drivers and distributed tasks. Useful for naively
 	// parallel tasks.
 	FileUris []string `json:"fileUris,omitempty"`
 
-	// JarFileUris: [Optional] HCFS URIs of jar files to add to the
-	// CLASSPATHs of the Spark driver and tasks.
+	// JarFileUris: Optional HCFS URIs of jar files to add to the CLASSPATHs
+	// of the Spark driver and tasks.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfiguration: [Optional] The runtime log configuration for
-	// job execution.
+	// LoggingConfiguration: Optional The runtime log configuration for job
+	// execution.
 	LoggingConfiguration *LoggingConfiguration `json:"loggingConfiguration,omitempty"`
 
 	// MainClass: The name of the driver's main class. The jar file that
 	// contains the class must be in the default CLASSPATH or specified in
-	// `jar_file_uris`.
+	// jar_file_uris.
 	MainClass string `json:"mainClass,omitempty"`
 
 	// MainJarFileUri: The Hadoop Compatible Filesystem (HCFS) URI of the
 	// jar file that contains the main class.
 	MainJarFileUri string `json:"mainJarFileUri,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure Spark. Properties that conflict with values set by the
 	// Cloud Dataproc API may be overwritten. Can include properties set in
 	// /etc/spark/conf/spark-defaults.conf and classes in user code.
@@ -1665,15 +1746,15 @@
 
 // SparkSqlJob: A Cloud Dataproc job for running Spark SQL queries.
 type SparkSqlJob struct {
-	// JarFileUris: [Optional] HCFS URIs of jar files to be added to the
-	// Spark CLASSPATH.
+	// JarFileUris: Optional HCFS URIs of jar files to be added to the Spark
+	// CLASSPATH.
 	JarFileUris []string `json:"jarFileUris,omitempty"`
 
-	// LoggingConfiguration: [Optional] The runtime log configuration for
-	// job execution.
+	// LoggingConfiguration: Optional The runtime log configuration for job
+	// execution.
 	LoggingConfiguration *LoggingConfiguration `json:"loggingConfiguration,omitempty"`
 
-	// Properties: [Optional] A mapping of property names to values, used to
+	// Properties: Optional A mapping of property names to values, used to
 	// configure Spark SQL's SparkConf. Properties that conflict with values
 	// set by the Cloud Dataproc API may be overwritten.
 	Properties map[string]string `json:"properties,omitempty"`
@@ -1684,8 +1765,8 @@
 	// QueryList: A list of queries.
 	QueryList *QueryList `json:"queryList,omitempty"`
 
-	// ScriptVariables: [Optional] Mapping of query variable names to values
-	// (equivalent to the Spark SQL command: SET `name="value";`).
+	// ScriptVariables: Optional Mapping of query variable names to values
+	// (equivalent to the Spark SQL command: SET name="value";).
 	ScriptVariables map[string]string `json:"scriptVariables,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "JarFileUris") to
@@ -1711,42 +1792,45 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// Status: The `Status` type defines a logical error model that is
+// Status: The Status type defines a logical error model that is
 // suitable for different programming environments, including REST APIs
-// and RPC APIs. It is used by [gRPC](https://github.com/grpc). The
-// error model is designed to be: - Simple to use and understand for
-// most users - Flexible enough to meet unexpected needs # Overview The
-// `Status` message contains three pieces of data: error code, error
-// message, and error details. The error code should be an enum value of
-// google.rpc.Code, but it may accept additional error codes if needed.
-// The error message should be a developer-facing English message that
-// helps developers *understand* and *resolve* the error. If a localized
-// user-facing error message is needed, put the localized message in the
-// error details or localize it in the client. The optional error
-// details may contain arbitrary information about the error. There is a
-// predefined set of error detail types in the package `google.rpc`
-// which can be used for common error conditions. # Language mapping The
-// `Status` message is the logical representation of the error model,
-// but it is not necessarily the actual wire format. When the `Status`
-// message is exposed in different client libraries and different wire
-// protocols, it can be mapped differently. For example, it will likely
-// be mapped to some exceptions in Java, but more likely mapped to some
-// error codes in C. # Other uses The error model and the `Status`
-// message can be used in a variety of environments, either with or
-// without APIs, to provide a consistent developer experience across
-// different environments. Example uses of this error model include: -
+// and RPC APIs. It is used by gRPC (https://github.com/grpc). The error
+// model is designed to be:
+// Simple to use and understand for most users
+// Flexible enough to meet unexpected needsOverviewThe Status message
+// contains three pieces of data: error code, error message, and error
+// details. The error code should be an enum value of google.rpc.Code,
+// but it may accept additional error codes if needed. The error message
+// should be a developer-facing English message that helps developers
+// understand and resolve the error. If a localized user-facing error
+// message is needed, put the localized message in the error details or
+// localize it in the client. The optional error details may contain
+// arbitrary information about the error. There is a predefined set of
+// error detail types in the package google.rpc which can be used for
+// common error conditions.Language mappingThe Status message is the
+// logical representation of the error model, but it is not necessarily
+// the actual wire format. When the Status message is exposed in
+// different client libraries and different wire protocols, it can be
+// mapped differently. For example, it will likely be mapped to some
+// exceptions in Java, but more likely mapped to some error codes in
+// C.Other usesThe error model and the Status message can be used in a
+// variety of environments, either with or without APIs, to provide a
+// consistent developer experience across different environments.Example
+// uses of this error model include:
 // Partial errors. If a service needs to return partial errors to the
-// client, it may embed the `Status` in the normal response to indicate
-// the partial errors. - Workflow errors. A typical workflow has
-// multiple steps. Each step may have a `Status` message for error
-// reporting purpose. - Batch operations. If a client uses batch request
-// and batch response, the `Status` message should be used directly
-// inside batch response, one for each error sub-response. -
+// client, it may embed the Status in the normal response to indicate
+// the partial errors.
+// Workflow errors. A typical workflow has multiple steps. Each step may
+// have a Status message for error reporting purpose.
+// Batch operations. If a client uses batch request and batch response,
+// the Status message should be used directly inside batch response, one
+// for each error sub-response.
 // Asynchronous operations. If an API call embeds asynchronous operation
 // results in its response, the status of those operations should be
-// represented directly using the `Status` message. - Logging. If some
-// API errors are stored in logs, the message `Status` could be used
-// directly after any stripping needed for security/privacy reasons.
+// represented directly using the Status message.
+// Logging. If some API errors are stored in logs, the message Status
+// could be used directly after any stripping needed for
+// security/privacy reasons.
 type Status struct {
 	// Code: The status code, which should be an enum value of
 	// google.rpc.Code.
@@ -1786,7 +1870,7 @@
 
 // SubmitJobRequest: A request to submit a job.
 type SubmitJobRequest struct {
-	// Job: [Required] The job resource.
+	// Job: Required The job resource.
 	Job *Job `json:"job,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Job") to
@@ -1814,30 +1898,31 @@
 
 // YarnApplication: A YARN application created by a job. Application
 // information is a subset of
-// org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto.
+// <code>org.apache.hadoop.yarn.proto.YarnProtos.ApplicationReportProto</
+// code>.
 type YarnApplication struct {
-	// Name: [Required] The application name.
+	// Name: Required The application name.
 	Name string `json:"name,omitempty"`
 
-	// Progress: [Required] The numerical progress of the application, from
-	// 1 to 100.
+	// Progress: Required The numerical progress of the application, from 1
+	// to 100.
 	Progress float64 `json:"progress,omitempty"`
 
-	// State: [Required] The application state.
+	// State: Required The application state.
 	//
 	// Possible values:
-	//   "STATE_UNSPECIFIED"
-	//   "NEW"
-	//   "NEW_SAVING"
-	//   "SUBMITTED"
-	//   "ACCEPTED"
-	//   "RUNNING"
-	//   "FINISHED"
-	//   "FAILED"
-	//   "KILLED"
+	//   "STATE_UNSPECIFIED" - Status is unspecified.
+	//   "NEW" - Status is NEW.
+	//   "NEW_SAVING" - Status is NEW_SAVING.
+	//   "SUBMITTED" - Status is SUBMITTED.
+	//   "ACCEPTED" - Status is ACCEPTED.
+	//   "RUNNING" - Status is RUNNING.
+	//   "FINISHED" - Status is FINISHED.
+	//   "FAILED" - Status is FAILED.
+	//   "KILLED" - Status is KILLED.
 	State string `json:"state,omitempty"`
 
-	// TrackingUrl: [Optional] The HTTP URL of the ApplicationMaster,
+	// TrackingUrl: Optional The HTTP URL of the ApplicationMaster,
 	// HistoryServer, or TimelineServer that provides application-specific
 	// information. The URL uses the internal hostname, and requires a proxy
 	// server for resolution and, possibly, access.
@@ -1894,10 +1979,9 @@
 // Cancel: Starts asynchronous cancellation on a long-running operation.
 // The server makes a best effort to cancel the operation, but success
 // is not guaranteed. If the server doesn't support this method, it
-// returns `google.rpc.Code.UNIMPLEMENTED`. Clients can use
-// [operations.get](/dataproc/reference/rest/v1beta1/operations/get) or
-// other methods to check whether the cancellation succeeded or whether
-// the operation completed despite cancellation.
+// returns google.rpc.Code.UNIMPLEMENTED. Clients can use operations.get
+// or other methods to check whether the cancellation succeeded or
+// whether the operation completed despite cancellation.
 func (r *OperationsService) Cancel(name string, canceloperationrequest *CancelOperationRequest) *OperationsCancelCall {
 	c := &OperationsCancelCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.name = name
@@ -1936,6 +2020,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.canceloperationrequest)
 	if err != nil {
@@ -1991,7 +2076,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`. Clients can use [operations.get](/dataproc/reference/rest/v1beta1/operations/get) or other methods to check whether the cancellation succeeded or whether the operation completed despite cancellation.",
+	//   "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. If the server doesn't support this method, it returns google.rpc.Code.UNIMPLEMENTED. Clients can use operations.get or other methods to check whether the cancellation succeeded or whether the operation completed despite cancellation.",
+	//   "flatPath": "v1beta1/operations/{operationsId}:cancel",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.operations.cancel",
 	//   "parameterOrder": [
@@ -2033,7 +2119,7 @@
 // Delete: Deletes a long-running operation. This method indicates that
 // the client is no longer interested in the operation result. It does
 // not cancel the operation. If the server doesn't support this method,
-// it returns `google.rpc.Code.UNIMPLEMENTED`.
+// it returns google.rpc.Code.UNIMPLEMENTED.
 func (r *OperationsService) Delete(name string) *OperationsDeleteCall {
 	c := &OperationsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.name = name
@@ -2071,6 +2157,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+name}")
@@ -2121,7 +2208,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes a long-running operation. This method indicates that the client is no longer interested in the operation result. It does not cancel the operation. If the server doesn't support this method, it returns `google.rpc.Code.UNIMPLEMENTED`.",
+	//   "description": "Deletes a long-running operation. This method indicates that the client is no longer interested in the operation result. It does not cancel the operation. If the server doesn't support this method, it returns google.rpc.Code.UNIMPLEMENTED.",
+	//   "flatPath": "v1beta1/operations/{operationsId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "dataproc.operations.delete",
 	//   "parameterOrder": [
@@ -2208,6 +2296,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2262,6 +2351,7 @@
 	return ret, nil
 	// {
 	//   "description": "Gets the latest state of a long-running operation. Clients can use this method to poll the operation result at intervals as recommended by the API service.",
+	//   "flatPath": "v1beta1/operations/{operationsId}",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.operations.get",
 	//   "parameterOrder": [
@@ -2300,9 +2390,9 @@
 
 // List: Lists operations that match the specified filter in the
 // request. If the server doesn't support this method, it returns
-// `UNIMPLEMENTED`. NOTE: the `name` binding below allows API services
-// to override the binding to use different resource name schemes, such
-// as `users/*/operations`.
+// UNIMPLEMENTED.NOTE: the name binding below allows API services to
+// override the binding to use different resource name schemes, such as
+// users/*/operations.
 func (r *OperationsService) List(name string) *OperationsListCall {
 	c := &OperationsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.name = name
@@ -2371,6 +2461,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2424,7 +2515,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns `UNIMPLEMENTED`. NOTE: the `name` binding below allows API services to override the binding to use different resource name schemes, such as `users/*/operations`.",
+	//   "description": "Lists operations that match the specified filter in the request. If the server doesn't support this method, it returns UNIMPLEMENTED.NOTE: the name binding below allows API services to override the binding to use different resource name schemes, such as users/*/operations.",
+	//   "flatPath": "v1beta1/operations",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.operations.list",
 	//   "parameterOrder": [
@@ -2537,6 +2629,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cluster)
 	if err != nil {
@@ -2593,6 +2686,7 @@
 	return ret, nil
 	// {
 	//   "description": "Creates a cluster in a project.",
+	//   "flatPath": "v1beta1/projects/{projectId}/clusters",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.projects.clusters.create",
 	//   "parameterOrder": [
@@ -2600,7 +2694,7 @@
 	//   ],
 	//   "parameters": {
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -2670,6 +2764,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/projects/{projectId}/clusters/{clusterName}")
@@ -2722,6 +2817,7 @@
 	return ret, nil
 	// {
 	//   "description": "Deletes a cluster in a project.",
+	//   "flatPath": "v1beta1/projects/{projectId}/clusters/{clusterName}",
 	//   "httpMethod": "DELETE",
 	//   "id": "dataproc.projects.clusters.delete",
 	//   "parameterOrder": [
@@ -2730,13 +2826,13 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Required] The cluster name.",
+	//       "description": "Required The cluster name.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -2767,7 +2863,7 @@
 
 // Diagnose: Gets cluster diagnostic information. After the operation
 // completes, the Operation.response field contains
-// `DiagnoseClusterOutputLocation`.
+// DiagnoseClusterOutputLocation.
 func (r *ProjectsClustersService) Diagnose(projectId string, clusterName string, diagnoseclusterrequest *DiagnoseClusterRequest) *ProjectsClustersDiagnoseCall {
 	c := &ProjectsClustersDiagnoseCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.projectId = projectId
@@ -2807,6 +2903,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.diagnoseclusterrequest)
 	if err != nil {
@@ -2863,7 +2960,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Gets cluster diagnostic information. After the operation completes, the Operation.response field contains `DiagnoseClusterOutputLocation`.",
+	//   "description": "Gets cluster diagnostic information. After the operation completes, the Operation.response field contains DiagnoseClusterOutputLocation.",
+	//   "flatPath": "v1beta1/projects/{projectId}/clusters/{clusterName}:diagnose",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.projects.clusters.diagnose",
 	//   "parameterOrder": [
@@ -2872,13 +2970,13 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Required] The cluster name.",
+	//       "description": "Required The cluster name.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -2959,6 +3057,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3014,6 +3113,7 @@
 	return ret, nil
 	// {
 	//   "description": "Gets the resource representation for a cluster in a project.",
+	//   "flatPath": "v1beta1/projects/{projectId}/clusters/{clusterName}",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.clusters.get",
 	//   "parameterOrder": [
@@ -3022,13 +3122,13 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Required] The cluster name.",
+	//       "description": "Required The cluster name.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3063,7 +3163,7 @@
 	return c
 }
 
-// Filter sets the optional parameter "filter": [Optional] A filter
+// Filter sets the optional parameter "filter": Optional A filter
 // constraining which clusters to list. Valid filters contain label
 // terms such as: labels.key1 = val1 AND (-labels.k2 = val2 OR labels.k3
 // = val3)
@@ -3127,6 +3227,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3181,6 +3282,7 @@
 	return ret, nil
 	// {
 	//   "description": "Lists all clusters in a project.",
+	//   "flatPath": "v1beta1/projects/{projectId}/clusters",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.clusters.list",
 	//   "parameterOrder": [
@@ -3188,7 +3290,7 @@
 	//   ],
 	//   "parameters": {
 	//     "filter": {
-	//       "description": "[Optional] A filter constraining which clusters to list. Valid filters contain label terms such as: labels.key1 = val1 AND (-labels.k2 = val2 OR labels.k3 = val3)",
+	//       "description": "Optional A filter constraining which clusters to list. Valid filters contain label terms such as: labels.key1 = val1 AND (-labels.k2 = val2 OR labels.k3 = val3)",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -3204,7 +3306,7 @@
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3263,21 +3365,34 @@
 	return c
 }
 
-// UpdateMask sets the optional parameter "updateMask": [Required]
-// Specifies the path, relative to Cluster, of the field to update. For
-// example, to change the number of workers in a cluster to 5, the
-// update_mask parameter would be specified as
-// configuration.worker_configuration.num_instances, and the `PATCH`
-// request body would specify the new value, as follows: {
-// "configuration":{ "workerConfiguration":{ "numInstances":"5" } } }
+// UpdateMask sets the optional parameter "updateMask": Required
+// Specifies the path, relative to <code>Cluster</code>, of the field to
+// update. For example, to change the number of workers in a cluster to
+// 5, the <code>update_mask</code> parameter would be specified as
+// <code>configuration.worker_configuration.num_instances</code>, and
+// the PATCH request body would specify the new value, as follows:
+// {
+//   "configuration":{
+//     "workerConfiguration":{
+//       "numInstances":"5"
+//     }
+//   }
+// }
 // Similarly, to change the number of preemptible workers in a cluster
-// to 5, the update_mask parameter would be
-// config.secondary_worker_config.num_instances, and the `PATCH` request
-// body would be set as follows: { "config":{ "secondaryWorkerConfig":{
-// "numInstances":"5" } } } Note: Currently,
-// config.worker_config.num_instances and
-// config.secondary_worker_config.num_instances are the only fields that
-// can be updated.
+// to 5, the <code>update_mask</code> parameter would be
+// <code>config.secondary_worker_config.num_instances</code>, and the
+// PATCH request body would be set as follows:
+// {
+//   "config":{
+//     "secondaryWorkerConfig":{
+//       "numInstances":"5"
+//     }
+//   }
+// }
+// <strong>Note:</strong> Currently,
+// <code>config.worker_config.num_instances</code> and
+// <code>config.secondary_worker_config.num_instances</code> are the
+// only fields that can be updated.
 func (c *ProjectsClustersPatchCall) UpdateMask(updateMask string) *ProjectsClustersPatchCall {
 	c.urlParams_.Set("updateMask", updateMask)
 	return c
@@ -3314,6 +3429,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.cluster)
 	if err != nil {
@@ -3371,6 +3487,7 @@
 	return ret, nil
 	// {
 	//   "description": "Updates a cluster in a project.",
+	//   "flatPath": "v1beta1/projects/{projectId}/clusters/{clusterName}",
 	//   "httpMethod": "PATCH",
 	//   "id": "dataproc.projects.clusters.patch",
 	//   "parameterOrder": [
@@ -3379,19 +3496,20 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Required] The cluster name.",
+	//       "description": "Required The cluster name.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project the cluster belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project the cluster belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "updateMask": {
-	//       "description": "[Required] Specifies the path, relative to Cluster, of the field to update. For example, to change the number of workers in a cluster to 5, the update_mask parameter would be specified as configuration.worker_configuration.num_instances, and the `PATCH` request body would specify the new value, as follows: { \"configuration\":{ \"workerConfiguration\":{ \"numInstances\":\"5\" } } } Similarly, to change the number of preemptible workers in a cluster to 5, the update_mask parameter would be config.secondary_worker_config.num_instances, and the `PATCH` request body would be set as follows: { \"config\":{ \"secondaryWorkerConfig\":{ \"numInstances\":\"5\" } } } Note: Currently, config.worker_config.num_instances and config.secondary_worker_config.num_instances are the only fields that can be updated.",
+	//       "description": "Required Specifies the path, relative to \u003ccode\u003eCluster\u003c/code\u003e, of the field to update. For example, to change the number of workers in a cluster to 5, the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be specified as \u003ccode\u003econfiguration.worker_configuration.num_instances\u003c/code\u003e, and the PATCH request body would specify the new value, as follows:\n{\n  \"configuration\":{\n    \"workerConfiguration\":{\n      \"numInstances\":\"5\"\n    }\n  }\n}\nSimilarly, to change the number of preemptible workers in a cluster to 5, the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be \u003ccode\u003econfig.secondary_worker_config.num_instances\u003c/code\u003e, and the PATCH request body would be set as follows:\n{\n  \"config\":{\n    \"secondaryWorkerConfig\":{\n      \"numInstances\":\"5\"\n    }\n  }\n}\n\u003cstrong\u003eNote:\u003c/strong\u003e Currently, \u003ccode\u003econfig.worker_config.num_instances\u003c/code\u003e and \u003ccode\u003econfig.secondary_worker_config.num_instances\u003c/code\u003e are the only fields that can be updated.",
+	//       "format": "google-fieldmask",
 	//       "location": "query",
 	//       "type": "string"
 	//     }
@@ -3423,9 +3541,7 @@
 }
 
 // Cancel: Starts a job cancellation request. To access the job resource
-// after cancellation, call
-// [jobs.list](/dataproc/reference/rest/v1beta1/projects.jobs/list) or
-// [jobs.get](/dataproc/reference/rest/v1beta1/projects.jobs/get).
+// after cancellation, call jobs.list or jobs.get.
 func (r *ProjectsJobsService) Cancel(projectId string, jobId string, canceljobrequest *CancelJobRequest) *ProjectsJobsCancelCall {
 	c := &ProjectsJobsCancelCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.projectId = projectId
@@ -3465,6 +3581,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.canceljobrequest)
 	if err != nil {
@@ -3521,7 +3638,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Starts a job cancellation request. To access the job resource after cancellation, call [jobs.list](/dataproc/reference/rest/v1beta1/projects.jobs/list) or [jobs.get](/dataproc/reference/rest/v1beta1/projects.jobs/get).",
+	//   "description": "Starts a job cancellation request. To access the job resource after cancellation, call jobs.list or jobs.get.",
+	//   "flatPath": "v1beta1/projects/{projectId}/jobs/{jobId}:cancel",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.projects.jobs.cancel",
 	//   "parameterOrder": [
@@ -3530,13 +3648,13 @@
 	//   ],
 	//   "parameters": {
 	//     "jobId": {
-	//       "description": "[Required] The job ID.",
+	//       "description": "Required The job ID.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3568,7 +3686,7 @@
 }
 
 // Delete: Deletes the job from the project. If the job is active, the
-// delete fails, and the response returns `FAILED_PRECONDITION`.
+// delete fails, and the response returns FAILED_PRECONDITION.
 func (r *ProjectsJobsService) Delete(projectId string, jobId string) *ProjectsJobsDeleteCall {
 	c := &ProjectsJobsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.projectId = projectId
@@ -3607,6 +3725,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/projects/{projectId}/jobs/{jobId}")
@@ -3658,7 +3777,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes the job from the project. If the job is active, the delete fails, and the response returns `FAILED_PRECONDITION`.",
+	//   "description": "Deletes the job from the project. If the job is active, the delete fails, and the response returns FAILED_PRECONDITION.",
+	//   "flatPath": "v1beta1/projects/{projectId}/jobs/{jobId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "dataproc.projects.jobs.delete",
 	//   "parameterOrder": [
@@ -3667,13 +3787,13 @@
 	//   ],
 	//   "parameters": {
 	//     "jobId": {
-	//       "description": "[Required] The job ID.",
+	//       "description": "Required The job ID.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3751,6 +3871,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3806,6 +3927,7 @@
 	return ret, nil
 	// {
 	//   "description": "Gets the resource representation for a job in a project.",
+	//   "flatPath": "v1beta1/projects/{projectId}/jobs/{jobId}",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.jobs.get",
 	//   "parameterOrder": [
@@ -3814,13 +3936,13 @@
 	//   ],
 	//   "parameters": {
 	//     "jobId": {
-	//       "description": "[Required] The job ID.",
+	//       "description": "Required The job ID.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -3855,7 +3977,7 @@
 	return c
 }
 
-// ClusterName sets the optional parameter "clusterName": [Optional] If
+// ClusterName sets the optional parameter "clusterName": Optional If
 // set, the returned jobs list includes only jobs that were submitted to
 // the named cluster.
 func (c *ProjectsJobsListCall) ClusterName(clusterName string) *ProjectsJobsListCall {
@@ -3863,7 +3985,7 @@
 	return c
 }
 
-// Filter sets the optional parameter "filter": [Optional] A filter
+// Filter sets the optional parameter "filter": Optional A filter
 // constraining which jobs to list. Valid filters contain job state and
 // label terms such as: labels.key1 = val1 AND (labels.k2 = val2 OR
 // labels.k3 = val3)
@@ -3873,7 +3995,7 @@
 }
 
 // JobStateMatcher sets the optional parameter "jobStateMatcher":
-// [Optional] Specifies enumerated categories of jobs to list.
+// Optional Specifies enumerated categories of jobs to list.
 //
 // Possible values:
 //   "ALL"
@@ -3884,15 +4006,15 @@
 	return c
 }
 
-// PageSize sets the optional parameter "pageSize": [Optional] The
-// number of results to return in each response.
+// PageSize sets the optional parameter "pageSize": Optional The number
+// of results to return in each response.
 func (c *ProjectsJobsListCall) PageSize(pageSize int64) *ProjectsJobsListCall {
 	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
 	return c
 }
 
-// PageToken sets the optional parameter "pageToken": [Optional] The
-// page token, returned by a previous call, to request the next page of
+// PageToken sets the optional parameter "pageToken": Optional The page
+// token, returned by a previous call, to request the next page of
 // results.
 func (c *ProjectsJobsListCall) PageToken(pageToken string) *ProjectsJobsListCall {
 	c.urlParams_.Set("pageToken", pageToken)
@@ -3940,6 +4062,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3994,6 +4117,7 @@
 	return ret, nil
 	// {
 	//   "description": "Lists jobs in a project.",
+	//   "flatPath": "v1beta1/projects/{projectId}/jobs",
 	//   "httpMethod": "GET",
 	//   "id": "dataproc.projects.jobs.list",
 	//   "parameterOrder": [
@@ -4001,17 +4125,17 @@
 	//   ],
 	//   "parameters": {
 	//     "clusterName": {
-	//       "description": "[Optional] If set, the returned jobs list includes only jobs that were submitted to the named cluster.",
+	//       "description": "Optional If set, the returned jobs list includes only jobs that were submitted to the named cluster.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "filter": {
-	//       "description": "[Optional] A filter constraining which jobs to list. Valid filters contain job state and label terms such as: labels.key1 = val1 AND (labels.k2 = val2 OR labels.k3 = val3)",
+	//       "description": "Optional A filter constraining which jobs to list. Valid filters contain job state and label terms such as: labels.key1 = val1 AND (labels.k2 = val2 OR labels.k3 = val3)",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "jobStateMatcher": {
-	//       "description": "[Optional] Specifies enumerated categories of jobs to list.",
+	//       "description": "Optional Specifies enumerated categories of jobs to list.",
 	//       "enum": [
 	//         "ALL",
 	//         "ACTIVE",
@@ -4021,18 +4145,18 @@
 	//       "type": "string"
 	//     },
 	//     "pageSize": {
-	//       "description": "[Optional] The number of results to return in each response.",
+	//       "description": "Optional The number of results to return in each response.",
 	//       "format": "int32",
 	//       "location": "query",
 	//       "type": "integer"
 	//     },
 	//     "pageToken": {
-	//       "description": "[Optional] The page token, returned by a previous call, to request the next page of results.",
+	//       "description": "Optional The page token, returned by a previous call, to request the next page of results.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
@@ -4070,6 +4194,169 @@
 	}
 }
 
+// method id "dataproc.projects.jobs.patch":
+
+type ProjectsJobsPatchCall struct {
+	s          *Service
+	projectId  string
+	jobId      string
+	job        *Job
+	urlParams_ gensupport.URLParams
+	ctx_       context.Context
+	header_    http.Header
+}
+
+// Patch: Updates a job in a project.
+func (r *ProjectsJobsService) Patch(projectId string, jobId string, job *Job) *ProjectsJobsPatchCall {
+	c := &ProjectsJobsPatchCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.projectId = projectId
+	c.jobId = jobId
+	c.job = job
+	return c
+}
+
+// UpdateMask sets the optional parameter "updateMask": Required
+// Specifies the path, relative to <code>Job</code>, of the field to
+// update. For example, to update the labels of a Job the
+// <code>update_mask</code> parameter would be specified as
+// <code>labels</code>, and the PATCH request body would specify the new
+// value. <strong>Note:</strong> Currently, <code>labels</code> is the
+// only field that can be updated.
+func (c *ProjectsJobsPatchCall) UpdateMask(updateMask string) *ProjectsJobsPatchCall {
+	c.urlParams_.Set("updateMask", updateMask)
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ProjectsJobsPatchCall) Fields(s ...googleapi.Field) *ProjectsJobsPatchCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ProjectsJobsPatchCall) Context(ctx context.Context) *ProjectsJobsPatchCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ProjectsJobsPatchCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ProjectsJobsPatchCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.job)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/projects/{projectId}/jobs/{jobId}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("PATCH", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"projectId": c.projectId,
+		"jobId":     c.jobId,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "dataproc.projects.jobs.patch" call.
+// Exactly one of *Job or error will be non-nil. Any non-2xx status code
+// is an error. Response headers are in either
+// *Job.ServerResponse.Header or (if a response was returned at all) in
+// error.(*googleapi.Error).Header. Use googleapi.IsNotModified to check
+// whether the returned error was because http.StatusNotModified was
+// returned.
+func (c *ProjectsJobsPatchCall) Do(opts ...googleapi.CallOption) (*Job, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &Job{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Updates a job in a project.",
+	//   "flatPath": "v1beta1/projects/{projectId}/jobs/{jobId}",
+	//   "httpMethod": "PATCH",
+	//   "id": "dataproc.projects.jobs.patch",
+	//   "parameterOrder": [
+	//     "projectId",
+	//     "jobId"
+	//   ],
+	//   "parameters": {
+	//     "jobId": {
+	//       "description": "Required The job ID.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "projectId": {
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "updateMask": {
+	//       "description": "Required Specifies the path, relative to \u003ccode\u003eJob\u003c/code\u003e, of the field to update. For example, to update the labels of a Job the \u003ccode\u003eupdate_mask\u003c/code\u003e parameter would be specified as \u003ccode\u003elabels\u003c/code\u003e, and the PATCH request body would specify the new value. \u003cstrong\u003eNote:\u003c/strong\u003e Currently, \u003ccode\u003elabels\u003c/code\u003e is the only field that can be updated.",
+	//       "format": "google-fieldmask",
+	//       "location": "query",
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1beta1/projects/{projectId}/jobs/{jobId}",
+	//   "request": {
+	//     "$ref": "Job"
+	//   },
+	//   "response": {
+	//     "$ref": "Job"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform"
+	//   ]
+	// }
+
+}
+
 // method id "dataproc.projects.jobs.submit":
 
 type ProjectsJobsSubmitCall struct {
@@ -4120,6 +4407,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.submitjobrequest)
 	if err != nil {
@@ -4176,6 +4464,7 @@
 	return ret, nil
 	// {
 	//   "description": "Submits a job to a cluster.",
+	//   "flatPath": "v1beta1/projects/{projectId}/jobs:submit",
 	//   "httpMethod": "POST",
 	//   "id": "dataproc.projects.jobs.submit",
 	//   "parameterOrder": [
@@ -4183,7 +4472,7 @@
 	//   ],
 	//   "parameters": {
 	//     "projectId": {
-	//       "description": "[Required] The ID of the Google Cloud Platform project that the job belongs to.",
+	//       "description": "Required The ID of the Google Cloud Platform project that the job belongs to.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
diff --git a/datastore/v1/datastore-gen.go b/datastore/v1/datastore-gen.go
index 89f0cdb..dbcce1b 100644
--- a/datastore/v1/datastore-gen.go
+++ b/datastore/v1/datastore-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	return rs
@@ -1650,6 +1655,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.allocateidsrequest)
 	if err != nil {
@@ -1785,6 +1791,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.begintransactionrequest)
 	if err != nil {
@@ -1922,6 +1929,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.commitrequest)
 	if err != nil {
@@ -2057,6 +2065,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.lookuprequest)
 	if err != nil {
@@ -2192,6 +2201,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.rollbackrequest)
 	if err != nil {
@@ -2327,6 +2337,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.runqueryrequest)
 	if err != nil {
diff --git a/datastore/v1beta1/datastore-gen.go b/datastore/v1beta1/datastore-gen.go
index f0096ee..97dc43a 100644
--- a/datastore/v1beta1/datastore-gen.go
+++ b/datastore/v1beta1/datastore-gen.go
@@ -67,9 +67,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Datasets *DatasetsService
 }
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewDatasetsService(s *Service) *DatasetsService {
 	rs := &DatasetsService{s: s}
 	return rs
@@ -1462,6 +1467,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.allocateidsrequest)
 	if err != nil {
@@ -1597,6 +1603,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.begintransactionrequest)
 	if err != nil {
@@ -1733,6 +1740,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.blindwriterequest)
 	if err != nil {
@@ -1869,6 +1877,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.commitrequest)
 	if err != nil {
@@ -2004,6 +2013,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.lookuprequest)
 	if err != nil {
@@ -2139,6 +2149,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.rollbackrequest)
 	if err != nil {
@@ -2274,6 +2285,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.runqueryrequest)
 	if err != nil {
diff --git a/datastore/v1beta2/datastore-gen.go b/datastore/v1beta2/datastore-gen.go
index 0cc01cc..0d572cd 100644
--- a/datastore/v1beta2/datastore-gen.go
+++ b/datastore/v1beta2/datastore-gen.go
@@ -67,9 +67,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Datasets *DatasetsService
 }
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewDatasetsService(s *Service) *DatasetsService {
 	rs := &DatasetsService{s: s}
 	return rs
@@ -1502,6 +1507,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.allocateidsrequest)
 	if err != nil {
@@ -1637,6 +1643,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.begintransactionrequest)
 	if err != nil {
@@ -1773,6 +1780,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.commitrequest)
 	if err != nil {
@@ -1908,6 +1916,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.lookuprequest)
 	if err != nil {
@@ -2043,6 +2052,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.rollbackrequest)
 	if err != nil {
@@ -2178,6 +2188,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.runqueryrequest)
 	if err != nil {
diff --git a/datastore/v1beta3/datastore-gen.go b/datastore/v1beta3/datastore-gen.go
index b73b29f..59ecbd5 100644
--- a/datastore/v1beta3/datastore-gen.go
+++ b/datastore/v1beta3/datastore-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	return rs
@@ -1652,6 +1657,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.allocateidsrequest)
 	if err != nil {
@@ -1787,6 +1793,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.begintransactionrequest)
 	if err != nil {
@@ -1924,6 +1931,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.commitrequest)
 	if err != nil {
@@ -2059,6 +2067,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.lookuprequest)
 	if err != nil {
@@ -2194,6 +2203,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.rollbackrequest)
 	if err != nil {
@@ -2329,6 +2339,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.runqueryrequest)
 	if err != nil {
diff --git a/deploymentmanager/v2/deploymentmanager-api.json b/deploymentmanager/v2/deploymentmanager-api.json
index 082129f..60b9e42 100644
--- a/deploymentmanager/v2/deploymentmanager-api.json
+++ b/deploymentmanager/v2/deploymentmanager-api.json
@@ -1,12 +1,12 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/Dg3jkuWJLyfsWpZiK_LBaeIV21s\"",
+ "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/BZOTaOSd6CDPT3kBLAME2ENtrqQ\"",
  "discoveryVersion": "v1",
  "id": "deploymentmanager:v2",
  "name": "deploymentmanager",
  "canonicalName": "Deployment Manager",
  "version": "v2",
- "revision": "20161221",
+ "revision": "20170126",
  "title": "Google Cloud Deployment Manager API",
  "description": "Declares, configures, and deploys complex solutions on Google Cloud Platform.",
  "ownerDomain": "google.com",
@@ -89,18 +89,18 @@
   "AuditConfig": {
    "id": "AuditConfig",
    "type": "object",
-   "description": "Provides the configuration for non-admin_activity logging for a service. Controls exemptions and specific log sub-types.",
+   "description": "Specifies the audit configuration for a service. It consists of which permission types are logged, and what identities, if any, are exempted from logging. An AuditConifg must have one or more AuditLogConfigs.",
    "properties": {
     "auditLogConfigs": {
      "type": "array",
-     "description": "The configuration for each type of logging",
+     "description": "The configuration for logging of each type of permission.",
      "items": {
       "$ref": "AuditLogConfig"
      }
     },
     "exemptedMembers": {
      "type": "array",
-     "description": "Specifies the identities that are exempted from \"data access\" audit logging for the `service` specified above. Follows the same format of Binding.members.",
+     "description": "Specifies the identities that are exempted from \"data access\" audit logging for the `service` specified above. Follows the same format of Binding.members. This field is deprecated in favor of per-permission-type exemptions.",
      "items": {
       "type": "string"
      }
@@ -114,11 +114,11 @@
   "AuditLogConfig": {
    "id": "AuditLogConfig",
    "type": "object",
-   "description": "Provides the configuration for a sub-type of logging.",
+   "description": "Provides the configuration for logging a type of permissions. Example:\n\n{ \"audit_log_configs\": [ { \"log_type\": \"DATA_READ\", \"exempted_members\": [ \"user:foo@gmail.com\" ] }, { \"log_type\": \"DATA_WRITE\", } ] }\n\nThis enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting foo@gmail.com from DATA_READ logging.",
    "properties": {
     "exemptedMembers": {
      "type": "array",
-     "description": "Specifies the identities that are exempted from this type of logging Follows the same format of Binding.members.",
+     "description": "Specifies the identities that do not cause logging for this type of permission. Follows the same format of [Binding.members][].",
      "items": {
       "type": "string"
      }
@@ -265,6 +265,10 @@
    "type": "object",
    "description": "",
    "properties": {
+    "description": {
+     "type": "string",
+     "description": "[Output Only] An optional user-provided description of the deployment after the current update has been applied."
+    },
     "labels": {
      "type": "array",
      "description": "[Output Only] Map of labels; provided by the client when the resource is created or updated. Specifically: Label keys must be between 1 and 63 characters long and must conform to the following regular expression: [a-z]([-a-z0-9]*[a-z0-9])? Label values must be between 0 and 63 characters long and must conform to the regular expression ([a-z]([-a-z0-9]*[a-z0-9])?)?",
@@ -445,7 +449,7 @@
     },
     "creationTimestamp": {
      "type": "string",
-     "description": "[Output Only] Creation timestamp in RFC3339 text format."
+     "description": "[Deprecated] This field is deprecated."
     },
     "description": {
      "type": "string",
@@ -616,7 +620,7 @@
    "properties": {
     "auditConfigs": {
      "type": "array",
-     "description": "Specifies audit logging configs for \"data access\". \"data access\": generally refers to data reads/writes and admin reads. \"admin activity\": generally refers to admin writes.\n\nNote: `AuditConfig` doesn't apply to \"admin activity\", which always enables audit logging.",
+     "description": "Specifies cloud audit logging configuration for this policy.",
      "items": {
       "$ref": "AuditConfig"
      }
@@ -1199,11 +1203,10 @@
       },
       "maxResults": {
        "type": "integer",
-       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)",
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -1552,11 +1555,10 @@
       },
       "maxResults": {
        "type": "integer",
-       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)",
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -1642,11 +1644,10 @@
       },
       "maxResults": {
        "type": "integer",
-       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)",
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -1746,11 +1747,10 @@
       },
       "maxResults": {
        "type": "integer",
-       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)",
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
@@ -1802,11 +1802,10 @@
       },
       "maxResults": {
        "type": "integer",
-       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)",
        "default": "500",
        "format": "uint32",
        "minimum": "0",
-       "maximum": "500",
        "location": "query"
       },
       "orderBy": {
diff --git a/deploymentmanager/v2/deploymentmanager-gen.go b/deploymentmanager/v2/deploymentmanager-gen.go
index 346345f..c5535c1 100644
--- a/deploymentmanager/v2/deploymentmanager-gen.go
+++ b/deploymentmanager/v2/deploymentmanager-gen.go
@@ -76,9 +76,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Deployments *DeploymentsService
 
@@ -98,6 +99,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewDeploymentsService(s *Service) *DeploymentsService {
 	rs := &DeploymentsService{s: s}
 	return rs
@@ -143,16 +148,19 @@
 	s *Service
 }
 
-// AuditConfig: Provides the configuration for non-admin_activity
-// logging for a service. Controls exemptions and specific log
-// sub-types.
+// AuditConfig: Specifies the audit configuration for a service. It
+// consists of which permission types are logged, and what identities,
+// if any, are exempted from logging. An AuditConifg must have one or
+// more AuditLogConfigs.
 type AuditConfig struct {
-	// AuditLogConfigs: The configuration for each type of logging
+	// AuditLogConfigs: The configuration for logging of each type of
+	// permission.
 	AuditLogConfigs []*AuditLogConfig `json:"auditLogConfigs,omitempty"`
 
 	// ExemptedMembers: Specifies the identities that are exempted from
 	// "data access" audit logging for the `service` specified above.
-	// Follows the same format of Binding.members.
+	// Follows the same format of Binding.members. This field is deprecated
+	// in favor of per-permission-type exemptions.
 	ExemptedMembers []string `json:"exemptedMembers,omitempty"`
 
 	// Service: Specifies a service that will be enabled for audit logging.
@@ -184,10 +192,19 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// AuditLogConfig: Provides the configuration for a sub-type of logging.
+// AuditLogConfig: Provides the configuration for logging a type of
+// permissions. Example:
+//
+// { "audit_log_configs": [ { "log_type": "DATA_READ",
+// "exempted_members": [ "user:foo@gmail.com" ] }, { "log_type":
+// "DATA_WRITE", } ] }
+//
+// This enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting
+// foo@gmail.com from DATA_READ logging.
 type AuditLogConfig struct {
-	// ExemptedMembers: Specifies the identities that are exempted from this
-	// type of logging Follows the same format of Binding.members.
+	// ExemptedMembers: Specifies the identities that do not cause logging
+	// for this type of permission. Follows the same format of
+	// [Binding.members][].
 	ExemptedMembers []string `json:"exemptedMembers,omitempty"`
 
 	// LogType: The log type that this config enables.
@@ -462,6 +479,10 @@
 }
 
 type DeploymentUpdate struct {
+	// Description: [Output Only] An optional user-provided description of
+	// the deployment after the current update has been applied.
+	Description string `json:"description,omitempty"`
+
 	// Labels: [Output Only] Map of labels; provided by the client when the
 	// resource is created or updated. Specifically: Label keys must be
 	// between 1 and 63 characters long and must conform to the following
@@ -474,7 +495,7 @@
 	// configuration of this deployment.
 	Manifest string `json:"manifest,omitempty"`
 
-	// ForceSendFields is a list of field names (e.g. "Labels") to
+	// ForceSendFields is a list of field names (e.g. "Description") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
 	// non-interface field appearing in ForceSendFields will be sent to the
@@ -482,10 +503,10 @@
 	// used to include empty fields in Patch requests.
 	ForceSendFields []string `json:"-"`
 
-	// NullFields is a list of field names (e.g. "Labels") to include in API
-	// requests with the JSON null value. By default, fields with empty
-	// values are omitted from API requests. However, any field with an
-	// empty value appearing in NullFields will be sent to the server as
+	// NullFields is a list of field names (e.g. "Description") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
 	// null. It is an error if a field in this list has a non-empty value.
 	// This may be used to include null fields in Patch requests.
 	NullFields []string `json:"-"`
@@ -826,8 +847,7 @@
 	// ClientOperationId: [Output Only] Reserved for future use.
 	ClientOperationId string `json:"clientOperationId,omitempty"`
 
-	// CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text
-	// format.
+	// CreationTimestamp: [Deprecated] This field is deprecated.
 	CreationTimestamp string `json:"creationTimestamp,omitempty"`
 
 	// Description: [Output Only] A textual description of the operation,
@@ -1145,12 +1165,8 @@
 // For a description of IAM and its features, see the [IAM developer's
 // guide](https://cloud.google.com/iam).
 type Policy struct {
-	// AuditConfigs: Specifies audit logging configs for "data access".
-	// "data access": generally refers to data reads/writes and admin reads.
-	// "admin activity": generally refers to admin writes.
-	//
-	// Note: `AuditConfig` doesn't apply to "admin activity", which always
-	// enables audit logging.
+	// AuditConfigs: Specifies cloud audit logging configuration for this
+	// policy.
 	AuditConfigs []*AuditConfig `json:"auditConfigs,omitempty"`
 
 	// Bindings: Associates a list of `members` to a `role`. Multiple
@@ -1902,6 +1918,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.deploymentscancelpreviewrequest)
 	if err != nil {
@@ -2058,6 +2075,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/deployments/{deployment}")
@@ -2219,6 +2237,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2372,6 +2391,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2526,6 +2546,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.deployment)
 	if err != nil {
@@ -2670,7 +2691,8 @@
 // number of results per page that should be returned. If the number of
 // available results is larger than maxResults, Compute Engine returns a
 // nextPageToken that can be used to get the next page of results in
-// subsequent list requests.
+// subsequent list requests. Acceptable values are 0 to 500, inclusive.
+// (Default: 500)
 func (c *DeploymentsListCall) MaxResults(maxResults int64) *DeploymentsListCall {
 	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
 	return c
@@ -2742,6 +2764,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2809,10 +2832,9 @@
 	//     },
 	//     "maxResults": {
 	//       "default": "500",
-	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -2960,6 +2982,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.deployment2)
 	if err != nil {
@@ -3141,6 +3164,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.policy)
 	if err != nil {
@@ -3289,6 +3313,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.deploymentsstoprequest)
 	if err != nil {
@@ -3436,6 +3461,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testpermissionsrequest)
 	if err != nil {
@@ -3621,6 +3647,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.deployment2)
 	if err != nil {
@@ -3812,6 +3839,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3968,7 +3996,8 @@
 // number of results per page that should be returned. If the number of
 // available results is larger than maxResults, Compute Engine returns a
 // nextPageToken that can be used to get the next page of results in
-// subsequent list requests.
+// subsequent list requests. Acceptable values are 0 to 500, inclusive.
+// (Default: 500)
 func (c *ManifestsListCall) MaxResults(maxResults int64) *ManifestsListCall {
 	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
 	return c
@@ -4040,6 +4069,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4116,10 +4146,9 @@
 	//     },
 	//     "maxResults": {
 	//       "default": "500",
-	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -4237,6 +4266,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4381,7 +4411,8 @@
 // number of results per page that should be returned. If the number of
 // available results is larger than maxResults, Compute Engine returns a
 // nextPageToken that can be used to get the next page of results in
-// subsequent list requests.
+// subsequent list requests. Acceptable values are 0 to 500, inclusive.
+// (Default: 500)
 func (c *OperationsListCall) MaxResults(maxResults int64) *OperationsListCall {
 	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
 	return c
@@ -4453,6 +4484,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4520,10 +4552,9 @@
 	//     },
 	//     "maxResults": {
 	//       "default": "500",
-	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -4643,6 +4674,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4798,7 +4830,8 @@
 // number of results per page that should be returned. If the number of
 // available results is larger than maxResults, Compute Engine returns a
 // nextPageToken that can be used to get the next page of results in
-// subsequent list requests.
+// subsequent list requests. Acceptable values are 0 to 500, inclusive.
+// (Default: 500)
 func (c *ResourcesListCall) MaxResults(maxResults int64) *ResourcesListCall {
 	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
 	return c
@@ -4870,6 +4903,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4946,10 +4980,9 @@
 	//     },
 	//     "maxResults": {
 	//       "default": "500",
-	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
@@ -5060,7 +5093,8 @@
 // number of results per page that should be returned. If the number of
 // available results is larger than maxResults, Compute Engine returns a
 // nextPageToken that can be used to get the next page of results in
-// subsequent list requests.
+// subsequent list requests. Acceptable values are 0 to 500, inclusive.
+// (Default: 500)
 func (c *TypesListCall) MaxResults(maxResults int64) *TypesListCall {
 	c.urlParams_.Set("maxResults", fmt.Sprint(maxResults))
 	return c
@@ -5132,6 +5166,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5199,10 +5234,9 @@
 	//     },
 	//     "maxResults": {
 	//       "default": "500",
-	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.",
+	//       "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests. Acceptable values are 0 to 500, inclusive. (Default: 500)",
 	//       "format": "uint32",
 	//       "location": "query",
-	//       "maximum": "500",
 	//       "minimum": "0",
 	//       "type": "integer"
 	//     },
diff --git a/dfareporting/v2.5/dfareporting-gen.go b/dfareporting/v2.5/dfareporting-gen.go
index c42f80a..3efe0da 100644
--- a/dfareporting/v2.5/dfareporting-gen.go
+++ b/dfareporting/v2.5/dfareporting-gen.go
@@ -124,9 +124,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	AccountActiveAdSummaries *AccountActiveAdSummariesService
 
@@ -250,6 +251,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountActiveAdSummariesService(s *Service) *AccountActiveAdSummariesService {
 	rs := &AccountActiveAdSummariesService{s: s}
 	return rs
@@ -13014,6 +13019,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13163,6 +13169,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13310,6 +13317,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13451,6 +13459,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13598,6 +13607,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13738,6 +13748,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13876,6 +13887,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountuserprofile)
 	if err != nil {
@@ -14102,6 +14114,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14320,6 +14333,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountuserprofile)
 	if err != nil {
@@ -14462,6 +14476,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountuserprofile)
 	if err != nil {
@@ -14607,6 +14622,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14823,6 +14839,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15029,6 +15046,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -15171,6 +15189,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -15316,6 +15335,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15454,6 +15474,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ad)
 	if err != nil {
@@ -15864,6 +15885,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16251,6 +16273,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ad)
 	if err != nil {
@@ -16393,6 +16416,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ad)
 	if err != nil {
@@ -16527,6 +16551,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/advertiserGroups/{id}")
@@ -16645,6 +16670,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16783,6 +16809,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertisergroup)
 	if err != nil {
@@ -16988,6 +17015,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17189,6 +17217,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertisergroup)
 	if err != nil {
@@ -17331,6 +17360,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertisergroup)
 	if err != nil {
@@ -17476,6 +17506,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17614,6 +17645,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertiser)
 	if err != nil {
@@ -17874,6 +17906,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18118,6 +18151,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertiser)
 	if err != nil {
@@ -18260,6 +18294,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertiser)
 	if err != nil {
@@ -18403,6 +18438,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18536,6 +18572,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.campaigncreativeassociation)
 	if err != nil {
@@ -18716,6 +18753,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18912,6 +18950,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19052,6 +19091,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.campaign)
 	if err != nil {
@@ -19335,6 +19375,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19579,6 +19620,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.campaign)
 	if err != nil {
@@ -19721,6 +19763,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.campaign)
 	if err != nil {
@@ -19866,6 +19909,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20168,6 +20212,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20544,6 +20589,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20710,6 +20756,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20857,6 +20904,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20986,6 +21034,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/contentCategories/{id}")
@@ -21104,6 +21153,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21242,6 +21292,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.contentcategory)
 	if err != nil {
@@ -21447,6 +21498,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21648,6 +21700,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.contentcategory)
 	if err != nil {
@@ -21790,6 +21843,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.contentcategory)
 	if err != nil {
@@ -21924,6 +21978,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.conversionsbatchinsertrequest)
 	if err != nil {
@@ -22069,6 +22124,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22216,6 +22272,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22400,6 +22457,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativeassetmetadata)
 	if err != nil {
@@ -22610,6 +22668,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}")
@@ -22739,6 +22798,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22888,6 +22948,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefieldvalue)
 	if err != nil {
@@ -23098,6 +23159,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23310,6 +23372,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefieldvalue)
 	if err != nil {
@@ -23463,6 +23526,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefieldvalue)
 	if err != nil {
@@ -23606,6 +23670,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/creativeFields/{id}")
@@ -23724,6 +23789,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23862,6 +23928,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefield)
 	if err != nil {
@@ -24078,6 +24145,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24286,6 +24354,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefield)
 	if err != nil {
@@ -24428,6 +24497,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefield)
 	if err != nil {
@@ -24573,6 +24643,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24711,6 +24782,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativegroup)
 	if err != nil {
@@ -24934,6 +25006,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25148,6 +25221,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativegroup)
 	if err != nil {
@@ -25290,6 +25364,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativegroup)
 	if err != nil {
@@ -25435,6 +25510,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25573,6 +25649,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creative)
 	if err != nil {
@@ -25890,6 +25967,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26205,6 +26283,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creative)
 	if err != nil {
@@ -26347,6 +26426,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creative)
 	if err != nil {
@@ -26496,6 +26576,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dimensionvaluerequest)
 	if err != nil {
@@ -26675,6 +26756,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26897,6 +26979,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27115,6 +27198,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27253,6 +27337,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.directorysite)
 	if err != nil {
@@ -27511,6 +27596,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27749,6 +27835,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/dynamicTargetingKeys/{objectId}")
@@ -27886,6 +27973,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dynamictargetingkey)
 	if err != nil {
@@ -28063,6 +28151,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28227,6 +28316,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/eventTags/{id}")
@@ -28345,6 +28435,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28483,6 +28574,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.eventtag)
 	if err != nil {
@@ -28734,6 +28826,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28947,6 +29040,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.eventtag)
 	if err != nil {
@@ -29089,6 +29183,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.eventtag)
 	if err != nil {
@@ -29234,6 +29329,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -29446,6 +29542,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -29653,6 +29750,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/floodlightActivities/{id}")
@@ -29766,6 +29864,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/floodlightActivities/generatetag")
@@ -29910,6 +30009,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30048,6 +30148,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivity)
 	if err != nil {
@@ -30319,6 +30420,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30567,6 +30669,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivity)
 	if err != nil {
@@ -30709,6 +30812,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivity)
 	if err != nil {
@@ -30854,6 +30958,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30992,6 +31097,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivitygroup)
 	if err != nil {
@@ -31228,6 +31334,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31455,6 +31562,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivitygroup)
 	if err != nil {
@@ -31597,6 +31705,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivitygroup)
 	if err != nil {
@@ -31742,6 +31851,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31902,6 +32012,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32041,6 +32152,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightconfiguration)
 	if err != nil {
@@ -32183,6 +32295,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightconfiguration)
 	if err != nil {
@@ -32330,6 +32443,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32576,6 +32690,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32813,6 +32928,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/campaigns/{campaignId}/landingPages/{id}")
@@ -32942,6 +33058,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33091,6 +33208,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.landingpage)
 	if err != nil {
@@ -33245,6 +33363,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33387,6 +33506,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.landingpage)
 	if err != nil {
@@ -33540,6 +33660,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.landingpage)
 	if err != nil {
@@ -33692,6 +33813,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33832,6 +33954,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33979,6 +34102,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34119,6 +34243,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34266,6 +34391,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34407,6 +34533,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34554,6 +34681,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34696,6 +34824,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34945,6 +35074,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35185,6 +35315,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35414,6 +35545,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35640,6 +35772,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35778,6 +35911,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementgroup)
 	if err != nil {
@@ -36123,6 +36257,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36426,6 +36561,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementgroup)
 	if err != nil {
@@ -36568,6 +36704,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementgroup)
 	if err != nil {
@@ -36702,6 +36839,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/placementStrategies/{id}")
@@ -36820,6 +36958,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36958,6 +37097,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementstrategy)
 	if err != nil {
@@ -37163,6 +37303,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -37364,6 +37505,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementstrategy)
 	if err != nil {
@@ -37506,6 +37648,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementstrategy)
 	if err != nil {
@@ -37683,6 +37826,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/placements/generatetags")
@@ -37879,6 +38023,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -38017,6 +38162,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placement)
 	if err != nil {
@@ -38397,6 +38543,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -38734,6 +38881,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placement)
 	if err != nil {
@@ -38876,6 +39024,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placement)
 	if err != nil {
@@ -39021,6 +39170,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39168,6 +39318,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39308,6 +39459,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39454,6 +39606,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39594,6 +39747,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39813,6 +39967,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40028,6 +40183,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40168,6 +40324,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40308,6 +40465,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglistshare)
 	if err != nil {
@@ -40450,6 +40608,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglistshare)
 	if err != nil {
@@ -40595,6 +40754,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40733,6 +40893,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglist)
 	if err != nil {
@@ -40942,6 +41103,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41155,6 +41317,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglist)
 	if err != nil {
@@ -41297,6 +41460,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglist)
 	if err != nil {
@@ -41431,6 +41595,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/reports/{reportId}")
@@ -41549,6 +41714,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41687,6 +41853,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
 	if err != nil {
@@ -41878,6 +42045,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42087,6 +42255,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
 	if err != nil {
@@ -42237,6 +42406,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/reports/{reportId}/run")
@@ -42379,6 +42549,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
 	if err != nil {
@@ -42524,6 +42695,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
 	if err != nil {
@@ -42671,6 +42843,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42882,6 +43055,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43093,6 +43267,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43231,6 +43406,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.site)
 	if err != nil {
@@ -43508,6 +43684,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43759,6 +43936,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.site)
 	if err != nil {
@@ -43901,6 +44079,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.site)
 	if err != nil {
@@ -44046,6 +44225,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44184,6 +44364,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.size)
 	if err != nil {
@@ -44359,6 +44540,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44523,6 +44705,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44661,6 +44844,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subaccount)
 	if err != nil {
@@ -44865,6 +45049,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45066,6 +45251,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subaccount)
 	if err != nil {
@@ -45208,6 +45394,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subaccount)
 	if err != nil {
@@ -45353,6 +45540,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45558,6 +45746,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45773,6 +45962,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45910,6 +46100,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46036,6 +46227,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46183,6 +46375,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46324,6 +46517,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46482,6 +46676,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46618,6 +46813,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/userRoles/{id}")
@@ -46736,6 +46932,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46874,6 +47071,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userrole)
 	if err != nil {
@@ -47093,6 +47291,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47305,6 +47504,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userrole)
 	if err != nil {
@@ -47447,6 +47647,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userrole)
 	if err != nil {
diff --git a/dfareporting/v2.5beta1/dfareporting-gen.go b/dfareporting/v2.5beta1/dfareporting-gen.go
index dca0f14..b0425a3 100644
--- a/dfareporting/v2.5beta1/dfareporting-gen.go
+++ b/dfareporting/v2.5beta1/dfareporting-gen.go
@@ -124,9 +124,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	AccountActiveAdSummaries *AccountActiveAdSummariesService
 
@@ -250,6 +251,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountActiveAdSummariesService(s *Service) *AccountActiveAdSummariesService {
 	rs := &AccountActiveAdSummariesService{s: s}
 	return rs
@@ -13014,6 +13019,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13163,6 +13169,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13310,6 +13317,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13451,6 +13459,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13598,6 +13607,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13738,6 +13748,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13876,6 +13887,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountuserprofile)
 	if err != nil {
@@ -14102,6 +14114,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14320,6 +14333,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountuserprofile)
 	if err != nil {
@@ -14462,6 +14476,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountuserprofile)
 	if err != nil {
@@ -14607,6 +14622,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14823,6 +14839,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15029,6 +15046,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -15171,6 +15189,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -15316,6 +15335,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15454,6 +15474,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ad)
 	if err != nil {
@@ -15864,6 +15885,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16251,6 +16273,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ad)
 	if err != nil {
@@ -16393,6 +16416,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ad)
 	if err != nil {
@@ -16527,6 +16551,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/advertiserGroups/{id}")
@@ -16645,6 +16670,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16783,6 +16809,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertisergroup)
 	if err != nil {
@@ -16988,6 +17015,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17189,6 +17217,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertisergroup)
 	if err != nil {
@@ -17331,6 +17360,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertisergroup)
 	if err != nil {
@@ -17476,6 +17506,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17614,6 +17645,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertiser)
 	if err != nil {
@@ -17874,6 +17906,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18118,6 +18151,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertiser)
 	if err != nil {
@@ -18260,6 +18294,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertiser)
 	if err != nil {
@@ -18403,6 +18438,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18536,6 +18572,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.campaigncreativeassociation)
 	if err != nil {
@@ -18716,6 +18753,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18912,6 +18950,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19052,6 +19091,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.campaign)
 	if err != nil {
@@ -19335,6 +19375,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19579,6 +19620,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.campaign)
 	if err != nil {
@@ -19721,6 +19763,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.campaign)
 	if err != nil {
@@ -19866,6 +19909,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20168,6 +20212,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20544,6 +20589,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20710,6 +20756,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20857,6 +20904,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20986,6 +21034,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/contentCategories/{id}")
@@ -21104,6 +21153,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21242,6 +21292,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.contentcategory)
 	if err != nil {
@@ -21447,6 +21498,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21648,6 +21700,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.contentcategory)
 	if err != nil {
@@ -21790,6 +21843,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.contentcategory)
 	if err != nil {
@@ -21924,6 +21978,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.conversionsbatchinsertrequest)
 	if err != nil {
@@ -22069,6 +22124,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22216,6 +22272,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22400,6 +22457,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativeassetmetadata)
 	if err != nil {
@@ -22610,6 +22668,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}")
@@ -22739,6 +22798,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22888,6 +22948,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefieldvalue)
 	if err != nil {
@@ -23098,6 +23159,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23310,6 +23372,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefieldvalue)
 	if err != nil {
@@ -23463,6 +23526,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefieldvalue)
 	if err != nil {
@@ -23606,6 +23670,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/creativeFields/{id}")
@@ -23724,6 +23789,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23862,6 +23928,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefield)
 	if err != nil {
@@ -24078,6 +24145,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24286,6 +24354,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefield)
 	if err != nil {
@@ -24428,6 +24497,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefield)
 	if err != nil {
@@ -24573,6 +24643,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24711,6 +24782,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativegroup)
 	if err != nil {
@@ -24934,6 +25006,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25148,6 +25221,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativegroup)
 	if err != nil {
@@ -25290,6 +25364,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativegroup)
 	if err != nil {
@@ -25435,6 +25510,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25573,6 +25649,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creative)
 	if err != nil {
@@ -25890,6 +25967,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26205,6 +26283,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creative)
 	if err != nil {
@@ -26347,6 +26426,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creative)
 	if err != nil {
@@ -26496,6 +26576,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dimensionvaluerequest)
 	if err != nil {
@@ -26675,6 +26756,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26897,6 +26979,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27115,6 +27198,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27253,6 +27337,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.directorysite)
 	if err != nil {
@@ -27511,6 +27596,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27749,6 +27835,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/dynamicTargetingKeys/{objectId}")
@@ -27886,6 +27973,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dynamictargetingkey)
 	if err != nil {
@@ -28063,6 +28151,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28227,6 +28316,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/eventTags/{id}")
@@ -28345,6 +28435,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28483,6 +28574,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.eventtag)
 	if err != nil {
@@ -28734,6 +28826,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28947,6 +29040,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.eventtag)
 	if err != nil {
@@ -29089,6 +29183,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.eventtag)
 	if err != nil {
@@ -29234,6 +29329,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -29446,6 +29542,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -29653,6 +29750,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/floodlightActivities/{id}")
@@ -29766,6 +29864,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/floodlightActivities/generatetag")
@@ -29910,6 +30009,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30048,6 +30148,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivity)
 	if err != nil {
@@ -30319,6 +30420,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30567,6 +30669,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivity)
 	if err != nil {
@@ -30709,6 +30812,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivity)
 	if err != nil {
@@ -30854,6 +30958,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30992,6 +31097,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivitygroup)
 	if err != nil {
@@ -31228,6 +31334,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31455,6 +31562,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivitygroup)
 	if err != nil {
@@ -31597,6 +31705,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivitygroup)
 	if err != nil {
@@ -31742,6 +31851,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31902,6 +32012,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32041,6 +32152,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightconfiguration)
 	if err != nil {
@@ -32183,6 +32295,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightconfiguration)
 	if err != nil {
@@ -32330,6 +32443,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32576,6 +32690,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32813,6 +32928,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/campaigns/{campaignId}/landingPages/{id}")
@@ -32942,6 +33058,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33091,6 +33208,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.landingpage)
 	if err != nil {
@@ -33245,6 +33363,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33387,6 +33506,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.landingpage)
 	if err != nil {
@@ -33540,6 +33660,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.landingpage)
 	if err != nil {
@@ -33692,6 +33813,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33832,6 +33954,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33979,6 +34102,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34119,6 +34243,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34266,6 +34391,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34407,6 +34533,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34554,6 +34681,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34696,6 +34824,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34945,6 +35074,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35185,6 +35315,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35414,6 +35545,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35640,6 +35772,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35778,6 +35911,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementgroup)
 	if err != nil {
@@ -36123,6 +36257,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36426,6 +36561,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementgroup)
 	if err != nil {
@@ -36568,6 +36704,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementgroup)
 	if err != nil {
@@ -36702,6 +36839,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/placementStrategies/{id}")
@@ -36820,6 +36958,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36958,6 +37097,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementstrategy)
 	if err != nil {
@@ -37163,6 +37303,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -37364,6 +37505,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementstrategy)
 	if err != nil {
@@ -37506,6 +37648,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementstrategy)
 	if err != nil {
@@ -37683,6 +37826,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/placements/generatetags")
@@ -37879,6 +38023,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -38017,6 +38162,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placement)
 	if err != nil {
@@ -38397,6 +38543,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -38734,6 +38881,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placement)
 	if err != nil {
@@ -38876,6 +39024,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placement)
 	if err != nil {
@@ -39021,6 +39170,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39168,6 +39318,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39308,6 +39459,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39454,6 +39606,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39594,6 +39747,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39813,6 +39967,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40028,6 +40183,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40168,6 +40324,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40308,6 +40465,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglistshare)
 	if err != nil {
@@ -40450,6 +40608,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglistshare)
 	if err != nil {
@@ -40595,6 +40754,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40733,6 +40893,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglist)
 	if err != nil {
@@ -40942,6 +41103,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41155,6 +41317,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglist)
 	if err != nil {
@@ -41297,6 +41460,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglist)
 	if err != nil {
@@ -41431,6 +41595,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/reports/{reportId}")
@@ -41549,6 +41714,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41687,6 +41853,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
 	if err != nil {
@@ -41878,6 +42045,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42087,6 +42255,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
 	if err != nil {
@@ -42237,6 +42406,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/reports/{reportId}/run")
@@ -42379,6 +42549,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
 	if err != nil {
@@ -42524,6 +42695,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
 	if err != nil {
@@ -42671,6 +42843,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42882,6 +43055,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43093,6 +43267,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43231,6 +43406,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.site)
 	if err != nil {
@@ -43508,6 +43684,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43759,6 +43936,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.site)
 	if err != nil {
@@ -43901,6 +44079,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.site)
 	if err != nil {
@@ -44046,6 +44225,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44184,6 +44364,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.size)
 	if err != nil {
@@ -44359,6 +44540,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44523,6 +44705,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44661,6 +44844,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subaccount)
 	if err != nil {
@@ -44865,6 +45049,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45066,6 +45251,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subaccount)
 	if err != nil {
@@ -45208,6 +45394,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subaccount)
 	if err != nil {
@@ -45353,6 +45540,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45558,6 +45746,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45773,6 +45962,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45910,6 +46100,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46036,6 +46227,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46183,6 +46375,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46324,6 +46517,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46482,6 +46676,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46618,6 +46813,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/userRoles/{id}")
@@ -46736,6 +46932,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46874,6 +47071,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userrole)
 	if err != nil {
@@ -47093,6 +47291,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47305,6 +47504,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userrole)
 	if err != nil {
@@ -47447,6 +47647,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userrole)
 	if err != nil {
diff --git a/dfareporting/v2.6/dfareporting-gen.go b/dfareporting/v2.6/dfareporting-gen.go
index a3b5a83..b90a99c 100644
--- a/dfareporting/v2.6/dfareporting-gen.go
+++ b/dfareporting/v2.6/dfareporting-gen.go
@@ -126,9 +126,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	AccountActiveAdSummaries *AccountActiveAdSummariesService
 
@@ -256,6 +257,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountActiveAdSummariesService(s *Service) *AccountActiveAdSummariesService {
 	rs := &AccountActiveAdSummariesService{s: s}
 	return rs
@@ -13404,6 +13409,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13553,6 +13559,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13700,6 +13707,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13841,6 +13849,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13988,6 +13997,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14128,6 +14138,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14266,6 +14277,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountuserprofile)
 	if err != nil {
@@ -14492,6 +14504,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14710,6 +14723,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountuserprofile)
 	if err != nil {
@@ -14852,6 +14866,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accountuserprofile)
 	if err != nil {
@@ -14997,6 +15012,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15213,6 +15229,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15419,6 +15436,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -15561,6 +15579,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -15706,6 +15725,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15844,6 +15864,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ad)
 	if err != nil {
@@ -16254,6 +16275,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16641,6 +16663,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ad)
 	if err != nil {
@@ -16783,6 +16806,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ad)
 	if err != nil {
@@ -16917,6 +16941,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/advertiserGroups/{id}")
@@ -17035,6 +17060,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17173,6 +17199,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertisergroup)
 	if err != nil {
@@ -17378,6 +17405,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17579,6 +17607,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertisergroup)
 	if err != nil {
@@ -17721,6 +17750,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertisergroup)
 	if err != nil {
@@ -17866,6 +17896,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18004,6 +18035,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertiser)
 	if err != nil {
@@ -18264,6 +18296,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18508,6 +18541,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertiser)
 	if err != nil {
@@ -18650,6 +18684,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.advertiser)
 	if err != nil {
@@ -18793,6 +18828,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18926,6 +18962,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.campaigncreativeassociation)
 	if err != nil {
@@ -19106,6 +19143,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19302,6 +19340,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19442,6 +19481,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.campaign)
 	if err != nil {
@@ -19725,6 +19765,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19969,6 +20010,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.campaign)
 	if err != nil {
@@ -20111,6 +20153,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.campaign)
 	if err != nil {
@@ -20256,6 +20299,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20558,6 +20602,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20934,6 +20979,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21100,6 +21146,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21247,6 +21294,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21376,6 +21424,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/contentCategories/{id}")
@@ -21494,6 +21543,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21632,6 +21682,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.contentcategory)
 	if err != nil {
@@ -21837,6 +21888,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22038,6 +22090,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.contentcategory)
 	if err != nil {
@@ -22180,6 +22233,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.contentcategory)
 	if err != nil {
@@ -22314,6 +22368,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.conversionsbatchinsertrequest)
 	if err != nil {
@@ -22459,6 +22514,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22606,6 +22662,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22790,6 +22847,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativeassetmetadata)
 	if err != nil {
@@ -23000,6 +23058,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}")
@@ -23129,6 +23188,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23278,6 +23338,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefieldvalue)
 	if err != nil {
@@ -23488,6 +23549,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -23700,6 +23762,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefieldvalue)
 	if err != nil {
@@ -23853,6 +23916,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefieldvalue)
 	if err != nil {
@@ -23996,6 +24060,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/creativeFields/{id}")
@@ -24114,6 +24179,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24252,6 +24318,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefield)
 	if err != nil {
@@ -24468,6 +24535,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -24676,6 +24744,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefield)
 	if err != nil {
@@ -24818,6 +24887,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativefield)
 	if err != nil {
@@ -24963,6 +25033,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25101,6 +25172,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativegroup)
 	if err != nil {
@@ -25324,6 +25396,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25538,6 +25611,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativegroup)
 	if err != nil {
@@ -25680,6 +25754,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creativegroup)
 	if err != nil {
@@ -25825,6 +25900,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -25963,6 +26039,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creative)
 	if err != nil {
@@ -26280,6 +26357,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -26595,6 +26673,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creative)
 	if err != nil {
@@ -26737,6 +26816,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.creative)
 	if err != nil {
@@ -26886,6 +26966,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dimensionvaluerequest)
 	if err != nil {
@@ -27065,6 +27146,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27287,6 +27369,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27505,6 +27588,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -27643,6 +27727,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.directorysite)
 	if err != nil {
@@ -27901,6 +27986,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28139,6 +28225,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/dynamicTargetingKeys/{objectId}")
@@ -28276,6 +28363,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dynamictargetingkey)
 	if err != nil {
@@ -28453,6 +28541,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28617,6 +28706,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/eventTags/{id}")
@@ -28735,6 +28825,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -28873,6 +28964,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.eventtag)
 	if err != nil {
@@ -29124,6 +29216,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -29337,6 +29430,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.eventtag)
 	if err != nil {
@@ -29479,6 +29573,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.eventtag)
 	if err != nil {
@@ -29624,6 +29719,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -29836,6 +29932,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30043,6 +30140,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/floodlightActivities/{id}")
@@ -30156,6 +30254,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/floodlightActivities/generatetag")
@@ -30300,6 +30399,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30438,6 +30538,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivity)
 	if err != nil {
@@ -30709,6 +30810,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -30957,6 +31059,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivity)
 	if err != nil {
@@ -31099,6 +31202,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivity)
 	if err != nil {
@@ -31244,6 +31348,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31382,6 +31487,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivitygroup)
 	if err != nil {
@@ -31618,6 +31724,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -31845,6 +31952,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivitygroup)
 	if err != nil {
@@ -31987,6 +32095,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightactivitygroup)
 	if err != nil {
@@ -32132,6 +32241,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32292,6 +32402,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32431,6 +32542,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightconfiguration)
 	if err != nil {
@@ -32573,6 +32685,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.floodlightconfiguration)
 	if err != nil {
@@ -32720,6 +32833,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -32966,6 +33080,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33203,6 +33318,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/campaigns/{campaignId}/landingPages/{id}")
@@ -33332,6 +33448,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33481,6 +33598,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.landingpage)
 	if err != nil {
@@ -33635,6 +33753,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -33777,6 +33896,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.landingpage)
 	if err != nil {
@@ -33930,6 +34050,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.landingpage)
 	if err != nil {
@@ -34082,6 +34203,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34220,6 +34342,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34360,6 +34483,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34507,6 +34631,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34647,6 +34772,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34794,6 +34920,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -34935,6 +35062,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35082,6 +35210,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35224,6 +35353,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35473,6 +35603,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35713,6 +35844,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -35942,6 +36074,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36168,6 +36301,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36306,6 +36440,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementgroup)
 	if err != nil {
@@ -36651,6 +36786,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -36954,6 +37090,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementgroup)
 	if err != nil {
@@ -37096,6 +37233,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementgroup)
 	if err != nil {
@@ -37230,6 +37368,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/placementStrategies/{id}")
@@ -37348,6 +37487,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -37486,6 +37626,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementstrategy)
 	if err != nil {
@@ -37691,6 +37832,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -37892,6 +38034,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementstrategy)
 	if err != nil {
@@ -38034,6 +38177,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placementstrategy)
 	if err != nil {
@@ -38211,6 +38355,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/placements/generatetags")
@@ -38407,6 +38552,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -38545,6 +38691,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placement)
 	if err != nil {
@@ -38925,6 +39072,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39262,6 +39410,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placement)
 	if err != nil {
@@ -39404,6 +39553,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.placement)
 	if err != nil {
@@ -39549,6 +39699,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39696,6 +39847,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39836,6 +39988,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -39982,6 +40135,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40122,6 +40276,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40341,6 +40496,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40556,6 +40712,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40696,6 +40853,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -40836,6 +40994,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglistshare)
 	if err != nil {
@@ -40978,6 +41137,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglistshare)
 	if err != nil {
@@ -41123,6 +41283,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41261,6 +41422,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglist)
 	if err != nil {
@@ -41470,6 +41632,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -41683,6 +41846,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglist)
 	if err != nil {
@@ -41825,6 +41989,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.remarketinglist)
 	if err != nil {
@@ -41959,6 +42124,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/reports/{reportId}")
@@ -42077,6 +42243,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42215,6 +42382,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
 	if err != nil {
@@ -42406,6 +42574,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -42615,6 +42784,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
 	if err != nil {
@@ -42765,6 +42935,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/reports/{reportId}/run")
@@ -42907,6 +43078,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
 	if err != nil {
@@ -43052,6 +43224,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.report)
 	if err != nil {
@@ -43199,6 +43372,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43410,6 +43584,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43621,6 +43796,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -43759,6 +43935,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.site)
 	if err != nil {
@@ -44036,6 +44213,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44287,6 +44465,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.site)
 	if err != nil {
@@ -44429,6 +44608,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.site)
 	if err != nil {
@@ -44574,6 +44754,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -44712,6 +44893,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.size)
 	if err != nil {
@@ -44887,6 +45069,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45051,6 +45234,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45189,6 +45373,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subaccount)
 	if err != nil {
@@ -45393,6 +45578,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -45594,6 +45780,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subaccount)
 	if err != nil {
@@ -45736,6 +45923,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subaccount)
 	if err != nil {
@@ -45881,6 +46069,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46086,6 +46275,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46303,6 +46493,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46441,6 +46632,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetingtemplate)
 	if err != nil {
@@ -46652,6 +46844,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -46859,6 +47052,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetingtemplate)
 	if err != nil {
@@ -47001,6 +47195,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetingtemplate)
 	if err != nil {
@@ -47144,6 +47339,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47281,6 +47477,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47407,6 +47604,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47554,6 +47752,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47695,6 +47894,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47853,6 +48053,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -47989,6 +48190,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "userprofiles/{profileId}/userRoles/{id}")
@@ -48107,6 +48309,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -48245,6 +48448,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userrole)
 	if err != nil {
@@ -48464,6 +48668,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -48676,6 +48881,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userrole)
 	if err != nil {
@@ -48818,6 +49024,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.userrole)
 	if err != nil {
diff --git a/discovery/v1/discovery-gen.go b/discovery/v1/discovery-gen.go
index 9192e275..ae63aff 100644
--- a/discovery/v1/discovery-gen.go
+++ b/discovery/v1/discovery-gen.go
@@ -55,9 +55,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Apis *ApisService
 }
@@ -69,6 +70,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewApisService(s *Service) *ApisService {
 	rs := &ApisService{s: s}
 	return rs
@@ -1005,6 +1010,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1159,6 +1165,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/dns/v1/dns-gen.go b/dns/v1/dns-gen.go
index fa66410..675111a 100644
--- a/dns/v1/dns-gen.go
+++ b/dns/v1/dns-gen.go
@@ -73,9 +73,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Changes *ChangesService
 
@@ -93,6 +94,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewChangesService(s *Service) *ChangesService {
 	rs := &ChangesService{s: s}
 	return rs
@@ -588,6 +593,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.change)
 	if err != nil {
@@ -743,6 +749,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -934,6 +941,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1122,6 +1130,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.managedzone)
 	if err != nil {
@@ -1256,6 +1265,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/managedZones/{managedZone}")
@@ -1373,6 +1383,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1545,6 +1556,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1722,6 +1734,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1896,6 +1909,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/dns/v2beta1/dns-gen.go b/dns/v2beta1/dns-gen.go
index 303d5c4..1443855 100644
--- a/dns/v2beta1/dns-gen.go
+++ b/dns/v2beta1/dns-gen.go
@@ -75,9 +75,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Changes *ChangesService
 
@@ -99,6 +100,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewChangesService(s *Service) *ChangesService {
 	rs := &ChangesService{s: s}
 	return rs
@@ -1176,6 +1181,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.change)
 	if err != nil {
@@ -1345,6 +1351,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1541,6 +1548,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1760,6 +1768,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1953,6 +1962,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2151,6 +2161,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2341,6 +2352,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2536,6 +2548,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.managedzone)
 	if err != nil {
@@ -2684,6 +2697,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/managedZones/{managedZone}")
@@ -2843,6 +2857,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3020,6 +3035,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3200,6 +3216,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.managedzone)
 	if err != nil {
@@ -3358,6 +3375,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.managedzone)
 	if err != nil {
@@ -3523,6 +3541,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3702,6 +3721,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/doubleclickbidmanager/v1/doubleclickbidmanager-gen.go b/doubleclickbidmanager/v1/doubleclickbidmanager-gen.go
index 2d49fa7..8585004 100644
--- a/doubleclickbidmanager/v1/doubleclickbidmanager-gen.go
+++ b/doubleclickbidmanager/v1/doubleclickbidmanager-gen.go
@@ -58,9 +58,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Lineitems *LineitemsService
 
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewLineitemsService(s *Service) *LineitemsService {
 	rs := &LineitemsService{s: s}
 	return rs
@@ -1659,6 +1664,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.downloadlineitemsrequest)
 	if err != nil {
@@ -1773,6 +1779,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.uploadlineitemsrequest)
 	if err != nil {
@@ -1887,6 +1894,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.query)
 	if err != nil {
@@ -2002,6 +2010,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "query/{queryId}")
@@ -2106,6 +2115,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2239,6 +2249,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2350,6 +2361,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.runqueryrequest)
 	if err != nil {
@@ -2462,6 +2474,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2586,6 +2599,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.downloadrequest)
 	if err != nil {
diff --git a/doubleclicksearch/v2/doubleclicksearch-api.json b/doubleclicksearch/v2/doubleclicksearch-api.json
index d802110..2826580 100644
--- a/doubleclicksearch/v2/doubleclicksearch-api.json
+++ b/doubleclicksearch/v2/doubleclicksearch-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/HRuJCCIlMtHocq2WCX0lbnhTmso\"",
+ "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/moKwEsFuKXY57BghNYmOvjYDG_c\"",
  "discoveryVersion": "v1",
  "id": "doubleclicksearch:v2",
  "name": "doubleclicksearch",
  "version": "v2",
- "revision": "20161108",
+ "revision": "20170207",
  "title": "DoubleClick Search API",
  "description": "Reports and modifies your advertising data in DoubleClick Search (for example, campaigns, ad groups, keywords, and conversions).",
  "ownerDomain": "google.com",
@@ -175,7 +175,7 @@
     },
     "conversionId": {
      "type": "string",
-     "description": "For offline conversions, this is an ID that advertisers are required to provide. Advertisers can specify any ID that is meaningful to them. For online conversions, DS copies the dsConversionId or floodlightOrderId into this property depending on the advertiser's Floodlight instructions.",
+     "description": "For offline conversions, advertisers provide this ID. Advertisers can specify any ID that is meaningful to them. Each conversion in a request must specify a unique ID, and the combination of ID and timestamp must be unique amongst all conversions within the advertiser.\nFor online conversions, DS copies the dsConversionId or floodlightOrderId into this property depending on the advertiser's Floodlight instructions.",
      "annotations": {
       "required": [
        "doubleclicksearch.conversion.insert"
diff --git a/doubleclicksearch/v2/doubleclicksearch-gen.go b/doubleclicksearch/v2/doubleclicksearch-gen.go
index c980271..16e571f 100644
--- a/doubleclicksearch/v2/doubleclicksearch-gen.go
+++ b/doubleclicksearch/v2/doubleclicksearch-gen.go
@@ -63,9 +63,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Conversion *ConversionService
 
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewConversionService(s *Service) *ConversionService {
 	rs := &ConversionService{s: s}
 	return rs
@@ -186,11 +191,14 @@
 	// ClickId: DS click ID for the conversion.
 	ClickId string `json:"clickId,omitempty"`
 
-	// ConversionId: For offline conversions, this is an ID that advertisers
-	// are required to provide. Advertisers can specify any ID that is
-	// meaningful to them. For online conversions, DS copies the
-	// dsConversionId or floodlightOrderId into this property depending on
-	// the advertiser's Floodlight instructions.
+	// ConversionId: For offline conversions, advertisers provide this ID.
+	// Advertisers can specify any ID that is meaningful to them. Each
+	// conversion in a request must specify a unique ID, and the combination
+	// of ID and timestamp must be unique amongst all conversions within the
+	// advertiser.
+	// For online conversions, DS copies the dsConversionId or
+	// floodlightOrderId into this property depending on the advertiser's
+	// Floodlight instructions.
 	ConversionId string `json:"conversionId,omitempty"`
 
 	// ConversionModifiedTimestamp: The time at which the conversion was
@@ -1096,6 +1104,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1303,6 +1312,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.conversionlist)
 	if err != nil {
@@ -1428,6 +1438,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.conversionlist)
 	if err != nil {
@@ -1611,6 +1622,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.conversionlist)
 	if err != nil {
@@ -1729,6 +1741,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.updateavailabilityrequest)
 	if err != nil {
@@ -1847,6 +1860,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.reportrequest)
 	if err != nil {
@@ -1976,6 +1990,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2115,6 +2130,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2241,6 +2257,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.reportrequest)
 	if err != nil {
@@ -2372,6 +2389,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/drive/v2/drive-api.json b/drive/v2/drive-api.json
index 15dbba6..70aeb93 100644
--- a/drive/v2/drive-api.json
+++ b/drive/v2/drive-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/aTsDjhJX4jyEgcQh1bdOjEtV2EI\"",
+ "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/5vvnUnaYZD7vqEjmjYVCOzuEk5s\"",
  "discoveryVersion": "v1",
  "id": "drive:v2",
  "name": "drive",
  "version": "v2",
- "revision": "20170113",
+ "revision": "20170207",
  "title": "Drive API",
  "description": "Manages files in Drive including uploading, downloading, searching, detecting changes, and updating sharing permissions.",
  "ownerDomain": "google.com",
@@ -1755,6 +1755,21 @@
     }
    }
   },
+  "StartPageToken": {
+   "id": "StartPageToken",
+   "type": "object",
+   "properties": {
+    "kind": {
+     "type": "string",
+     "description": "Identifies what kind of resource this is. Value: the fixed string \"drive#startPageToken\".",
+     "default": "drive#startPageToken"
+    },
+    "startPageToken": {
+     "type": "string",
+     "description": "The starting page token for listing changes."
+    }
+   }
+  },
   "User": {
    "id": "User",
    "type": "object",
@@ -1934,6 +1949,25 @@
       "https://www.googleapis.com/auth/drive.readonly"
      ]
     },
+    "getStartPageToken": {
+     "id": "drive.changes.getStartPageToken",
+     "path": "changes/startPageToken",
+     "httpMethod": "GET",
+     "description": "Gets the starting pageToken for listing future changes.",
+     "response": {
+      "$ref": "StartPageToken"
+     },
+     "scopes": [
+      "https://www.googleapis.com/auth/drive",
+      "https://www.googleapis.com/auth/drive.appdata",
+      "https://www.googleapis.com/auth/drive.apps.readonly",
+      "https://www.googleapis.com/auth/drive.file",
+      "https://www.googleapis.com/auth/drive.metadata",
+      "https://www.googleapis.com/auth/drive.metadata.readonly",
+      "https://www.googleapis.com/auth/drive.photos.readonly",
+      "https://www.googleapis.com/auth/drive.readonly"
+     ]
+    },
     "list": {
      "id": "drive.changes.list",
      "path": "changes",
@@ -1962,7 +1996,7 @@
       },
       "pageToken": {
        "type": "string",
-       "description": "Page token for changes.",
+       "description": "The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.",
        "location": "query"
       },
       "spaces": {
@@ -2020,7 +2054,7 @@
       },
       "pageToken": {
        "type": "string",
-       "description": "Page token for changes.",
+       "description": "The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.",
        "location": "query"
       },
       "spaces": {
diff --git a/drive/v2/drive-gen.go b/drive/v2/drive-gen.go
index 32cadd6..22d7bad 100644
--- a/drive/v2/drive-gen.go
+++ b/drive/v2/drive-gen.go
@@ -98,9 +98,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	About *AboutService
 
@@ -136,6 +137,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAboutService(s *Service) *AboutService {
 	rs := &AboutService{s: s}
 	return rs
@@ -2518,6 +2523,41 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type StartPageToken struct {
+	// Kind: Identifies what kind of resource this is. Value: the fixed
+	// string "drive#startPageToken".
+	Kind string `json:"kind,omitempty"`
+
+	// StartPageToken: The starting page token for listing changes.
+	StartPageToken string `json:"startPageToken,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "Kind") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Kind") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *StartPageToken) MarshalJSON() ([]byte, error) {
+	type noMethod StartPageToken
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // User: Information about a Drive user.
 type User struct {
 	// DisplayName: A plain text displayable name for this user.
@@ -2674,6 +2714,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2824,6 +2865,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2995,6 +3037,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3137,6 +3180,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3222,6 +3266,136 @@
 
 }
 
+// method id "drive.changes.getStartPageToken":
+
+type ChangesGetStartPageTokenCall struct {
+	s            *Service
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// GetStartPageToken: Gets the starting pageToken for listing future
+// changes.
+func (r *ChangesService) GetStartPageToken() *ChangesGetStartPageTokenCall {
+	c := &ChangesGetStartPageTokenCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ChangesGetStartPageTokenCall) Fields(s ...googleapi.Field) *ChangesGetStartPageTokenCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *ChangesGetStartPageTokenCall) IfNoneMatch(entityTag string) *ChangesGetStartPageTokenCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ChangesGetStartPageTokenCall) Context(ctx context.Context) *ChangesGetStartPageTokenCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ChangesGetStartPageTokenCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ChangesGetStartPageTokenCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "changes/startPageToken")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "drive.changes.getStartPageToken" call.
+// Exactly one of *StartPageToken or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *StartPageToken.ServerResponse.Header or (if a response was returned
+// at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *ChangesGetStartPageTokenCall) Do(opts ...googleapi.CallOption) (*StartPageToken, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &StartPageToken{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Gets the starting pageToken for listing future changes.",
+	//   "httpMethod": "GET",
+	//   "id": "drive.changes.getStartPageToken",
+	//   "path": "changes/startPageToken",
+	//   "response": {
+	//     "$ref": "StartPageToken"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/drive",
+	//     "https://www.googleapis.com/auth/drive.appdata",
+	//     "https://www.googleapis.com/auth/drive.apps.readonly",
+	//     "https://www.googleapis.com/auth/drive.file",
+	//     "https://www.googleapis.com/auth/drive.metadata",
+	//     "https://www.googleapis.com/auth/drive.metadata.readonly",
+	//     "https://www.googleapis.com/auth/drive.photos.readonly",
+	//     "https://www.googleapis.com/auth/drive.readonly"
+	//   ]
+	// }
+
+}
+
 // method id "drive.changes.list":
 
 type ChangesListCall struct {
@@ -3261,8 +3435,10 @@
 	return c
 }
 
-// PageToken sets the optional parameter "pageToken": Page token for
-// changes.
+// PageToken sets the optional parameter "pageToken": The token for
+// continuing a previous list request on the next page. This should be
+// set to the value of 'nextPageToken' from the previous response or to
+// the response from the getStartPageToken method.
 func (c *ChangesListCall) PageToken(pageToken string) *ChangesListCall {
 	c.urlParams_.Set("pageToken", pageToken)
 	return c
@@ -3324,6 +3500,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3399,7 +3576,7 @@
 	//       "type": "integer"
 	//     },
 	//     "pageToken": {
-	//       "description": "Page token for changes.",
+	//       "description": "The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -3495,8 +3672,10 @@
 	return c
 }
 
-// PageToken sets the optional parameter "pageToken": Page token for
-// changes.
+// PageToken sets the optional parameter "pageToken": The token for
+// continuing a previous list request on the next page. This should be
+// set to the value of 'nextPageToken' from the previous response or to
+// the response from the getStartPageToken method.
 func (c *ChangesWatchCall) PageToken(pageToken string) *ChangesWatchCall {
 	c.urlParams_.Set("pageToken", pageToken)
 	return c
@@ -3548,6 +3727,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -3625,7 +3805,7 @@
 	//       "type": "integer"
 	//     },
 	//     "pageToken": {
-	//       "description": "Page token for changes.",
+	//       "description": "The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response or to the response from the getStartPageToken method.",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
@@ -3712,6 +3892,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -3811,6 +3992,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{folderId}/children/{childId}")
@@ -3928,6 +4110,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4070,6 +4253,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.childreference)
 	if err != nil {
@@ -4249,6 +4433,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4427,6 +4612,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/comments/{commentId}")
@@ -4552,6 +4738,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4696,6 +4883,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.comment)
 	if err != nil {
@@ -4871,6 +5059,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5050,6 +5239,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.comment)
 	if err != nil {
@@ -5194,6 +5384,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.comment)
 	if err != nil {
@@ -5392,6 +5583,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.file)
 	if err != nil {
@@ -5575,6 +5767,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}")
@@ -5670,6 +5863,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/trash")
@@ -5764,6 +5958,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5913,6 +6108,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6090,6 +6286,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6387,6 +6584,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.file)
 	if err != nil {
@@ -6701,6 +6899,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7011,6 +7210,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.file)
 	if err != nil {
@@ -7235,6 +7435,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/touch")
@@ -7363,6 +7564,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/trash")
@@ -7489,6 +7691,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/untrash")
@@ -7781,6 +7984,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.file)
 	if err != nil {
@@ -8107,6 +8311,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -8296,6 +8501,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/parents/{parentId}")
@@ -8413,6 +8619,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8555,6 +8762,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.parentreference)
 	if err != nil {
@@ -8699,6 +8907,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8833,6 +9042,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/permissions/{permissionId}")
@@ -8950,6 +9160,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9100,6 +9311,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9251,6 +9463,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.permission)
 	if err != nil {
@@ -9405,6 +9618,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9555,6 +9769,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.permission)
 	if err != nil {
@@ -9726,6 +9941,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.permission)
 	if err != nil {
@@ -9887,6 +10103,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/properties/{propertyKey}")
@@ -10019,6 +10236,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10168,6 +10386,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.property)
 	if err != nil {
@@ -10313,6 +10532,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10457,6 +10677,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.property)
 	if err != nil {
@@ -10616,6 +10837,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.property)
 	if err != nil {
@@ -10785,6 +11007,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10974,6 +11197,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/realtime")
@@ -11144,6 +11368,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/comments/{commentId}/replies/{replyId}")
@@ -11278,6 +11503,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11432,6 +11658,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.commentreply)
 	if err != nil {
@@ -11609,6 +11836,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11793,6 +12021,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.commentreply)
 	if err != nil {
@@ -11947,6 +12176,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.commentreply)
 	if err != nil {
@@ -12097,6 +12327,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/revisions/{revisionId}")
@@ -12215,6 +12446,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12381,6 +12613,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12552,6 +12785,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.revision)
 	if err != nil {
@@ -12697,6 +12931,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.revision)
 	if err != nil {
diff --git a/drive/v3/drive-gen.go b/drive/v3/drive-gen.go
index 48c9553..d889e5d 100644
--- a/drive/v3/drive-gen.go
+++ b/drive/v3/drive-gen.go
@@ -90,9 +90,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	About *AboutService
 
@@ -118,6 +119,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAboutService(s *Service) *AboutService {
 	rs := &AboutService{s: s}
 	return rs
@@ -1712,6 +1717,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1840,6 +1846,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2001,6 +2008,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2192,6 +2200,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -2355,6 +2364,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -2453,6 +2463,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.comment)
 	if err != nil {
@@ -2587,6 +2598,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/comments/{commentId}")
@@ -2712,6 +2724,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2896,6 +2909,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3074,6 +3088,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.comment)
 	if err != nil {
@@ -3244,6 +3259,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.file)
 	if err != nil {
@@ -3483,6 +3499,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.file)
 	if err != nil {
@@ -3695,6 +3712,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}")
@@ -3790,6 +3808,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/trash")
@@ -3884,6 +3903,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4033,6 +4053,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4184,6 +4205,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4405,6 +4427,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4684,6 +4707,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.file)
 	if err != nil {
@@ -4922,6 +4946,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -5113,6 +5138,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.permission)
 	if err != nil {
@@ -5263,6 +5289,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/permissions/{permissionId}")
@@ -5380,6 +5407,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5530,6 +5558,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5681,6 +5710,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.permission)
 	if err != nil {
@@ -5837,6 +5867,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.reply)
 	if err != nil {
@@ -5981,6 +6012,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/comments/{commentId}/replies/{replyId}")
@@ -6116,6 +6148,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6302,6 +6335,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6485,6 +6519,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.reply)
 	if err != nil {
@@ -6636,6 +6671,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "files/{fileId}/revisions/{revisionId}")
@@ -6763,6 +6799,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6953,6 +6990,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7124,6 +7162,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.revision)
 	if err != nil {
diff --git a/firebasedynamiclinks/v1/firebasedynamiclinks-api.json b/firebasedynamiclinks/v1/firebasedynamiclinks-api.json
index 1bc1f6a..d8485dc 100644
--- a/firebasedynamiclinks/v1/firebasedynamiclinks-api.json
+++ b/firebasedynamiclinks/v1/firebasedynamiclinks-api.json
@@ -1,100 +1,33 @@
 {
+  "revision": "20170207",
+  "documentationLink": "https://firebase.google.com/docs/dynamic-links/",
+  "id": "firebasedynamiclinks:v1",
+  "discoveryVersion": "v1",
+  "version_module": "True",
   "schemas": {
-    "CreateShortDynamicLinkResponse": {
-      "id": "CreateShortDynamicLinkResponse",
-      "description": "Response to create a short Dynamic Link.",
-      "type": "object",
-      "properties": {
-        "shortLink": {
-          "description": "Short Dynamic Link value. e.g. https://abcd.app.goo.gl/wxyz",
-          "type": "string"
-        },
-        "previewLink": {
-          "description": "Preivew link to show the link flow chart.",
-          "type": "string"
-        },
-        "warning": {
-          "description": "Information about potential warnings on link creation.",
-          "type": "array",
-          "items": {
-            "$ref": "DynamicLinkWarning"
-          }
-        }
-      }
-    },
-    "IosInfo": {
-      "description": "iOS related attributes to the Dynamic Link..",
-      "type": "object",
-      "properties": {
-        "iosFallbackLink": {
-          "description": "Link to open on iOS if the app is not installed.",
-          "type": "string"
-        },
-        "iosAppStoreId": {
-          "description": "iOS App Store ID.",
-          "type": "string"
-        },
-        "iosIpadFallbackLink": {
-          "description": "If specified, this overrides the ios_fallback_link value on iPads.",
-          "type": "string"
-        },
-        "iosIpadBundleId": {
-          "description": "iPad bundle ID of the app.",
-          "type": "string"
-        },
-        "iosCustomScheme": {
-          "description": "Custom (destination) scheme to use for iOS. By default, we’ll use the\nbundle ID as the custom scheme. Developer can override this behavior using\nthis param.",
-          "type": "string"
-        },
-        "iosBundleId": {
-          "description": "iOS bundle ID of the app.",
-          "type": "string"
-        }
-      },
-      "id": "IosInfo"
-    },
-    "AnalyticsInfo": {
-      "id": "AnalyticsInfo",
-      "description": "Tracking parameters supported by Dynamic Link.",
-      "type": "object",
-      "properties": {
-        "itunesConnectAnalytics": {
-          "$ref": "ITunesConnectAnalytics",
-          "description": "iTunes Connect App Analytics."
-        },
-        "googlePlayAnalytics": {
-          "description": "Google Play Campaign Measurements.",
-          "$ref": "GooglePlayAnalytics"
-        }
-      }
-    },
     "CreateShortDynamicLinkRequest": {
-      "id": "CreateShortDynamicLinkRequest",
       "description": "Request to create a short Dynamic Link.",
       "type": "object",
       "properties": {
+        "dynamicLinkInfo": {
+          "$ref": "DynamicLinkInfo",
+          "description": "Information about the Dynamic Link to be shortened.\n[Learn more](https://firebase.google.com/docs/dynamic-links/android#create-a-dynamic-link-programmatically)."
+        },
         "longDynamicLink": {
           "description": "Full long Dynamic Link URL with desired query parameters specified.\nFor example,\n\"https://sample.app.goo.gl/?link=http://www.google.com&apn=com.sample\",\n[Learn more](https://firebase.google.com/docs/dynamic-links/android#create-a-dynamic-link-programmatically).",
           "type": "string"
         },
         "suffix": {
-          "description": "Short Dynamic Link suffix. Optional.",
-          "$ref": "Suffix"
-        },
-        "dynamicLinkInfo": {
-          "$ref": "DynamicLinkInfo",
-          "description": "Information about the Dynamic Link to be shortened.\n[Learn more](https://firebase.google.com/docs/dynamic-links/android#create-a-dynamic-link-programmatically)."
+          "$ref": "Suffix",
+          "description": "Short Dynamic Link suffix. Optional."
         }
-      }
+      },
+      "id": "CreateShortDynamicLinkRequest"
     },
     "Suffix": {
-      "id": "Suffix",
-      "description": "Short Dynamic Link suffix.",
       "type": "object",
       "properties": {
         "option": {
-          "description": "Suffix option.",
-          "type": "string",
           "enumDescriptions": [
             "The suffix option is not specified, performs as NOT_GUESSABLE .",
             "Short Dynamic Link suffix is a base62 [0-9A-Za-z] encoded string of\na random generated 96 bit random number, which has a length of 17 chars.\nFor example, \"nlAR8U4SlKRZw1cb2\".\nIt prevents other people from guessing and crawling short Dynamic Links\nthat contain personal identifiable information.",
@@ -104,19 +37,18 @@
             "OPTION_UNSPECIFIED",
             "UNGUESSABLE",
             "SHORT"
-          ]
+          ],
+          "description": "Suffix option.",
+          "type": "string"
         }
-      }
+      },
+      "id": "Suffix",
+      "description": "Short Dynamic Link suffix."
     },
     "GooglePlayAnalytics": {
-      "id": "GooglePlayAnalytics",
       "description": "Parameters for Google Play Campaign Measurements.\n[Learn more](https://developers.google.com/analytics/devguides/collection/android/v4/campaigns#campaign-params)",
       "type": "object",
       "properties": {
-        "utmMedium": {
-          "description": "Campaign medium; used to identify a medium such as email or cost-per-click.",
-          "type": "string"
-        },
         "utmTerm": {
           "description": "Campaign term; used with paid search to supply the keywords for ads.",
           "type": "string"
@@ -125,24 +57,33 @@
           "description": "Campaign source; used to identify a search engine, newsletter, or other\nsource.",
           "type": "string"
         },
-        "utmCampaign": {
-          "description": "Campaign name; used for keyword analysis to identify a specific product\npromotion or strategic campaign.",
-          "type": "string"
-        },
         "gclid": {
           "description": "[AdWords autotagging parameter](https://support.google.com/analytics/answer/1033981?hl=en);\nused to measure Google AdWords ads. This value is generated dynamically\nand should never be modified.",
           "type": "string"
         },
+        "utmCampaign": {
+          "type": "string",
+          "description": "Campaign name; used for keyword analysis to identify a specific product\npromotion or strategic campaign."
+        },
         "utmContent": {
           "description": "Campaign content; used for A/B testing and content-targeted ads to\ndifferentiate ads or links that point to the same URL.",
           "type": "string"
+        },
+        "utmMedium": {
+          "description": "Campaign medium; used to identify a medium such as email or cost-per-click.",
+          "type": "string"
         }
-      }
+      },
+      "id": "GooglePlayAnalytics"
     },
     "DynamicLinkInfo": {
       "description": "Information about a Dynamic Link.",
       "type": "object",
       "properties": {
+        "dynamicLinkDomain": {
+          "description": "Dynamic Links domain that the project owns, e.g. abcd.app.goo.gl\n[Learn more](https://firebase.google.com/docs/dynamic-links/android#set-up-firebase-and-the-dynamic-links-sdk)\non how to set up Dynamic Link domain associated with your Firebase project.\n\nRequired.",
+          "type": "string"
+        },
         "link": {
           "description": "The link your app will open, You can specify any URL your app can handle.\nThis link must be a well-formatted URL, be properly URL-encoded, and use\nthe HTTP or HTTPS scheme. See 'link' parameters in the\n[documentation](https://firebase.google.com/docs/dynamic-links/android#create-a-dynamic-link-programmatically).\n\nRequired.",
           "type": "string"
@@ -152,8 +93,8 @@
           "$ref": "IosInfo"
         },
         "socialMetaTagInfo": {
-          "$ref": "SocialMetaTagInfo",
-          "description": "Parameters for social meta tag params.\nUsed to set meta tag data for link previews on social sites."
+          "description": "Parameters for social meta tag params.\nUsed to set meta tag data for link previews on social sites.",
+          "$ref": "SocialMetaTagInfo"
         },
         "androidInfo": {
           "description": "Android related information. See Android related parameters in the\n[documentation](https://firebase.google.com/docs/dynamic-links/android#create-a-dynamic-link-programmatically).",
@@ -162,27 +103,14 @@
         "analyticsInfo": {
           "$ref": "AnalyticsInfo",
           "description": "Parameters used for tracking. See all tracking parameters in the\n[documentation](https://firebase.google.com/docs/dynamic-links/android#create-a-dynamic-link-programmatically)."
-        },
-        "dynamicLinkDomain": {
-          "description": "Dynamic Links domain that the project owns, e.g. abcd.app.goo.gl\n[Learn more](https://firebase.google.com/docs/dynamic-links/android#set-up-firebase-and-the-dynamic-links-sdk)\non how to set up Dynamic Link domain associated with your Firebase project.\n\nRequired.",
-          "type": "string"
         }
       },
       "id": "DynamicLinkInfo"
     },
     "ITunesConnectAnalytics": {
-      "id": "ITunesConnectAnalytics",
       "description": "Parameters for iTunes Connect App Analytics.",
       "type": "object",
       "properties": {
-        "pt": {
-          "description": "Provider token that enables analytics for Dynamic Links from within iTunes\nConnect.",
-          "type": "string"
-        },
-        "at": {
-          "description": "Affiliate token used to create affiliate-coded links.",
-          "type": "string"
-        },
         "ct": {
           "description": "Campaign text that developers can optionally add to any link in order to\ntrack sales from a specific marketing campaign.",
           "type": "string"
@@ -190,12 +118,19 @@
         "mt": {
           "description": "iTune media types, including music, podcasts, audiobooks and so on.",
           "type": "string"
+        },
+        "pt": {
+          "description": "Provider token that enables analytics for Dynamic Links from within iTunes\nConnect.",
+          "type": "string"
+        },
+        "at": {
+          "description": "Affiliate token used to create affiliate-coded links.",
+          "type": "string"
         }
-      }
+      },
+      "id": "ITunesConnectAnalytics"
     },
     "SocialMetaTagInfo": {
-      "description": "Parameters for social meta tag params.\nUsed to set meta tag data for link previews on social sites.",
-      "type": "object",
       "properties": {
         "socialDescription": {
           "description": "A short description of the link. Optional.",
@@ -210,14 +145,69 @@
           "type": "string"
         }
       },
-      "id": "SocialMetaTagInfo"
+      "id": "SocialMetaTagInfo",
+      "description": "Parameters for social meta tag params.\nUsed to set meta tag data for link previews on social sites.",
+      "type": "object"
+    },
+    "AndroidInfo": {
+      "description": "Android related attributes to the Dynamic Link.",
+      "type": "object",
+      "properties": {
+        "androidLink": {
+          "type": "string",
+          "description": "If specified, this overrides the ‘link’ parameter on Android."
+        },
+        "androidFallbackLink": {
+          "description": "Link to open on Android if the app is not installed.",
+          "type": "string"
+        },
+        "androidPackageName": {
+          "description": "Android package name of the app.",
+          "type": "string"
+        },
+        "androidMinPackageVersionCode": {
+          "description": "Minimum version code for the Android app. If the installed app’s version\ncode is lower, then the user is taken to the Play Store.",
+          "type": "string"
+        }
+      },
+      "id": "AndroidInfo"
     },
     "DynamicLinkWarning": {
-      "id": "DynamicLinkWarning",
       "description": "Dynamic Links warning messages.",
       "type": "object",
       "properties": {
         "warningCode": {
+          "enum": [
+            "CODE_UNSPECIFIED",
+            "NOT_IN_PROJECT_ANDROID_PACKAGE_NAME",
+            "NOT_INTEGER_ANDROID_PACKAGE_MIN_VERSION",
+            "UNNECESSARY_ANDROID_PACKAGE_MIN_VERSION",
+            "NOT_URI_ANDROID_LINK",
+            "UNNECESSARY_ANDROID_LINK",
+            "NOT_URI_ANDROID_FALLBACK_LINK",
+            "BAD_URI_SCHEME_ANDROID_FALLBACK_LINK",
+            "NOT_IN_PROJECT_IOS_BUNDLE_ID",
+            "NOT_IN_PROJECT_IPAD_BUNDLE_ID",
+            "UNNECESSARY_IOS_URL_SCHEME",
+            "NOT_NUMERIC_IOS_APP_STORE_ID",
+            "UNNECESSARY_IOS_APP_STORE_ID",
+            "NOT_URI_IOS_FALLBACK_LINK",
+            "BAD_URI_SCHEME_IOS_FALLBACK_LINK",
+            "NOT_URI_IPAD_FALLBACK_LINK",
+            "BAD_URI_SCHEME_IPAD_FALLBACK_LINK",
+            "BAD_DEBUG_PARAM",
+            "BAD_AD_PARAM",
+            "DEPRECATED_PARAM",
+            "UNRECOGNIZED_PARAM",
+            "TOO_LONG_PARAM",
+            "NOT_URI_SOCIAL_IMAGE_LINK",
+            "BAD_URI_SCHEME_SOCIAL_IMAGE_LINK",
+            "NOT_URI_SOCIAL_URL",
+            "BAD_URI_SCHEME_SOCIAL_URL",
+            "LINK_LENGTH_TOO_LONG",
+            "LINK_WITH_FRAGMENTS",
+            "NOT_MATCHING_IOS_BUNDLE_ID_AND_STORE_ID"
+          ],
           "description": "The warning code.",
           "type": "string",
           "enumDescriptions": [
@@ -250,74 +240,89 @@
             "Dynamic Link URL length is too long.",
             "Dynamic Link URL contains fragments.",
             "The iOS bundle ID does not match with the given iOS store ID."
-          ],
-          "enum": [
-            "CODE_UNSPECIFIED",
-            "NOT_IN_PROJECT_ANDROID_PACKAGE_NAME",
-            "NOT_INTEGER_ANDROID_PACKAGE_MIN_VERSION",
-            "UNNECESSARY_ANDROID_PACKAGE_MIN_VERSION",
-            "NOT_URI_ANDROID_LINK",
-            "UNNECESSARY_ANDROID_LINK",
-            "NOT_URI_ANDROID_FALLBACK_LINK",
-            "BAD_URI_SCHEME_ANDROID_FALLBACK_LINK",
-            "NOT_IN_PROJECT_IOS_BUNDLE_ID",
-            "NOT_IN_PROJECT_IPAD_BUNDLE_ID",
-            "UNNECESSARY_IOS_URL_SCHEME",
-            "NOT_NUMERIC_IOS_APP_STORE_ID",
-            "UNNECESSARY_IOS_APP_STORE_ID",
-            "NOT_URI_IOS_FALLBACK_LINK",
-            "BAD_URI_SCHEME_IOS_FALLBACK_LINK",
-            "NOT_URI_IPAD_FALLBACK_LINK",
-            "BAD_URI_SCHEME_IPAD_FALLBACK_LINK",
-            "BAD_DEBUG_PARAM",
-            "BAD_AD_PARAM",
-            "DEPRECATED_PARAM",
-            "UNRECOGNIZED_PARAM",
-            "TOO_LONG_PARAM",
-            "NOT_URI_SOCIAL_IMAGE_LINK",
-            "BAD_URI_SCHEME_SOCIAL_IMAGE_LINK",
-            "NOT_URI_SOCIAL_URL",
-            "BAD_URI_SCHEME_SOCIAL_URL",
-            "LINK_LENGTH_TOO_LONG",
-            "LINK_WITH_FRAGMENTS",
-            "NOT_MATCHING_IOS_BUNDLE_ID_AND_STORE_ID"
           ]
         },
         "warningMessage": {
           "description": "The warning message to help developers improve their requests.",
           "type": "string"
         }
-      }
+      },
+      "id": "DynamicLinkWarning"
     },
-    "AndroidInfo": {
-      "description": "Android related attributes to the Dynamic Link.",
+    "IosInfo": {
       "type": "object",
       "properties": {
-        "androidFallbackLink": {
-          "description": "Link to open on Android if the app is not installed.",
+        "iosIpadFallbackLink": {
+          "description": "If specified, this overrides the ios_fallback_link value on iPads.",
           "type": "string"
         },
-        "androidPackageName": {
-          "description": "Android package name of the app.",
+        "iosIpadBundleId": {
+          "description": "iPad bundle ID of the app.",
           "type": "string"
         },
-        "androidMinPackageVersionCode": {
-          "description": "Minimum version code for the Android app. If the installed app’s version\ncode is lower, then the user is taken to the Play Store.",
+        "iosCustomScheme": {
+          "description": "Custom (destination) scheme to use for iOS. By default, we’ll use the\nbundle ID as the custom scheme. Developer can override this behavior using\nthis param.",
           "type": "string"
         },
-        "androidLink": {
-          "description": "If specified, this overrides the ‘link’ parameter on Android.",
+        "iosBundleId": {
+          "description": "iOS bundle ID of the app.",
+          "type": "string"
+        },
+        "iosFallbackLink": {
+          "description": "Link to open on iOS if the app is not installed.",
+          "type": "string"
+        },
+        "iosAppStoreId": {
+          "description": "iOS App Store ID.",
           "type": "string"
         }
       },
-      "id": "AndroidInfo"
+      "id": "IosInfo",
+      "description": "iOS related attributes to the Dynamic Link.."
+    },
+    "CreateShortDynamicLinkResponse": {
+      "type": "object",
+      "properties": {
+        "warning": {
+          "description": "Information about potential warnings on link creation.",
+          "type": "array",
+          "items": {
+            "$ref": "DynamicLinkWarning"
+          }
+        },
+        "shortLink": {
+          "description": "Short Dynamic Link value. e.g. https://abcd.app.goo.gl/wxyz",
+          "type": "string"
+        },
+        "previewLink": {
+          "description": "Preivew link to show the link flow chart.",
+          "type": "string"
+        }
+      },
+      "id": "CreateShortDynamicLinkResponse",
+      "description": "Response to create a short Dynamic Link."
+    },
+    "AnalyticsInfo": {
+      "description": "Tracking parameters supported by Dynamic Link.",
+      "type": "object",
+      "properties": {
+        "googlePlayAnalytics": {
+          "$ref": "GooglePlayAnalytics",
+          "description": "Google Play Campaign Measurements."
+        },
+        "itunesConnectAnalytics": {
+          "description": "iTunes Connect App Analytics.",
+          "$ref": "ITunesConnectAnalytics"
+        }
+      },
+      "id": "AnalyticsInfo"
     }
   },
+  "protocol": "rest",
   "icons": {
     "x32": "http://www.google.com/images/icons/product/search-32.gif",
     "x16": "http://www.google.com/images/icons/product/search-16.gif"
   },
-  "protocol": "rest",
   "canonicalName": "Firebase Dynamic Links",
   "auth": {
     "oauth2": {
@@ -343,23 +348,35 @@
             "https://www.googleapis.com/auth/firebase"
           ],
           "flatPath": "v1/shortLinks",
-          "path": "v1/shortLinks",
           "id": "firebasedynamiclinks.shortLinks.create",
+          "path": "v1/shortLinks",
           "request": {
             "$ref": "CreateShortDynamicLinkRequest"
           },
           "description": "Creates a short Dynamic Link given either a valid long Dynamic Link or\ndetails such as Dynamic Link domain, Android and iOS app information.\nThe created short Dynamic Link will not expire.\n\nRepeated calls with the same long Dynamic Link or Dynamic Link information\nwill produce the same short Dynamic Link.\n\nThe Dynamic Link domain in the request must be owned by requester's\nFirebase project.",
+          "httpMethod": "POST",
+          "parameterOrder": [],
           "response": {
             "$ref": "CreateShortDynamicLinkResponse"
-          },
-          "parameterOrder": [],
-          "httpMethod": "POST"
+          }
         }
       }
     }
   },
   "parameters": {
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
     "$.xgafv": {
+      "description": "V1 error format.",
+      "type": "string",
       "enumDescriptions": [
         "v1 error format",
         "v2 error format"
@@ -368,9 +385,7 @@
       "enum": [
         "1",
         "2"
-      ],
-      "description": "V1 error format.",
-      "type": "string"
+      ]
     },
     "callback": {
       "description": "JSONP",
@@ -393,14 +408,14 @@
         "proto"
       ]
     },
-    "access_token": {
-      "description": "OAuth access token.",
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
       "type": "string",
       "location": "query"
     },
-    "key": {
+    "access_token": {
       "location": "query",
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "description": "OAuth access token.",
       "type": "string"
     },
     "quotaUser": {
@@ -425,36 +440,21 @@
       "type": "string"
     },
     "upload_protocol": {
+      "location": "query",
       "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
+      "type": "string"
     },
     "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
       "type": "boolean",
       "default": "true",
-      "location": "query"
-    },
-    "fields": {
       "location": "query",
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string"
-    },
-    "uploadType": {
-      "location": "query",
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string"
+      "description": "Returns response with indentations and line breaks."
     }
   },
   "version": "v1",
   "baseUrl": "https://firebasedynamiclinks.googleapis.com/",
-  "servicePath": "",
-  "description": "Firebase Dynamic Links API enables third party developers to programmatically create and manage Dynamic Links.",
   "kind": "discovery#restDescription",
-  "basePath": "",
-  "id": "firebasedynamiclinks:v1",
-  "documentationLink": "https://firebase.google.com/docs/dynamic-links/",
-  "revision": "20170119",
-  "discoveryVersion": "v1",
-  "version_module": "True"
+  "description": "Firebase Dynamic Links API enables third party developers to programmatically create and manage Dynamic Links.",
+  "servicePath": "",
+  "basePath": ""
 }
diff --git a/firebasedynamiclinks/v1/firebasedynamiclinks-gen.go b/firebasedynamiclinks/v1/firebasedynamiclinks-gen.go
index e03f30a..592bdf8 100644
--- a/firebasedynamiclinks/v1/firebasedynamiclinks-gen.go
+++ b/firebasedynamiclinks/v1/firebasedynamiclinks-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	ShortLinks *ShortLinksService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewShortLinksService(s *Service) *ShortLinksService {
 	rs := &ShortLinksService{s: s}
 	return rs
@@ -691,6 +696,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.createshortdynamiclinkrequest)
 	if err != nil {
diff --git a/firebaserules/v1/firebaserules-api.json b/firebaserules/v1/firebaserules-api.json
index 0d5f9b8..4e945e8 100644
--- a/firebaserules/v1/firebaserules-api.json
+++ b/firebaserules/v1/firebaserules-api.json
@@ -1,5 +1,5 @@
 {
-  "id": "firebaserules:v1",
+  "canonicalName": "Firebase Rules API",
   "auth": {
     "oauth2": {
       "scopes": {
@@ -15,343 +15,572 @@
       }
     }
   },
-  "description": "Creates and manages rules that determine when a Firebase Rules-enabled service should permit a request.\n",
-  "protocol": "rest",
+  "rootUrl": "https://firebaserules.googleapis.com/",
+  "ownerDomain": "google.com",
+  "name": "firebaserules",
+  "batchPath": "batch",
   "title": "Firebase Rules API",
+  "ownerName": "Google",
   "resources": {
     "projects": {
-      "resources": {
-        "rulesets": {
-          "methods": {
-            "create": {
-              "id": "firebaserules.projects.rulesets.create",
-              "response": {
-                "$ref": "Ruleset"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "description": "Create a `Ruleset` from `Source`.\n\nThe `Ruleset` is given a unique generated name which is returned to the\ncaller. `Source` containing syntactic or semantics errors will result in an\nerror response indicating the first error encountered. For a detailed view\nof `Source` issues, use TestRuleset.",
-              "request": {
-                "$ref": "Ruleset"
-              },
-              "flatPath": "v1/projects/{projectsId}/rulesets",
-              "httpMethod": "POST",
-              "parameters": {
-                "name": {
-                  "description": "Resource name for Project which owns this `Ruleset`.\n\nFormat: `projects/{project_id}`",
-                  "required": true,
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+name}/rulesets",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/firebase"
-              ]
-            },
-            "get": {
-              "id": "firebaserules.projects.rulesets.get",
-              "response": {
-                "$ref": "Ruleset"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "description": "Get a `Ruleset` by name including the full `Source` contents.",
-              "flatPath": "v1/projects/{projectsId}/rulesets/{rulesetsId}",
-              "httpMethod": "GET",
-              "parameters": {
-                "name": {
-                  "description": "Resource name for the ruleset to get.\n\nFormat: `projects/{project_id}/rulesets/{ruleset_id}`",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/rulesets/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+name}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/firebase",
-                "https://www.googleapis.com/auth/firebase.readonly"
-              ]
-            },
-            "list": {
-              "id": "firebaserules.projects.rulesets.list",
-              "response": {
-                "$ref": "ListRulesetsResponse"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "description": "List `Ruleset` metadata only and optionally filter the results by Ruleset\nname.\n\nThe full `Source` contents of a `Ruleset` may be retrieved with\nGetRuleset.",
-              "flatPath": "v1/projects/{projectsId}/rulesets",
-              "httpMethod": "GET",
-              "parameters": {
-                "pageSize": {
-                  "description": "Page size to load. Maximum of 100. Defaults to 10.\nNote: `page_size` is just a hint and the service may choose to load less\nthan `page_size` due to the size of the output. To traverse all of the\nreleases, caller should iterate until the `page_token` is empty.",
-                  "location": "query",
-                  "type": "integer",
-                  "format": "int32"
-                },
-                "name": {
-                  "description": "Resource name for the project.\n\nFormat: `projects/{project_id}`",
-                  "required": true,
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                },
-                "pageToken": {
-                  "description": "Next page token for loading the next batch of `Ruleset` instances.",
-                  "location": "query",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+name}/rulesets",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/firebase",
-                "https://www.googleapis.com/auth/firebase.readonly"
-              ]
-            },
-            "delete": {
-              "id": "firebaserules.projects.rulesets.delete",
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "description": "Delete a `Ruleset` by resource name.\n\nIf the `Ruleset` is referenced by a `Release` the operation will fail.",
-              "flatPath": "v1/projects/{projectsId}/rulesets/{rulesetsId}",
-              "httpMethod": "DELETE",
-              "parameters": {
-                "name": {
-                  "description": "Resource name for the ruleset to delete.\n\nFormat: `projects/{project_id}/rulesets/{ruleset_id}`",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/rulesets/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+name}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/firebase"
-              ]
-            }
-          }
-        },
-        "releases": {
-          "methods": {
-            "update": {
-              "id": "firebaserules.projects.releases.update",
-              "response": {
-                "$ref": "Release"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "description": "Update a `Release`.\n\nOnly updates to the `ruleset_name` field will be honored. `Release` rename\nis not supported. To create a `Release` use the CreateRelease method\ninstead.",
-              "request": {
-                "$ref": "Release"
-              },
-              "flatPath": "v1/projects/{projectsId}/releases/{releasesId}",
-              "httpMethod": "PUT",
-              "parameters": {
-                "name": {
-                  "description": "Resource name for the `Release`.\n\n`Release` names may be structured `app1/prod/v2` or flat `app1_prod_v2`\nwhich affords developers a great deal of flexibility in mapping the name\nto the style that best fits their existing development practices. For\nexample, a name could refer to an environment, an app, a version, or some\ncombination of three.\n\nIn the table below, for the project name `projects/foo`, the following\nrelative release paths show how flat and structured names might be chosen\nto match a desired development / deployment strategy.\n\nUse Case     | Flat Name           | Structured Name\n-------------|---------------------|----------------\nEnvironments | releases/qa         | releases/qa\nApps         | releases/app1_qa    | releases/app1/qa\nVersions     | releases/app1_v2_qa | releases/app1/v2/qa\n\nThe delimiter between the release name path elements can be almost anything\nand it should work equally well with the release name list filter, but in\nmany ways the structured paths provide a clearer picture of the\nrelationship between `Release` instances.\n\nFormat: `projects/{project_id}/releases/{release_id}`",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/releases/.+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+name}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/firebase"
-              ]
-            },
-            "create": {
-              "id": "firebaserules.projects.releases.create",
-              "response": {
-                "$ref": "Release"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "description": "Create a `Release`.\n\nRelease names should reflect the developer's deployment practices. For\nexample, the release name may include the environment name, application\nname, application version, or any other name meaningful to the developer.\nOnce a `Release` refers to a `Ruleset`, the rules can be enforced by\nFirebase Rules-enabled services.\n\nMore than one `Release` may be 'live' concurrently. Consider the following\nthree `Release` names for `projects/foo` and the `Ruleset` to which they\nrefer.\n\nRelease Name                    | Ruleset Name\n--------------------------------|-------------\nprojects/foo/releases/prod      | projects/foo/rulesets/uuid123\nprojects/foo/releases/prod/beta | projects/foo/rulesets/uuid123\nprojects/foo/releases/prod/v23  | projects/foo/rulesets/uuid456\n\nThe table reflects the `Ruleset` rollout in progress. The `prod` and\n`prod/beta` releases refer to the same `Ruleset`. However, `prod/v23`\nrefers to a new `Ruleset`. The `Ruleset` reference for a `Release` may be\nupdated using the UpdateRelease method, and the custom `Release` name\nmay be referenced by specifying the `X-Firebase-Rules-Release-Name` header.",
-              "request": {
-                "$ref": "Release"
-              },
-              "flatPath": "v1/projects/{projectsId}/releases",
-              "httpMethod": "POST",
-              "parameters": {
-                "name": {
-                  "description": "Resource name for the project which owns this `Release`.\n\nFormat: `projects/{project_id}`",
-                  "required": true,
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+name}/releases",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/firebase"
-              ]
-            },
-            "get": {
-              "id": "firebaserules.projects.releases.get",
-              "response": {
-                "$ref": "Release"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "description": "Get a `Release` by name.",
-              "flatPath": "v1/projects/{projectsId}/releases/{releasesId}",
-              "httpMethod": "GET",
-              "parameters": {
-                "name": {
-                  "description": "Resource name of the `Release`.\n\n\nFormat: `projects/{project_id}/releases/{release_id}`",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/releases/.+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+name}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/firebase",
-                "https://www.googleapis.com/auth/firebase.readonly"
-              ]
-            },
-            "list": {
-              "id": "firebaserules.projects.releases.list",
-              "response": {
-                "$ref": "ListReleasesResponse"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "description": "List the `Release` values for a project. This list may optionally be\nfiltered by `Release` name or `Ruleset` id or both.",
-              "flatPath": "v1/projects/{projectsId}/releases",
-              "httpMethod": "GET",
-              "parameters": {
-                "pageSize": {
-                  "description": "Page size to load. Maximum of 100. Defaults to 10.\nNote: `page_size` is just a hint and the service may choose to load less\nthan `page_size` due to the size of the output. To traverse all of the\nreleases, caller should iterate until the `page_token` is empty.",
-                  "location": "query",
-                  "type": "integer",
-                  "format": "int32"
-                },
-                "filter": {
-                  "description": "`Release` filter. The list method supports filters with restrictions on the\n`Release` `name` and also on the `Ruleset` `ruleset_name`.\n\nExample 1) A filter of 'name=prod*' might return `Release`s with names\nwithin 'projects/foo' prefixed with 'prod':\n\nName                          | Ruleset Name\n------------------------------|-------------\nprojects/foo/releases/prod    | projects/foo/rulesets/uuid1234\nprojects/foo/releases/prod/v1 | projects/foo/rulesets/uuid1234\nprojects/foo/releases/prod/v2 | projects/foo/rulesets/uuid8888\n\nExample 2) A filter of `name=prod* ruleset_name=uuid1234` would return only\n`Release` instances for 'projects/foo' with names prefixed with 'prod'\nreferring to the same `Ruleset` name of 'uuid1234':\n\nName                          | Ruleset Name\n------------------------------|-------------\nprojects/foo/releases/prod    | projects/foo/rulesets/1234\nprojects/foo/releases/prod/v1 | projects/foo/rulesets/1234\n\nIn the examples, the filter parameters refer to the search filters for\nrelease and ruleset names are relative to the project releases and rulesets\ncollections. Fully qualified prefixed may also be used. e.g.\n`name=projects/foo/releases/prod* ruleset_name=projects/foo/rulesets/uuid1`",
-                  "location": "query",
-                  "type": "string"
-                },
-                "name": {
-                  "description": "Resource name for the project.\n\nFormat: `projects/{project_id}`",
-                  "required": true,
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                },
-                "pageToken": {
-                  "description": "Next page token for the next batch of `Release` instances.",
-                  "location": "query",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+name}/releases",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/firebase",
-                "https://www.googleapis.com/auth/firebase.readonly"
-              ]
-            },
-            "delete": {
-              "id": "firebaserules.projects.releases.delete",
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "description": "Delete a `Release` by resource name.",
-              "flatPath": "v1/projects/{projectsId}/releases/{releasesId}",
-              "httpMethod": "DELETE",
-              "parameters": {
-                "name": {
-                  "description": "Resource name for the `Release` to delete.\n\nFormat: `projects/{project_id}/releases/{release_id}`",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/releases/.+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+name}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/firebase"
-              ]
-            }
-          }
-        }
-      },
       "methods": {
         "test": {
-          "id": "firebaserules.projects.test",
+          "request": {
+            "$ref": "TestRulesetRequest"
+          },
+          "description": "Test `Source` for syntactic and semantic correctness. Issues present in the\nrules, if any, will be returned to the caller with a description, severity,\nand source location.\n\nThe test method will typically be executed with a developer provided\n`Source`, but if regression testing is desired, this method may be\nexecuted against a `Ruleset` resource name and the `Source` will be\nretrieved from the persisted `Ruleset`.\n\nThe following is an example of `Source` that permits users to upload images\nto a bucket bearing their user id and matching the correct metadata:\n\n_*Example*_\n\n    // Users are allowed to subscribe and unsubscribe to the blog.\n    service firebase.storage {\n      match /users/{userId}/images/{imageName} {\n          allow write: if userId == request.userId\n              && (imageName.endsWith('.png') || imageName.endsWith('.jpg'))\n              && resource.mimeType.startsWith('image/')\n      }\n    }",
           "response": {
             "$ref": "TestRulesetResponse"
           },
           "parameterOrder": [
             "name"
           ],
-          "description": "Test `Source` for syntactic and semantic correctness. Issues present in the\nrules, if any, will be returned to the caller with a description, severity,\nand source location.\n\nThe test method will typically be executed with a developer provided\n`Source`, but if regression testing is desired, this method may be\nexecuted against a `Ruleset` resource name and the `Source` will be\nretrieved from the persisted `Ruleset`.\n\nThe following is an example of `Source` that permits users to upload images\nto a bucket bearing their user id and matching the correct metadata:\n\n_*Example*_\n\n    // Users are allowed to subscribe and unsubscribe to the blog.\n    service firebase.storage {\n      match /users/{userId}/images/{imageName} {\n          allow write: if userId == request.userId\n              && (imageName.endsWith('.png') || imageName.endsWith('.jpg'))\n              && resource.mimeType.startsWith('image/')\n      }\n    }",
-          "request": {
-            "$ref": "TestRulesetRequest"
-          },
-          "flatPath": "v1/projects/{projectsId}:test",
           "httpMethod": "POST",
           "parameters": {
             "name": {
               "description": "Name of the project.\n\nFormat: `projects/{project_id}`",
               "required": true,
+              "type": "string",
               "pattern": "^projects/.+$",
-              "location": "path",
-              "type": "string"
+              "location": "path"
             }
           },
-          "path": "v1/{+name}:test",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/firebase",
             "https://www.googleapis.com/auth/firebase.readonly"
-          ]
+          ],
+          "flatPath": "v1/projects/{projectsId}:test",
+          "path": "v1/{+name}:test",
+          "id": "firebaserules.projects.test"
+        }
+      },
+      "resources": {
+        "rulesets": {
+          "methods": {
+            "get": {
+              "description": "Get a `Ruleset` by name including the full `Source` contents.",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "Ruleset"
+              },
+              "parameters": {
+                "name": {
+                  "pattern": "^projects/[^/]+/rulesets/[^/]+$",
+                  "location": "path",
+                  "description": "Resource name for the ruleset to get.\n\nFormat: `projects/{project_id}/rulesets/{ruleset_id}`",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/firebase",
+                "https://www.googleapis.com/auth/firebase.readonly"
+              ],
+              "flatPath": "v1/projects/{projectsId}/rulesets/{rulesetsId}",
+              "id": "firebaserules.projects.rulesets.get",
+              "path": "v1/{+name}"
+            },
+            "list": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "ListRulesetsResponse"
+              },
+              "parameters": {
+                "name": {
+                  "location": "path",
+                  "description": "Resource name for the project.\n\nFormat: `projects/{project_id}`",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                },
+                "pageToken": {
+                  "description": "Next page token for loading the next batch of `Ruleset` instances.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "Page size to load. Maximum of 100. Defaults to 10.\nNote: `page_size` is just a hint and the service may choose to load less\nthan `page_size` due to the size of the output. To traverse all of the\nreleases, caller should iterate until the `page_token` is empty.",
+                  "format": "int32",
+                  "type": "integer"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/firebase",
+                "https://www.googleapis.com/auth/firebase.readonly"
+              ],
+              "flatPath": "v1/projects/{projectsId}/rulesets",
+              "id": "firebaserules.projects.rulesets.list",
+              "path": "v1/{+name}/rulesets",
+              "description": "List `Ruleset` metadata only and optionally filter the results by Ruleset\nname.\n\nThe full `Source` contents of a `Ruleset` may be retrieved with\nGetRuleset."
+            },
+            "create": {
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "Ruleset"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/firebase"
+              ],
+              "parameters": {
+                "name": {
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path",
+                  "description": "Resource name for Project which owns this `Ruleset`.\n\nFormat: `projects/{project_id}`",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1/projects/{projectsId}/rulesets",
+              "id": "firebaserules.projects.rulesets.create",
+              "path": "v1/{+name}/rulesets",
+              "description": "Create a `Ruleset` from `Source`.\n\nThe `Ruleset` is given a unique generated name which is returned to the\ncaller. `Source` containing syntactic or semantics errors will result in an\nerror response indicating the first error encountered. For a detailed view\nof `Source` issues, use TestRuleset.",
+              "request": {
+                "$ref": "Ruleset"
+              }
+            },
+            "delete": {
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "DELETE",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/firebase"
+              ],
+              "parameters": {
+                "name": {
+                  "pattern": "^projects/[^/]+/rulesets/[^/]+$",
+                  "location": "path",
+                  "description": "Resource name for the ruleset to delete.\n\nFormat: `projects/{project_id}/rulesets/{ruleset_id}`",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1/projects/{projectsId}/rulesets/{rulesetsId}",
+              "path": "v1/{+name}",
+              "id": "firebaserules.projects.rulesets.delete",
+              "description": "Delete a `Ruleset` by resource name.\n\nIf the `Ruleset` is referenced by a `Release` the operation will fail."
+            }
+          }
+        },
+        "releases": {
+          "methods": {
+            "delete": {
+              "description": "Delete a `Release` by resource name.",
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "DELETE",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/firebase"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "Resource name for the `Release` to delete.\n\nFormat: `projects/{project_id}/releases/{release_id}`",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/releases/.+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1/projects/{projectsId}/releases/{releasesId}",
+              "path": "v1/{+name}",
+              "id": "firebaserules.projects.releases.delete"
+            },
+            "get": {
+              "description": "Get a `Release` by name.",
+              "response": {
+                "$ref": "Release"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "GET",
+              "parameters": {
+                "name": {
+                  "description": "Resource name of the `Release`.\n\n\nFormat: `projects/{project_id}/releases/{release_id}`",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/releases/.+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/firebase",
+                "https://www.googleapis.com/auth/firebase.readonly"
+              ],
+              "flatPath": "v1/projects/{projectsId}/releases/{releasesId}",
+              "path": "v1/{+name}",
+              "id": "firebaserules.projects.releases.get"
+            },
+            "list": {
+              "id": "firebaserules.projects.releases.list",
+              "path": "v1/{+name}/releases",
+              "description": "List the `Release` values for a project. This list may optionally be\nfiltered by `Release` name or `Ruleset` id or both.",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "ListReleasesResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/firebase",
+                "https://www.googleapis.com/auth/firebase.readonly"
+              ],
+              "parameters": {
+                "pageSize": {
+                  "location": "query",
+                  "description": "Page size to load. Maximum of 100. Defaults to 10.\nNote: `page_size` is just a hint and the service may choose to load less\nthan `page_size` due to the size of the output. To traverse all of the\nreleases, caller should iterate until the `page_token` is empty.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "filter": {
+                  "description": "`Release` filter. The list method supports filters with restrictions on the\n`Release` `name` and also on the `Ruleset` `ruleset_name`.\n\nExample 1) A filter of 'name=prod*' might return `Release`s with names\nwithin 'projects/foo' prefixed with 'prod':\n\nName                          | Ruleset Name\n------------------------------|-------------\nprojects/foo/releases/prod    | projects/foo/rulesets/uuid1234\nprojects/foo/releases/prod/v1 | projects/foo/rulesets/uuid1234\nprojects/foo/releases/prod/v2 | projects/foo/rulesets/uuid8888\n\nExample 2) A filter of `name=prod* ruleset_name=uuid1234` would return only\n`Release` instances for 'projects/foo' with names prefixed with 'prod'\nreferring to the same `Ruleset` name of 'uuid1234':\n\nName                          | Ruleset Name\n------------------------------|-------------\nprojects/foo/releases/prod    | projects/foo/rulesets/1234\nprojects/foo/releases/prod/v1 | projects/foo/rulesets/1234\n\nIn the examples, the filter parameters refer to the search filters for\nrelease and ruleset names are relative to the project releases and rulesets\ncollections. Fully qualified prefixed may also be used. e.g.\n`name=projects/foo/releases/prod* ruleset_name=projects/foo/rulesets/uuid1`",
+                  "type": "string",
+                  "location": "query"
+                },
+                "name": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path",
+                  "description": "Resource name for the project.\n\nFormat: `projects/{project_id}`"
+                },
+                "pageToken": {
+                  "location": "query",
+                  "description": "Next page token for the next batch of `Release` instances.",
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1/projects/{projectsId}/releases"
+            },
+            "update": {
+              "path": "v1/{+name}",
+              "id": "firebaserules.projects.releases.update",
+              "description": "Update a `Release`.\n\nOnly updates to the `ruleset_name` field will be honored. `Release` rename\nis not supported. To create a `Release` use the CreateRelease method\ninstead.",
+              "request": {
+                "$ref": "Release"
+              },
+              "response": {
+                "$ref": "Release"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "PUT",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/firebase"
+              ],
+              "parameters": {
+                "name": {
+                  "pattern": "^projects/[^/]+/releases/.+$",
+                  "location": "path",
+                  "description": "Resource name for the `Release`.\n\n`Release` names may be structured `app1/prod/v2` or flat `app1_prod_v2`\nwhich affords developers a great deal of flexibility in mapping the name\nto the style that best fits their existing development practices. For\nexample, a name could refer to an environment, an app, a version, or some\ncombination of three.\n\nIn the table below, for the project name `projects/foo`, the following\nrelative release paths show how flat and structured names might be chosen\nto match a desired development / deployment strategy.\n\nUse Case     | Flat Name           | Structured Name\n-------------|---------------------|----------------\nEnvironments | releases/qa         | releases/qa\nApps         | releases/app1_qa    | releases/app1/qa\nVersions     | releases/app1_v2_qa | releases/app1/v2/qa\n\nThe delimiter between the release name path elements can be almost anything\nand it should work equally well with the release name list filter, but in\nmany ways the structured paths provide a clearer picture of the\nrelationship between `Release` instances.\n\nFormat: `projects/{project_id}/releases/{release_id}`",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1/projects/{projectsId}/releases/{releasesId}"
+            },
+            "create": {
+              "description": "Create a `Release`.\n\nRelease names should reflect the developer's deployment practices. For\nexample, the release name may include the environment name, application\nname, application version, or any other name meaningful to the developer.\nOnce a `Release` refers to a `Ruleset`, the rules can be enforced by\nFirebase Rules-enabled services.\n\nMore than one `Release` may be 'live' concurrently. Consider the following\nthree `Release` names for `projects/foo` and the `Ruleset` to which they\nrefer.\n\nRelease Name                    | Ruleset Name\n--------------------------------|-------------\nprojects/foo/releases/prod      | projects/foo/rulesets/uuid123\nprojects/foo/releases/prod/beta | projects/foo/rulesets/uuid123\nprojects/foo/releases/prod/v23  | projects/foo/rulesets/uuid456\n\nThe table reflects the `Ruleset` rollout in progress. The `prod` and\n`prod/beta` releases refer to the same `Ruleset`. However, `prod/v23`\nrefers to a new `Ruleset`. The `Ruleset` reference for a `Release` may be\nupdated using the UpdateRelease method, and the custom `Release` name\nmay be referenced by specifying the `X-Firebase-Rules-Release-Name` header.",
+              "request": {
+                "$ref": "Release"
+              },
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "Release"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/firebase"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "Resource name for the project which owns this `Release`.\n\nFormat: `projects/{project_id}`",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1/projects/{projectsId}/releases",
+              "id": "firebaserules.projects.releases.create",
+              "path": "v1/{+name}/releases"
+            }
+          }
         }
       }
     }
   },
+  "parameters": {
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string",
+      "location": "query"
+    },
+    "$.xgafv": {
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ]
+    },
+    "callback": {
+      "type": "string",
+      "location": "query",
+      "description": "JSONP"
+    },
+    "alt": {
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json"
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
+    },
+    "bearer_token": {
+      "type": "string",
+      "location": "query",
+      "description": "OAuth bearer token."
+    }
+  },
+  "version": "v1",
+  "baseUrl": "https://firebaserules.googleapis.com/",
+  "description": "Creates and manages rules that determine when a Firebase Rules-enabled service should permit a request.\n",
+  "kind": "discovery#restDescription",
+  "servicePath": "",
+  "basePath": "",
+  "revision": "20170103",
+  "id": "firebaserules:v1",
+  "documentationLink": "https://firebase.google.com/docs/storage/security",
+  "discoveryVersion": "v1",
+  "version_module": "True",
   "schemas": {
+    "SourcePosition": {
+      "description": "Position in the `Source` content including its line, column number, and an\nindex of the `File` in the `Source` message. Used for debug purposes.",
+      "type": "object",
+      "properties": {
+        "column": {
+          "description": "First column on the source line associated with the source fragment.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "fileName": {
+          "description": "Name of the `File`.",
+          "type": "string"
+        },
+        "line": {
+          "description": "Line number of the source fragment. 1-based.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "SourcePosition"
+    },
+    "Issue": {
+      "id": "Issue",
+      "description": "Issues include warnings, errors, and deprecation notices.",
+      "type": "object",
+      "properties": {
+        "severity": {
+          "enum": [
+            "SEVERITY_UNSPECIFIED",
+            "DEPRECATION",
+            "WARNING",
+            "ERROR"
+          ],
+          "description": "The severity of the issue.",
+          "type": "string",
+          "enumDescriptions": [
+            "An unspecified severity.",
+            "Deprecation issue for statements and method that may no longer be\nsupported or maintained.",
+            "Warnings such as: unused variables.",
+            "Errors such as: unmatched curly braces or variable redefinition."
+          ]
+        },
+        "description": {
+          "description": "Short error description.",
+          "type": "string"
+        },
+        "sourcePosition": {
+          "description": "Position of the issue in the `Source`.",
+          "$ref": "SourcePosition"
+        }
+      }
+    },
+    "Ruleset": {
+      "description": "`Ruleset` is an immutable copy of `Source` with a globally unique identifier\nand a creation time.",
+      "type": "object",
+      "properties": {
+        "source": {
+          "description": "`Source` for the `Ruleset`.",
+          "$ref": "Source"
+        },
+        "createTime": {
+          "type": "string",
+          "description": "Time the `Ruleset` was created.\n@OutputOnly",
+          "format": "google-datetime"
+        },
+        "name": {
+          "description": "Name of the `Ruleset`. The ruleset_id is auto generated by the service.\nFormat: `projects/{project_id}/rulesets/{ruleset_id}`\n@OutputOnly",
+          "type": "string"
+        }
+      },
+      "id": "Ruleset"
+    },
+    "TestRulesetRequest": {
+      "type": "object",
+      "properties": {
+        "source": {
+          "$ref": "Source",
+          "description": "`Source` to be checked for correctness."
+        }
+      },
+      "id": "TestRulesetRequest",
+      "description": "The request for FirebaseRulesService.TestRuleset."
+    },
+    "Empty": {
+      "properties": {},
+      "id": "Empty",
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
+      "type": "object"
+    },
+    "File": {
+      "type": "object",
+      "properties": {
+        "fingerprint": {
+          "description": "Fingerprint (e.g. github sha) associated with the `File`.",
+          "format": "byte",
+          "type": "string"
+        },
+        "name": {
+          "description": "File name.",
+          "type": "string"
+        },
+        "content": {
+          "description": "Textual Content.",
+          "type": "string"
+        }
+      },
+      "id": "File",
+      "description": "`File` containing source content."
+    },
+    "ListReleasesResponse": {
+      "id": "ListReleasesResponse",
+      "description": "The response for FirebaseRulesService.ListReleases.",
+      "type": "object",
+      "properties": {
+        "releases": {
+          "description": "List of `Release` instances.",
+          "type": "array",
+          "items": {
+            "$ref": "Release"
+          }
+        },
+        "nextPageToken": {
+          "description": "The pagination token to retrieve the next page of results. If the value is\nempty, no further results remain.",
+          "type": "string"
+        }
+      }
+    },
     "Release": {
       "description": "`Release` is a named reference to a `Ruleset`. Once a `Release` refers to a\n`Ruleset`, rules-enabled services will be able to enforce the `Ruleset`.",
       "type": "object",
       "properties": {
-        "updateTime": {
-          "description": "Time the release was updated.\n@OutputOnly",
-          "type": "string",
-          "format": "google-datetime"
-        },
         "createTime": {
           "description": "Time the release was created.\n@OutputOnly",
-          "type": "string",
-          "format": "google-datetime"
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "updateTime": {
+          "description": "Time the release was updated.\n@OutputOnly",
+          "format": "google-datetime",
+          "type": "string"
         },
         "name": {
           "description": "Resource name for the `Release`.\n\n`Release` names may be structured `app1/prod/v2` or flat `app1_prod_v2`\nwhich affords developers a great deal of flexibility in mapping the name\nto the style that best fits their existing development practices. For\nexample, a name could refer to an environment, an app, a version, or some\ncombination of three.\n\nIn the table below, for the project name `projects/foo`, the following\nrelative release paths show how flat and structured names might be chosen\nto match a desired development / deployment strategy.\n\nUse Case     | Flat Name           | Structured Name\n-------------|---------------------|----------------\nEnvironments | releases/qa         | releases/qa\nApps         | releases/app1_qa    | releases/app1/qa\nVersions     | releases/app1_v2_qa | releases/app1/v2/qa\n\nThe delimiter between the release name path elements can be almost anything\nand it should work equally well with the release name list filter, but in\nmany ways the structured paths provide a clearer picture of the\nrelationship between `Release` instances.\n\nFormat: `projects/{project_id}/releases/{release_id}`",
@@ -364,41 +593,6 @@
       },
       "id": "Release"
     },
-    "Source": {
-      "description": "`Source` is one or more `File` messages comprising a logical set of rules.",
-      "type": "object",
-      "properties": {
-        "files": {
-          "description": "`File` set constituting the `Source` bundle.",
-          "type": "array",
-          "items": {
-            "$ref": "File"
-          }
-        }
-      },
-      "id": "Source"
-    },
-    "SourcePosition": {
-      "description": "Position in the `Source` content including its line, column number, and an\nindex of the `File` in the `Source` message. Used for debug purposes.",
-      "type": "object",
-      "properties": {
-        "fileName": {
-          "description": "Name of the `File`.",
-          "type": "string"
-        },
-        "column": {
-          "description": "First column on the source line associated with the source fragment.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "line": {
-          "description": "Line number of the source fragment. 1-based.",
-          "type": "integer",
-          "format": "int32"
-        }
-      },
-      "id": "SourcePosition"
-    },
     "TestRulesetResponse": {
       "description": "The response for FirebaseRulesService.TestRuleset.",
       "type": "object",
@@ -413,44 +607,6 @@
       },
       "id": "TestRulesetResponse"
     },
-    "Ruleset": {
-      "description": "`Ruleset` is an immutable copy of `Source` with a globally unique identifier\nand a creation time.",
-      "type": "object",
-      "properties": {
-        "source": {
-          "description": "`Source` for the `Ruleset`.",
-          "$ref": "Source"
-        },
-        "createTime": {
-          "description": "Time the `Ruleset` was created.\n@OutputOnly",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "name": {
-          "description": "Name of the `Ruleset`. The ruleset_id is auto generated by the service.\nFormat: `projects/{project_id}/rulesets/{ruleset_id}`\n@OutputOnly",
-          "type": "string"
-        }
-      },
-      "id": "Ruleset"
-    },
-    "ListReleasesResponse": {
-      "description": "The response for FirebaseRulesService.ListReleases.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "The pagination token to retrieve the next page of results. If the value is\nempty, no further results remain.",
-          "type": "string"
-        },
-        "releases": {
-          "description": "List of `Release` instances.",
-          "type": "array",
-          "items": {
-            "$ref": "Release"
-          }
-        }
-      },
-      "id": "ListReleasesResponse"
-    },
     "ListRulesetsResponse": {
       "description": "The response for FirebaseRulesService.ListRulesets",
       "type": "object",
@@ -469,180 +625,24 @@
       },
       "id": "ListRulesetsResponse"
     },
-    "Empty": {
-      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
-      "type": "object",
-      "properties": {},
-      "id": "Empty"
-    },
-    "File": {
-      "description": "`File` containing source content.",
+    "Source": {
       "type": "object",
       "properties": {
-        "content": {
-          "description": "Textual Content.",
-          "type": "string"
-        },
-        "name": {
-          "description": "File name.",
-          "type": "string"
-        },
-        "fingerprint": {
-          "description": "Fingerprint (e.g. github sha) associated with the `File`.",
-          "type": "string",
-          "format": "byte"
+        "files": {
+          "description": "`File` set constituting the `Source` bundle.",
+          "type": "array",
+          "items": {
+            "$ref": "File"
+          }
         }
       },
-      "id": "File"
-    },
-    "TestRulesetRequest": {
-      "description": "The request for FirebaseRulesService.TestRuleset.",
-      "type": "object",
-      "properties": {
-        "source": {
-          "description": "`Source` to be checked for correctness.",
-          "$ref": "Source"
-        }
-      },
-      "id": "TestRulesetRequest"
-    },
-    "Issue": {
-      "description": "Issues include warnings, errors, and deprecation notices.",
-      "type": "object",
-      "properties": {
-        "description": {
-          "description": "Short error description.",
-          "type": "string"
-        },
-        "severity": {
-          "description": "The severity of the issue.",
-          "enum": [
-            "SEVERITY_UNSPECIFIED",
-            "DEPRECATION",
-            "WARNING",
-            "ERROR"
-          ],
-          "enumDescriptions": [
-            "An unspecified severity.",
-            "Deprecation issue for statements and method that may no longer be\nsupported or maintained.",
-            "Warnings such as: unused variables.",
-            "Errors such as: unmatched curly braces or variable redefinition."
-          ],
-          "type": "string"
-        },
-        "sourcePosition": {
-          "description": "Position of the issue in the `Source`.",
-          "$ref": "SourcePosition"
-        }
-      },
-      "id": "Issue"
+      "id": "Source",
+      "description": "`Source` is one or more `File` messages comprising a logical set of rules."
     }
   },
-  "revision": "20170103",
-  "basePath": "",
   "icons": {
-    "x32": "http://www.google.com/images/icons/product/search-32.gif",
-    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
   },
-  "version_module": "True",
-  "canonicalName": "Firebase Rules API",
-  "discoveryVersion": "v1",
-  "baseUrl": "https://firebaserules.googleapis.com/",
-  "name": "firebaserules",
-  "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    }
-  },
-  "documentationLink": "https://firebase.google.com/docs/storage/security",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
-  "servicePath": "",
-  "ownerName": "Google",
-  "version": "v1",
-  "rootUrl": "https://firebaserules.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "protocol": "rest"
 }
diff --git a/firebaserules/v1/firebaserules-gen.go b/firebaserules/v1/firebaserules-gen.go
index 7bad7e0..494eac4 100644
--- a/firebaserules/v1/firebaserules-gen.go
+++ b/firebaserules/v1/firebaserules-gen.go
@@ -67,9 +67,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Releases = NewProjectsReleasesService(s)
@@ -620,6 +625,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testrulesetrequest)
 	if err != nil {
@@ -794,6 +800,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.release)
 	if err != nil {
@@ -928,6 +935,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+name}")
@@ -1065,6 +1073,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1272,6 +1281,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1447,6 +1457,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.release)
 	if err != nil {
@@ -1591,6 +1602,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.ruleset)
 	if err != nil {
@@ -1728,6 +1740,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+name}")
@@ -1865,6 +1878,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2031,6 +2045,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/fitness/v1/fitness-gen.go b/fitness/v1/fitness-gen.go
index f33c29e..71ff5e9 100644
--- a/fitness/v1/fitness-gen.go
+++ b/fitness/v1/fitness-gen.go
@@ -112,9 +112,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Users *UsersService
 }
@@ -126,6 +127,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewUsersService(s *Service) *UsersService {
 	rs := &UsersService{s: s}
 	rs.DataSources = NewUsersDataSourcesService(s)
@@ -1318,6 +1323,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.datasource)
 	if err != nil {
@@ -1460,6 +1466,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/dataSources/{dataSourceId}")
@@ -1612,6 +1619,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1785,6 +1793,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1943,6 +1952,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.datasource)
 	if err != nil {
@@ -2098,6 +2108,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.datasource)
 	if err != nil {
@@ -2269,6 +2280,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/dataSources/{dataSourceId}/datasets/{datasetId}")
@@ -2439,6 +2451,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2649,6 +2662,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dataset)
 	if err != nil {
@@ -2836,6 +2850,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.aggregaterequest)
 	if err != nil {
@@ -2993,6 +3008,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/sessions/{sessionId}")
@@ -3147,6 +3163,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3342,6 +3359,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.session)
 	if err != nil {
diff --git a/fusiontables/v1/fusiontables-gen.go b/fusiontables/v1/fusiontables-gen.go
index c242c94..8fa1ee6 100644
--- a/fusiontables/v1/fusiontables-gen.go
+++ b/fusiontables/v1/fusiontables-gen.go
@@ -69,9 +69,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Column *ColumnService
 
@@ -93,6 +94,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewColumnService(s *Service) *ColumnService {
 	rs := &ColumnService{s: s}
 	return rs
@@ -1281,6 +1286,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/columns/{columnId}")
@@ -1397,6 +1403,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1534,6 +1541,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.column)
 	if err != nil {
@@ -1690,6 +1698,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1855,6 +1864,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.column)
 	if err != nil {
@@ -1998,6 +2008,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.column)
 	if err != nil {
@@ -2152,6 +2163,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "query")
@@ -2326,6 +2338,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2480,6 +2493,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/styles/{styleId}")
@@ -2597,6 +2611,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2735,6 +2750,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.stylesetting)
 	if err != nil {
@@ -2891,6 +2907,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3056,6 +3073,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.stylesetting)
 	if err != nil {
@@ -3200,6 +3218,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.stylesetting)
 	if err != nil {
@@ -3347,6 +3366,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/copy")
@@ -3476,6 +3496,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}")
@@ -3582,6 +3603,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3807,6 +3829,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/import")
@@ -4090,6 +4113,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/import")
@@ -4285,6 +4309,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.table)
 	if err != nil {
@@ -4425,6 +4450,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4586,6 +4612,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.table)
 	if err != nil {
@@ -4734,6 +4761,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.table)
 	if err != nil {
@@ -4872,6 +4900,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/tasks/{taskId}")
@@ -4987,6 +5016,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5151,6 +5181,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5317,6 +5348,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/templates/{templateId}")
@@ -5434,6 +5466,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5572,6 +5605,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.template)
 	if err != nil {
@@ -5728,6 +5762,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5893,6 +5928,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.template)
 	if err != nil {
@@ -6037,6 +6073,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.template)
 	if err != nil {
diff --git a/fusiontables/v2/fusiontables-gen.go b/fusiontables/v2/fusiontables-gen.go
index 3d47880..e429a1b 100644
--- a/fusiontables/v2/fusiontables-gen.go
+++ b/fusiontables/v2/fusiontables-gen.go
@@ -69,9 +69,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Column *ColumnService
 
@@ -93,6 +94,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewColumnService(s *Service) *ColumnService {
 	rs := &ColumnService{s: s}
 	return rs
@@ -1339,6 +1344,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/columns/{columnId}")
@@ -1455,6 +1461,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1592,6 +1599,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.column)
 	if err != nil {
@@ -1748,6 +1756,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1913,6 +1922,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.column)
 	if err != nil {
@@ -2056,6 +2066,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.column)
 	if err != nil {
@@ -2216,6 +2227,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "query")
@@ -2393,6 +2405,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2547,6 +2560,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/styles/{styleId}")
@@ -2664,6 +2678,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2802,6 +2817,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.stylesetting)
 	if err != nil {
@@ -2958,6 +2974,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3123,6 +3140,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.stylesetting)
 	if err != nil {
@@ -3267,6 +3285,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.stylesetting)
 	if err != nil {
@@ -3414,6 +3433,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/copy")
@@ -3543,6 +3563,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}")
@@ -3649,6 +3670,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3869,6 +3891,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/import")
@@ -4152,6 +4175,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/import")
@@ -4347,6 +4371,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.table)
 	if err != nil {
@@ -4487,6 +4512,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4648,6 +4674,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.table)
 	if err != nil {
@@ -4880,6 +4907,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/replace")
@@ -5107,6 +5135,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.table)
 	if err != nil {
@@ -5246,6 +5275,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/tasks/{taskId}")
@@ -5362,6 +5392,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5529,6 +5560,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5697,6 +5729,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "tables/{tableId}/templates/{templateId}")
@@ -5814,6 +5847,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5952,6 +5986,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.template)
 	if err != nil {
@@ -6108,6 +6143,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6273,6 +6309,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.template)
 	if err != nil {
@@ -6417,6 +6454,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.template)
 	if err != nil {
diff --git a/games/v1/games-gen.go b/games/v1/games-gen.go
index 83064f1..fcf798c 100644
--- a/games/v1/games-gen.go
+++ b/games/v1/games-gen.go
@@ -82,9 +82,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	AchievementDefinitions *AchievementDefinitionsService
 
@@ -124,6 +125,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAchievementDefinitionsService(s *Service) *AchievementDefinitionsService {
 	rs := &AchievementDefinitionsService{s: s}
 	return rs
@@ -5117,6 +5122,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5296,6 +5302,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "achievements/{achievementId}/increment")
@@ -5497,6 +5504,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5694,6 +5702,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "achievements/{achievementId}/reveal")
@@ -5835,6 +5844,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "achievements/{achievementId}/setStepsAtLeast")
@@ -5983,6 +5993,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "achievements/{achievementId}/unlock")
@@ -6121,6 +6132,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.achievementupdatemultiplerequest)
 	if err != nil {
@@ -6289,6 +6301,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6448,6 +6461,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "applications/played")
@@ -6558,6 +6572,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6731,6 +6746,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6931,6 +6947,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7106,6 +7123,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.eventrecordrequest)
 	if err != nil {
@@ -7262,6 +7280,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7439,6 +7458,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7616,6 +7636,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7781,6 +7802,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7993,6 +8015,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8173,6 +8196,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8365,6 +8389,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pushtokenid)
 	if err != nil {
@@ -8470,6 +8495,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pushtoken)
 	if err != nil {
@@ -8580,6 +8606,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "quests/{questId}/milestones/{milestoneId}/claim")
@@ -8713,6 +8740,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "quests/{questId}/accept")
@@ -8891,6 +8919,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9080,6 +9109,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9225,6 +9255,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.roomcreaterequest)
 	if err != nil {
@@ -9371,6 +9402,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "rooms/{roomId}/decline")
@@ -9514,6 +9546,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "rooms/{roomId}/dismiss")
@@ -9641,6 +9674,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9796,6 +9830,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.roomjoinrequest)
 	if err != nil {
@@ -9956,6 +9991,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.roomleaverequest)
 	if err != nil {
@@ -10138,6 +10174,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10316,6 +10353,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.roomp2pstatuses)
 	if err != nil {
@@ -10523,6 +10561,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10783,6 +10822,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11053,6 +11093,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11295,6 +11336,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "leaderboards/{leaderboardId}/scores")
@@ -11458,6 +11500,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.playerscoresubmissionlist)
 	if err != nil {
@@ -11614,6 +11657,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11795,6 +11839,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11975,6 +12020,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "turnbasedmatches/{matchId}/cancel")
@@ -12091,6 +12137,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.turnbasedmatchcreaterequest)
 	if err != nil {
@@ -12236,6 +12283,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "turnbasedmatches/{matchId}/decline")
@@ -12380,6 +12428,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "turnbasedmatches/{matchId}/dismiss")
@@ -12500,6 +12549,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.turnbasedmatchresults)
 	if err != nil {
@@ -12675,6 +12725,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12832,6 +12883,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "turnbasedmatches/{matchId}/join")
@@ -12982,6 +13034,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "turnbasedmatches/{matchId}/leave")
@@ -13143,6 +13196,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "turnbasedmatches/{matchId}/leaveTurn")
@@ -13350,6 +13404,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13549,6 +13604,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "turnbasedmatches/{matchId}/rematch")
@@ -13752,6 +13808,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13941,6 +13998,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.turnbasedmatchturn)
 	if err != nil {
diff --git a/gamesconfiguration/v1configuration/gamesconfiguration-gen.go b/gamesconfiguration/v1configuration/gamesconfiguration-gen.go
index 9aa15d1..6420515 100644
--- a/gamesconfiguration/v1configuration/gamesconfiguration-gen.go
+++ b/gamesconfiguration/v1configuration/gamesconfiguration-gen.go
@@ -63,9 +63,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	AchievementConfigurations *AchievementConfigurationsService
 
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAchievementConfigurationsService(s *Service) *AchievementConfigurationsService {
 	rs := &AchievementConfigurationsService{s: s}
 	return rs
@@ -662,6 +667,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "achievements/{achievementId}")
@@ -769,6 +775,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -897,6 +904,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.achievementconfiguration)
 	if err != nil {
@@ -1056,6 +1064,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1220,6 +1229,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.achievementconfiguration)
 	if err != nil {
@@ -1354,6 +1364,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.achievementconfiguration)
 	if err != nil {
@@ -1541,6 +1552,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "images/{resourceId}/imageType/{imageType}")
@@ -1745,6 +1757,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "leaderboards/{leaderboardId}")
@@ -1852,6 +1865,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1980,6 +1994,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.leaderboardconfiguration)
 	if err != nil {
@@ -2139,6 +2154,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2303,6 +2319,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.leaderboardconfiguration)
 	if err != nil {
@@ -2437,6 +2454,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.leaderboardconfiguration)
 	if err != nil {
diff --git a/gamesmanagement/v1management/gamesmanagement-gen.go b/gamesmanagement/v1management/gamesmanagement-gen.go
index d8ce087..fe4fadd 100644
--- a/gamesmanagement/v1management/gamesmanagement-gen.go
+++ b/gamesmanagement/v1management/gamesmanagement-gen.go
@@ -72,9 +72,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Achievements *AchievementsService
 
@@ -100,6 +101,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAchievementsService(s *Service) *AchievementsService {
 	rs := &AchievementsService{s: s}
 	return rs
@@ -854,6 +859,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "achievements/{achievementId}/reset")
@@ -978,6 +984,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "achievements/reset")
@@ -1088,6 +1095,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "achievements/resetAllForAllPlayers")
@@ -1172,6 +1180,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "achievements/{achievementId}/resetForAllPlayers")
@@ -1270,6 +1279,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.achievementresetmultipleforallrequest)
 	if err != nil {
@@ -1389,6 +1399,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1553,6 +1564,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "events/{eventId}/reset")
@@ -1650,6 +1662,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "events/reset")
@@ -1732,6 +1745,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "events/resetAllForAllPlayers")
@@ -1817,6 +1831,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "events/{eventId}/resetForAllPlayers")
@@ -1916,6 +1931,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.eventsresetmultipleforallrequest)
 	if err != nil {
@@ -2010,6 +2026,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "applications/{applicationId}/players/hidden/{playerId}")
@@ -2118,6 +2135,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "applications/{applicationId}/players/hidden/{playerId}")
@@ -2224,6 +2242,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "quests/{questId}/reset")
@@ -2320,6 +2339,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "quests/reset")
@@ -2401,6 +2421,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "quests/resetAllForAllPlayers")
@@ -2485,6 +2506,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "quests/{questId}/resetForAllPlayers")
@@ -2583,6 +2605,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.questsresetmultipleforallrequest)
 	if err != nil {
@@ -2673,6 +2696,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "rooms/reset")
@@ -2755,6 +2779,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "rooms/resetForAllPlayers")
@@ -2839,6 +2864,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "leaderboards/{leaderboardId}/scores/reset")
@@ -2963,6 +2989,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "scores/reset")
@@ -3073,6 +3100,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "scores/resetAllForAllPlayers")
@@ -3157,6 +3185,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "leaderboards/{leaderboardId}/scores/resetForAllPlayers")
@@ -3256,6 +3285,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.scoresresetmultipleforallrequest)
 	if err != nil {
@@ -3345,6 +3375,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "turnbasedmatches/reset")
@@ -3428,6 +3459,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "turnbasedmatches/resetForAllPlayers")
diff --git a/genomics/v1/genomics-api.json b/genomics/v1/genomics-api.json
index c8823d8..39f255b 100644
--- a/genomics/v1/genomics-api.json
+++ b/genomics/v1/genomics-api.json
@@ -1,489 +1,725 @@
 {
+  "rootUrl": "https://genomics.googleapis.com/",
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "genomics",
+  "batchPath": "batch",
+  "revision": "20170209",
   "id": "genomics:v1",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        },
-        "https://www.googleapis.com/auth/devstorage.read_write": {
-          "description": "Manage your data in Google Cloud Storage"
-        },
-        "https://www.googleapis.com/auth/bigquery": {
-          "description": "View and manage your data in Google BigQuery"
-        },
-        "https://www.googleapis.com/auth/genomics": {
-          "description": "View and manage Genomics data"
-        },
-        "https://www.googleapis.com/auth/genomics.readonly": {
-          "description": "View Genomics data"
-        }
-      }
-    }
-  },
-  "description": "Upload, process, query, and search Genomics data in the cloud.",
-  "protocol": "rest",
+  "documentationLink": "https://cloud.google.com/genomics",
   "title": "Genomics API",
+  "ownerName": "Google",
+  "discoveryVersion": "v1",
   "resources": {
-    "callsets": {
+    "datasets": {
       "methods": {
-        "create": {
-          "id": "genomics.callsets.create",
-          "response": {
-            "$ref": "CallSet"
-          },
-          "parameterOrder": [],
-          "description": "Creates a new call set.\n\nFor the definitions of call sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+        "setIamPolicy": {
+          "description": "Sets the access control policy on the specified dataset. Replaces any\nexisting policy.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nSee \u003ca href=\"/iam/docs/managing-policies#setting_a_policy\"\u003eSetting a\nPolicy\u003c/a\u003e for more information.",
           "request": {
-            "$ref": "CallSet"
+            "$ref": "SetIamPolicyRequest"
           },
-          "flatPath": "v1/callsets",
+          "response": {
+            "$ref": "Policy"
+          },
+          "parameterOrder": [
+            "resource"
+          ],
           "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/callsets",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "get": {
-          "id": "genomics.callsets.get",
-          "response": {
-            "$ref": "CallSet"
-          },
-          "parameterOrder": [
-            "callSetId"
           ],
-          "description": "Gets a call set by ID.\n\nFor the definitions of call sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "flatPath": "v1/callsets/{callSetId}",
-          "httpMethod": "GET",
           "parameters": {
-            "callSetId": {
-              "description": "The ID of the call set.",
-              "required": true,
+            "resource": {
+              "pattern": "^datasets/[^/]+$",
               "location": "path",
+              "description": "REQUIRED: The resource for which policy is being specified. Format is\n`datasets/\u003cdataset ID\u003e`.",
+              "required": true,
               "type": "string"
             }
           },
-          "path": "v1/callsets/{callSetId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
+          "flatPath": "v1/datasets/{datasetsId}:setIamPolicy",
+          "path": "v1/{+resource}:setIamPolicy",
+          "id": "genomics.datasets.setIamPolicy"
         },
-        "search": {
-          "id": "genomics.callsets.search",
+        "create": {
+          "path": "v1/datasets",
+          "id": "genomics.datasets.create",
+          "description": "Creates a new dataset.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+          "request": {
+            "$ref": "Dataset"
+          },
           "response": {
-            "$ref": "SearchCallSetsResponse"
+            "$ref": "Dataset"
           },
           "parameterOrder": [],
-          "description": "Gets a list of call sets matching the criteria.\n\nFor the definitions of call sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.searchCallSets](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/variantmethods.avdl#L178).",
-          "request": {
-            "$ref": "SearchCallSetsRequest"
-          },
-          "flatPath": "v1/callsets/search",
           "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/callsets/search",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {},
+          "flatPath": "v1/datasets"
         },
-        "patch": {
-          "id": "genomics.callsets.patch",
+        "getIamPolicy": {
+          "request": {
+            "$ref": "GetIamPolicyRequest"
+          },
+          "description": "Gets the access control policy for the dataset. This is empty if the\npolicy or resource does not exist.\n\nSee \u003ca href=\"/iam/docs/managing-policies#getting_a_policy\"\u003eGetting a\nPolicy\u003c/a\u003e for more information.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "resource"
+          ],
           "response": {
-            "$ref": "CallSet"
+            "$ref": "Policy"
+          },
+          "parameters": {
+            "resource": {
+              "description": "REQUIRED: The resource for which policy is being specified. Format is\n`datasets/\u003cdataset ID\u003e`.",
+              "required": true,
+              "type": "string",
+              "pattern": "^datasets/[^/]+$",
+              "location": "path"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "flatPath": "v1/datasets/{datasetsId}:getIamPolicy",
+          "id": "genomics.datasets.getIamPolicy",
+          "path": "v1/{+resource}:getIamPolicy"
+        },
+        "undelete": {
+          "response": {
+            "$ref": "Dataset"
           },
           "parameterOrder": [
-            "callSetId"
+            "datasetId"
           ],
-          "description": "Updates a call set.\n\nFor the definitions of call sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThis method supports patch semantics.",
-          "request": {
-            "$ref": "CallSet"
+          "httpMethod": "POST",
+          "parameters": {
+            "datasetId": {
+              "description": "The ID of the dataset to be undeleted.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
           },
-          "flatPath": "v1/callsets/{callSetId}",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "flatPath": "v1/datasets/{datasetId}:undelete",
+          "path": "v1/datasets/{datasetId}:undelete",
+          "id": "genomics.datasets.undelete",
+          "request": {
+            "$ref": "UndeleteDatasetRequest"
+          },
+          "description": "Undeletes a dataset by restoring a dataset which was deleted via this API.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThis operation is only possible for a week after the deletion occurred."
+        },
+        "patch": {
+          "response": {
+            "$ref": "Dataset"
+          },
+          "parameterOrder": [
+            "datasetId"
+          ],
           "httpMethod": "PATCH",
           "parameters": {
-            "callSetId": {
-              "description": "The ID of the call set to be updated.",
-              "required": true,
+            "datasetId": {
               "location": "path",
+              "description": "The ID of the dataset to be updated.",
+              "required": true,
               "type": "string"
             },
             "updateMask": {
               "description": "An optional mask specifying which fields to update. At this time, the only\nmutable field is name. The only\nacceptable value is \"name\". If unspecified, all mutable fields will be\nupdated.",
-              "location": "query",
+              "format": "google-fieldmask",
               "type": "string",
-              "format": "google-fieldmask"
+              "location": "query"
             }
           },
-          "path": "v1/callsets/{callSetId}",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
+          ],
+          "flatPath": "v1/datasets/{datasetId}",
+          "path": "v1/datasets/{datasetId}",
+          "id": "genomics.datasets.patch",
+          "request": {
+            "$ref": "Dataset"
+          },
+          "description": "Updates a dataset.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThis method supports patch semantics."
+        },
+        "get": {
+          "description": "Gets a dataset by ID.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+          "httpMethod": "GET",
+          "response": {
+            "$ref": "Dataset"
+          },
+          "parameterOrder": [
+            "datasetId"
+          ],
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "parameters": {
+            "datasetId": {
+              "description": "The ID of the dataset.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "flatPath": "v1/datasets/{datasetId}",
+          "id": "genomics.datasets.get",
+          "path": "v1/datasets/{datasetId}"
+        },
+        "testIamPermissions": {
+          "response": {
+            "$ref": "TestIamPermissionsResponse"
+          },
+          "parameterOrder": [
+            "resource"
+          ],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {
+            "resource": {
+              "pattern": "^datasets/[^/]+$",
+              "location": "path",
+              "description": "REQUIRED: The resource for which policy is being specified. Format is\n`datasets/\u003cdataset ID\u003e`.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1/datasets/{datasetsId}:testIamPermissions",
+          "path": "v1/{+resource}:testIamPermissions",
+          "id": "genomics.datasets.testIamPermissions",
+          "description": "Returns permissions that a caller has on the specified resource.\nSee \u003ca href=\"/iam/docs/managing-policies#testing_permissions\"\u003eTesting\nPermissions\u003c/a\u003e for more information.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+          "request": {
+            "$ref": "TestIamPermissionsRequest"
+          }
         },
         "delete": {
-          "id": "genomics.callsets.delete",
           "response": {
             "$ref": "Empty"
           },
           "parameterOrder": [
-            "callSetId"
+            "datasetId"
           ],
-          "description": "Deletes a call set.\n\nFor the definitions of call sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "flatPath": "v1/callsets/{callSetId}",
           "httpMethod": "DELETE",
           "parameters": {
-            "callSetId": {
-              "description": "The ID of the call set to be deleted.",
+            "datasetId": {
+              "description": "The ID of the dataset to be deleted.",
               "required": true,
-              "location": "path",
-              "type": "string"
+              "type": "string",
+              "location": "path"
             }
           },
-          "path": "v1/callsets/{callSetId}",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
+          ],
+          "flatPath": "v1/datasets/{datasetId}",
+          "path": "v1/datasets/{datasetId}",
+          "id": "genomics.datasets.delete",
+          "description": "Deletes a dataset and all of its contents (all read group sets,\nreference sets, variant sets, call sets, annotation sets, etc.)\nThis is reversible (up to one week after the deletion) via\nthe\ndatasets.undelete\noperation.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)"
+        },
+        "list": {
+          "id": "genomics.datasets.list",
+          "path": "v1/datasets",
+          "description": "Lists datasets within a project.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+          "httpMethod": "GET",
+          "response": {
+            "$ref": "ListDatasetsResponse"
+          },
+          "parameterOrder": [],
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "parameters": {
+            "pageToken": {
+              "location": "query",
+              "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
+              "type": "string"
+            },
+            "pageSize": {
+              "location": "query",
+              "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 50. The maximum value is 1024.",
+              "format": "int32",
+              "type": "integer"
+            },
+            "projectId": {
+              "description": "Required. The Google Cloud project ID to list datasets for.",
+              "type": "string",
+              "location": "query"
+            }
+          },
+          "flatPath": "v1/datasets"
         }
       }
     },
-    "annotationsets": {
+    "annotations": {
       "methods": {
-        "update": {
-          "id": "genomics.annotationsets.update",
-          "response": {
-            "$ref": "AnnotationSet"
-          },
-          "parameterOrder": [
-            "annotationSetId"
-          ],
-          "description": "Updates an annotation set. The update must respect all mutability\nrestrictions and other invariants described on the annotation set resource.\nCaller must have WRITE permission for the associated dataset.",
-          "request": {
-            "$ref": "AnnotationSet"
-          },
-          "flatPath": "v1/annotationsets/{annotationSetId}",
-          "httpMethod": "PUT",
-          "parameters": {
-            "updateMask": {
-              "description": "An optional mask specifying which fields to update. Mutable fields are\nname,\nsource_uri, and\ninfo. If unspecified, all\nmutable fields will be updated.",
-              "location": "query",
-              "type": "string",
-              "format": "google-fieldmask"
-            },
-            "annotationSetId": {
-              "description": "The ID of the annotation set to be updated.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/annotationsets/{annotationSetId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
         "create": {
-          "id": "genomics.annotationsets.create",
           "response": {
-            "$ref": "AnnotationSet"
+            "$ref": "Annotation"
           },
           "parameterOrder": [],
-          "description": "Creates a new annotation set. Caller must have WRITE permission for the\nassociated dataset.\n\nThe following fields are required:\n\n  * datasetId\n  * referenceSetId\n\nAll other fields may be optionally specified, unless documented as being\nserver-generated (for example, the `id` field).",
-          "request": {
-            "$ref": "AnnotationSet"
-          },
-          "flatPath": "v1/annotationsets",
           "httpMethod": "POST",
           "parameters": {},
-          "path": "v1/annotationsets",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "get": {
-          "id": "genomics.annotationsets.get",
-          "response": {
-            "$ref": "AnnotationSet"
-          },
-          "parameterOrder": [
-            "annotationSetId"
           ],
-          "description": "Gets an annotation set. Caller must have READ permission for\nthe associated dataset.",
-          "flatPath": "v1/annotationsets/{annotationSetId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "annotationSetId": {
-              "description": "The ID of the annotation set to be retrieved.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
+          "flatPath": "v1/annotations",
+          "path": "v1/annotations",
+          "id": "genomics.annotations.create",
+          "request": {
+            "$ref": "Annotation"
           },
-          "path": "v1/annotationsets/{annotationSetId}",
+          "description": "Creates a new annotation. Caller must have WRITE permission\nfor the associated annotation set.\n\nThe following fields are required:\n\n* annotationSetId\n* referenceName or\n  referenceId\n\n### Transcripts\n\nFor annotations of type TRANSCRIPT, the following fields of\ntranscript must be provided:\n\n* exons.start\n* exons.end\n\nAll other fields may be optionally specified, unless documented as being\nserver-generated (for example, the `id` field). The annotated\nrange must be no longer than 100Mbp (mega base pairs). See the\nAnnotation resource\nfor additional restrictions on each field."
+        },
+        "batchCreate": {
+          "request": {
+            "$ref": "BatchCreateAnnotationsRequest"
+          },
+          "description": "Creates one or more new annotations atomically. All annotations must\nbelong to the same annotation set. Caller must have WRITE\npermission for this annotation set. For optimal performance, batch\npositionally adjacent annotations together.\n\nIf the request has a systemic issue, such as an attempt to write to\nan inaccessible annotation set, the entire RPC will fail accordingly. For\nlesser data issues, when possible an error will be isolated to the\ncorresponding batch entry in the response; the remaining well formed\nannotations will be created normally.\n\nFor details on the requirements for each individual annotation resource,\nsee\nCreateAnnotation.",
+          "response": {
+            "$ref": "BatchCreateAnnotationsResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "parameters": {},
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "flatPath": "v1/annotations:batchCreate",
+          "path": "v1/annotations:batchCreate",
+          "id": "genomics.annotations.batchCreate"
         },
         "search": {
-          "id": "genomics.annotationsets.search",
-          "response": {
-            "$ref": "SearchAnnotationSetsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Searches for annotation sets that match the given criteria. Annotation sets\nare returned in an unspecified order. This order is consistent, such that\ntwo queries for the same content (regardless of page size) yield annotation\nsets in the same order across their respective streams of paginated\nresponses. Caller must have READ permission for the queried datasets.",
-          "request": {
-            "$ref": "SearchAnnotationSetsRequest"
-          },
-          "flatPath": "v1/annotationsets/search",
           "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/annotationsets/search",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "SearchAnnotationsResponse"
+          },
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics",
             "https://www.googleapis.com/auth/genomics.readonly"
-          ]
+          ],
+          "parameters": {},
+          "flatPath": "v1/annotations/search",
+          "id": "genomics.annotations.search",
+          "path": "v1/annotations/search",
+          "description": "Searches for annotations that match the given criteria. Results are\nordered by genomic coordinate (by reference sequence, then position).\nAnnotations with equivalent genomic coordinates are returned in an\nunspecified order. This order is consistent, such that two queries for the\nsame content (regardless of page size) yield annotations in the same order\nacross their respective streams of paginated responses. Caller must have\nREAD permission for the queried annotation sets.",
+          "request": {
+            "$ref": "SearchAnnotationsRequest"
+          }
+        },
+        "get": {
+          "httpMethod": "GET",
+          "response": {
+            "$ref": "Annotation"
+          },
+          "parameterOrder": [
+            "annotationId"
+          ],
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "parameters": {
+            "annotationId": {
+              "location": "path",
+              "description": "The ID of the annotation to be retrieved.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1/annotations/{annotationId}",
+          "id": "genomics.annotations.get",
+          "path": "v1/annotations/{annotationId}",
+          "description": "Gets an annotation. Caller must have READ permission\nfor the associated annotation set."
+        },
+        "update": {
+          "id": "genomics.annotations.update",
+          "path": "v1/annotations/{annotationId}",
+          "request": {
+            "$ref": "Annotation"
+          },
+          "description": "Updates an annotation. Caller must have\nWRITE permission for the associated dataset.",
+          "httpMethod": "PUT",
+          "parameterOrder": [
+            "annotationId"
+          ],
+          "response": {
+            "$ref": "Annotation"
+          },
+          "parameters": {
+            "updateMask": {
+              "location": "query",
+              "description": "An optional mask specifying which fields to update. Mutable fields are\nname,\nvariant,\ntranscript, and\ninfo. If unspecified, all mutable\nfields will be updated.",
+              "format": "google-fieldmask",
+              "type": "string"
+            },
+            "annotationId": {
+              "description": "The ID of the annotation to be updated.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "flatPath": "v1/annotations/{annotationId}"
         },
         "delete": {
-          "id": "genomics.annotationsets.delete",
+          "description": "Deletes an annotation. Caller must have WRITE permission for\nthe associated annotation set.",
           "response": {
             "$ref": "Empty"
           },
           "parameterOrder": [
-            "annotationSetId"
+            "annotationId"
           ],
-          "description": "Deletes an annotation set. Caller must have WRITE permission\nfor the associated annotation set.",
-          "flatPath": "v1/annotationsets/{annotationSetId}",
           "httpMethod": "DELETE",
-          "parameters": {
-            "annotationSetId": {
-              "description": "The ID of the annotation set to be deleted.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/annotationsets/{annotationSetId}",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
+          ],
+          "parameters": {
+            "annotationId": {
+              "location": "path",
+              "description": "The ID of the annotation to be deleted.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1/annotations/{annotationId}",
+          "path": "v1/annotations/{annotationId}",
+          "id": "genomics.annotations.delete"
+        }
+      }
+    },
+    "variantsets": {
+      "methods": {
+        "delete": {
+          "description": "Deletes a variant set including all variants, call sets, and calls within.\nThis is not reversible.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+          "parameterOrder": [
+            "variantSetId"
+          ],
+          "httpMethod": "DELETE",
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameters": {
+            "variantSetId": {
+              "description": "The ID of the variant set to be deleted.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "flatPath": "v1/variantsets/{variantSetId}",
+          "path": "v1/variantsets/{variantSetId}",
+          "id": "genomics.variantsets.delete"
+        },
+        "create": {
+          "response": {
+            "$ref": "VariantSet"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "flatPath": "v1/variantsets",
+          "path": "v1/variantsets",
+          "id": "genomics.variantsets.create",
+          "request": {
+            "$ref": "VariantSet"
+          },
+          "description": "Creates a new variant set.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThe provided variant set must have a valid `datasetId` set - all other\nfields are optional. Note that the `id` field will be ignored, as this is\nassigned by the server."
+        },
+        "export": {
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "variantSetId"
+          ],
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/bigquery",
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {
+            "variantSetId": {
+              "description": "Required. The ID of the variant set that contains variant data which\nshould be exported. The caller must have READ access to this variant set.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "flatPath": "v1/variantsets/{variantSetId}:export",
+          "id": "genomics.variantsets.export",
+          "path": "v1/variantsets/{variantSetId}:export",
+          "description": "Exports variant set data to an external destination.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+          "request": {
+            "$ref": "ExportVariantSetRequest"
+          }
+        },
+        "search": {
+          "request": {
+            "$ref": "SearchVariantSetsRequest"
+          },
+          "description": "Returns a list of all variant sets matching search criteria.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.searchVariantSets](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/variantmethods.avdl#L49).",
+          "response": {
+            "$ref": "SearchVariantSetsResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "flatPath": "v1/variantsets/search",
+          "path": "v1/variantsets/search",
+          "id": "genomics.variantsets.search"
+        },
+        "patch": {
+          "response": {
+            "$ref": "VariantSet"
+          },
+          "parameterOrder": [
+            "variantSetId"
+          ],
+          "httpMethod": "PATCH",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {
+            "updateMask": {
+              "description": "An optional mask specifying which fields to update. Supported fields:\n\n* metadata.\n* name.\n* description.\n\nLeaving `updateMask` unset is equivalent to specifying all mutable\nfields.",
+              "format": "google-fieldmask",
+              "type": "string",
+              "location": "query"
+            },
+            "variantSetId": {
+              "description": "The ID of the variant to be updated (must already exist).",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "flatPath": "v1/variantsets/{variantSetId}",
+          "path": "v1/variantsets/{variantSetId}",
+          "id": "genomics.variantsets.patch",
+          "description": "Updates a variant set using patch semantics.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+          "request": {
+            "$ref": "VariantSet"
+          }
+        },
+        "get": {
+          "response": {
+            "$ref": "VariantSet"
+          },
+          "parameterOrder": [
+            "variantSetId"
+          ],
+          "httpMethod": "GET",
+          "parameters": {
+            "variantSetId": {
+              "location": "path",
+              "description": "Required. The ID of the variant set.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "flatPath": "v1/variantsets/{variantSetId}",
+          "path": "v1/variantsets/{variantSetId}",
+          "id": "genomics.variantsets.get",
+          "description": "Gets a variant set by ID.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)"
         }
       }
     },
     "operations": {
       "methods": {
-        "get": {
-          "id": "genomics.operations.get",
+        "cancel": {
           "response": {
-            "$ref": "Operation"
+            "$ref": "Empty"
           },
           "parameterOrder": [
             "name"
           ],
-          "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice.",
-          "flatPath": "v1/operations/{operationsId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "name": {
-              "description": "The name of the operation resource.",
-              "required": true,
-              "pattern": "^operations/.+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/{+name}",
+          "httpMethod": "POST",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
+          ],
+          "parameters": {
+            "name": {
+              "description": "The name of the operation resource to be cancelled.",
+              "required": true,
+              "type": "string",
+              "pattern": "^operations/.+$",
+              "location": "path"
+            }
+          },
+          "flatPath": "v1/operations/{operationsId}:cancel",
+          "path": "v1/{+name}:cancel",
+          "id": "genomics.operations.cancel",
+          "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. Clients may use Operations.GetOperation or Operations.ListOperations to check whether the cancellation succeeded or the operation completed despite cancellation.",
+          "request": {
+            "$ref": "CancelOperationRequest"
+          }
         },
         "list": {
-          "id": "genomics.operations.list",
+          "description": "Lists operations that match the specified filter in the request.",
           "response": {
             "$ref": "ListOperationsResponse"
           },
           "parameterOrder": [
             "name"
           ],
-          "description": "Lists operations that match the specified filter in the request.",
-          "flatPath": "v1/operations",
           "httpMethod": "GET",
-          "parameters": {
-            "pageSize": {
-              "description": "The maximum number of results to return. If unspecified, defaults to\n256. The maximum value is 2048.",
-              "location": "query",
-              "type": "integer",
-              "format": "int32"
-            },
-            "filter": {
-              "description": "A string for filtering Operations.\nThe following filter fields are supported&#58;\n\n* projectId&#58; Required. Corresponds to\n  OperationMetadata.projectId.\n* createTime&#58; The time this job was created, in seconds from the\n  [epoch](http://en.wikipedia.org/wiki/Unix_time). Can use `\u003e=` and/or `\u003c=`\n  operators.\n* status&#58; Can be `RUNNING`, `SUCCESS`, `FAILURE`, or `CANCELED`. Only\n  one status may be specified.\n* labels.key where key is a label key.\n\nExamples&#58;\n\n* `projectId = my-project AND createTime \u003e= 1432140000`\n* `projectId = my-project AND createTime \u003e= 1432140000 AND createTime \u003c= 1432150000 AND status = RUNNING`\n* `projectId = my-project AND labels.color = *`\n* `projectId = my-project AND labels.color = red`",
-              "location": "query",
-              "type": "string"
-            },
-            "name": {
-              "description": "The name of the operation collection.",
-              "required": true,
-              "pattern": "^operations$",
-              "location": "path",
-              "type": "string"
-            },
-            "pageToken": {
-              "description": "The standard list page token.",
-              "location": "query",
-              "type": "string"
-            }
-          },
-          "path": "v1/{+name}",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
+          ],
+          "parameters": {
+            "name": {
+              "pattern": "^operations$",
+              "location": "path",
+              "description": "The name of the operation collection.",
+              "required": true,
+              "type": "string"
+            },
+            "pageToken": {
+              "location": "query",
+              "description": "The standard list page token.",
+              "type": "string"
+            },
+            "pageSize": {
+              "description": "The maximum number of results to return. If unspecified, defaults to\n256. The maximum value is 2048.",
+              "format": "int32",
+              "type": "integer",
+              "location": "query"
+            },
+            "filter": {
+              "location": "query",
+              "description": "A string for filtering Operations.\nThe following filter fields are supported&#58;\n\n* projectId&#58; Required. Corresponds to\n  OperationMetadata.projectId.\n* createTime&#58; The time this job was created, in seconds from the\n  [epoch](http://en.wikipedia.org/wiki/Unix_time). Can use `\u003e=` and/or `\u003c=`\n  operators.\n* status&#58; Can be `RUNNING`, `SUCCESS`, `FAILURE`, or `CANCELED`. Only\n  one status may be specified.\n* labels.key where key is a label key.\n\nExamples&#58;\n\n* `projectId = my-project AND createTime \u003e= 1432140000`\n* `projectId = my-project AND createTime \u003e= 1432140000 AND createTime \u003c= 1432150000 AND status = RUNNING`\n* `projectId = my-project AND labels.color = *`\n* `projectId = my-project AND labels.color = red`",
+              "type": "string"
+            }
+          },
+          "flatPath": "v1/operations",
+          "path": "v1/{+name}",
+          "id": "genomics.operations.list"
         },
-        "cancel": {
-          "id": "genomics.operations.cancel",
+        "get": {
+          "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice.",
+          "httpMethod": "GET",
           "response": {
-            "$ref": "Empty"
+            "$ref": "Operation"
           },
           "parameterOrder": [
             "name"
           ],
-          "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. Clients may use Operations.GetOperation or Operations.ListOperations to check whether the cancellation succeeded or the operation completed despite cancellation.",
-          "request": {
-            "$ref": "CancelOperationRequest"
-          },
-          "flatPath": "v1/operations/{operationsId}:cancel",
-          "httpMethod": "POST",
-          "parameters": {
-            "name": {
-              "description": "The name of the operation resource to be cancelled.",
-              "required": true,
-              "pattern": "^operations/.+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/{+name}:cancel",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
-        }
-      }
-    },
-    "references": {
-      "resources": {
-        "bases": {
-          "methods": {
-            "list": {
-              "id": "genomics.references.bases.list",
-              "response": {
-                "$ref": "ListBasesResponse"
-              },
-              "parameterOrder": [
-                "referenceId"
-              ],
-              "description": "Lists the bases in a reference, optionally restricted to a range.\n\nFor the definitions of references and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.getReferenceBases](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/referencemethods.avdl#L221).",
-              "flatPath": "v1/references/{referenceId}/bases",
-              "httpMethod": "GET",
-              "parameters": {
-                "end": {
-                  "description": "The end position (0-based, exclusive) of this query. Defaults to the length\nof this reference.",
-                  "location": "query",
-                  "type": "string",
-                  "format": "int64"
-                },
-                "pageSize": {
-                  "description": "The maximum number of bases to return in a single page. If unspecified,\ndefaults to 200Kbp (kilo base pairs). The maximum value is 10Mbp (mega base\npairs).",
-                  "location": "query",
-                  "type": "integer",
-                  "format": "int32"
-                },
-                "referenceId": {
-                  "description": "The ID of the reference.",
-                  "required": true,
-                  "location": "path",
-                  "type": "string"
-                },
-                "start": {
-                  "description": "The start position (0-based) of this query. Defaults to 0.",
-                  "location": "query",
-                  "type": "string",
-                  "format": "int64"
-                },
-                "pageToken": {
-                  "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
-                  "location": "query",
-                  "type": "string"
-                }
-              },
-              "path": "v1/references/{referenceId}/bases",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/genomics",
-                "https://www.googleapis.com/auth/genomics.readonly"
-              ]
-            }
-          }
-        }
-      },
-      "methods": {
-        "get": {
-          "id": "genomics.references.get",
-          "response": {
-            "$ref": "Reference"
-          },
-          "parameterOrder": [
-            "referenceId"
           ],
-          "description": "Gets a reference.\n\nFor the definitions of references and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.getReference](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/referencemethods.avdl#L158).",
-          "flatPath": "v1/references/{referenceId}",
-          "httpMethod": "GET",
           "parameters": {
-            "referenceId": {
-              "description": "The ID of the reference.",
-              "required": true,
+            "name": {
+              "pattern": "^operations/.+$",
               "location": "path",
+              "description": "The name of the operation resource.",
+              "required": true,
               "type": "string"
             }
           },
-          "path": "v1/references/{referenceId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
-        },
+          "flatPath": "v1/operations/{operationsId}",
+          "id": "genomics.operations.get",
+          "path": "v1/{+name}"
+        }
+      }
+    },
+    "referencesets": {
+      "methods": {
         "search": {
-          "id": "genomics.references.search",
-          "response": {
-            "$ref": "SearchReferencesResponse"
-          },
-          "parameterOrder": [],
-          "description": "Searches for references which match the given criteria.\n\nFor the definitions of references and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.searchReferences](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/referencemethods.avdl#L146).",
+          "id": "genomics.referencesets.search",
+          "path": "v1/referencesets/search",
+          "description": "Searches for reference sets which match the given criteria.\n\nFor the definitions of references and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.searchReferenceSets](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/referencemethods.avdl#L71)",
           "request": {
-            "$ref": "SearchReferencesRequest"
+            "$ref": "SearchReferenceSetsRequest"
           },
-          "flatPath": "v1/references/search",
           "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/references/search",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "SearchReferenceSetsResponse"
+          },
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics",
             "https://www.googleapis.com/auth/genomics.readonly"
-          ]
+          ],
+          "parameters": {},
+          "flatPath": "v1/referencesets/search"
+        },
+        "get": {
+          "id": "genomics.referencesets.get",
+          "path": "v1/referencesets/{referenceSetId}",
+          "description": "Gets a reference set.\n\nFor the definitions of references and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.getReferenceSet](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/referencemethods.avdl#L83).",
+          "httpMethod": "GET",
+          "response": {
+            "$ref": "ReferenceSet"
+          },
+          "parameterOrder": [
+            "referenceSetId"
+          ],
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "parameters": {
+            "referenceSetId": {
+              "location": "path",
+              "description": "The ID of the reference set.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1/referencesets/{referenceSetId}"
         }
       }
     },
@@ -492,1208 +728,867 @@
         "coveragebuckets": {
           "methods": {
             "list": {
-              "id": "genomics.readgroupsets.coveragebuckets.list",
+              "httpMethod": "GET",
               "response": {
                 "$ref": "ListCoverageBucketsResponse"
               },
               "parameterOrder": [
                 "readGroupSetId"
               ],
-              "description": "Lists fixed width coverage buckets for a read group set, each of which\ncorrespond to a range of a reference sequence. Each bucket summarizes\ncoverage information across its corresponding genomic range.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nCoverage is defined as the number of reads which are aligned to a given\nbase in the reference sequence. Coverage buckets are available at several\nprecomputed bucket widths, enabling retrieval of various coverage 'zoom\nlevels'. The caller must have READ permissions for the target read group\nset.",
-              "flatPath": "v1/readgroupsets/{readGroupSetId}/coveragebuckets",
-              "httpMethod": "GET",
-              "parameters": {
-                "referenceName": {
-                  "description": "The name of the reference to query, within the reference set associated\nwith this query. Optional.",
-                  "location": "query",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 1024. The maximum value is 2048.",
-                  "location": "query",
-                  "type": "integer",
-                  "format": "int32"
-                },
-                "targetBucketWidth": {
-                  "description": "The desired width of each reported coverage bucket in base pairs. This\nwill be rounded down to the nearest precomputed bucket width; the value\nof which is returned as `bucketWidth` in the response. Defaults\nto infinity (each bucket spans an entire reference sequence) or the length\nof the target range, if specified. The smallest precomputed\n`bucketWidth` is currently 2048 base pairs; this is subject to\nchange.",
-                  "location": "query",
-                  "type": "string",
-                  "format": "int64"
-                },
-                "readGroupSetId": {
-                  "description": "Required. The ID of the read group set over which coverage is requested.",
-                  "required": true,
-                  "location": "path",
-                  "type": "string"
-                },
-                "start": {
-                  "description": "The start position of the range on the reference, 0-based inclusive. If\nspecified, `referenceName` must also be specified. Defaults to 0.",
-                  "location": "query",
-                  "type": "string",
-                  "format": "int64"
-                },
-                "pageToken": {
-                  "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
-                  "location": "query",
-                  "type": "string"
-                },
-                "end": {
-                  "description": "The end position of the range on the reference, 0-based exclusive. If\nspecified, `referenceName` must also be specified. If unset or 0, defaults\nto the length of the reference.",
-                  "location": "query",
-                  "type": "string",
-                  "format": "int64"
-                }
-              },
-              "path": "v1/readgroupsets/{readGroupSetId}/coveragebuckets",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/genomics",
                 "https://www.googleapis.com/auth/genomics.readonly"
-              ]
+              ],
+              "parameters": {
+                "start": {
+                  "location": "query",
+                  "description": "The start position of the range on the reference, 0-based inclusive. If\nspecified, `referenceName` must also be specified. Defaults to 0.",
+                  "format": "int64",
+                  "type": "string"
+                },
+                "readGroupSetId": {
+                  "location": "path",
+                  "description": "Required. The ID of the read group set over which coverage is requested.",
+                  "required": true,
+                  "type": "string"
+                },
+                "targetBucketWidth": {
+                  "location": "query",
+                  "description": "The desired width of each reported coverage bucket in base pairs. This\nwill be rounded down to the nearest precomputed bucket width; the value\nof which is returned as `bucketWidth` in the response. Defaults\nto infinity (each bucket spans an entire reference sequence) or the length\nof the target range, if specified. The smallest precomputed\n`bucketWidth` is currently 2048 base pairs; this is subject to\nchange.",
+                  "format": "int64",
+                  "type": "string"
+                },
+                "referenceName": {
+                  "location": "query",
+                  "description": "The name of the reference to query, within the reference set associated\nwith this query. Optional.",
+                  "type": "string"
+                },
+                "end": {
+                  "location": "query",
+                  "description": "The end position of the range on the reference, 0-based exclusive. If\nspecified, `referenceName` must also be specified. If unset or 0, defaults\nto the length of the reference.",
+                  "format": "int64",
+                  "type": "string"
+                },
+                "pageToken": {
+                  "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 1024. The maximum value is 2048.",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                }
+              },
+              "flatPath": "v1/readgroupsets/{readGroupSetId}/coveragebuckets",
+              "id": "genomics.readgroupsets.coveragebuckets.list",
+              "path": "v1/readgroupsets/{readGroupSetId}/coveragebuckets",
+              "description": "Lists fixed width coverage buckets for a read group set, each of which\ncorrespond to a range of a reference sequence. Each bucket summarizes\ncoverage information across its corresponding genomic range.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nCoverage is defined as the number of reads which are aligned to a given\nbase in the reference sequence. Coverage buckets are available at several\nprecomputed bucket widths, enabling retrieval of various coverage 'zoom\nlevels'. The caller must have READ permissions for the target read group\nset."
             }
           }
         }
       },
       "methods": {
-        "export": {
-          "id": "genomics.readgroupsets.export",
+        "delete": {
           "response": {
-            "$ref": "Operation"
+            "$ref": "Empty"
           },
           "parameterOrder": [
             "readGroupSetId"
           ],
-          "description": "Exports a read group set to a BAM file in Google Cloud Storage.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nNote that currently there may be some differences between exported BAM\nfiles and the original BAM file at the time of import. See\nImportReadGroupSets\nfor caveats.",
+          "httpMethod": "DELETE",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {
+            "readGroupSetId": {
+              "location": "path",
+              "description": "The ID of the read group set to be deleted. The caller must have WRITE\npermissions to the dataset associated with this read group set.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1/readgroupsets/{readGroupSetId}",
+          "path": "v1/readgroupsets/{readGroupSetId}",
+          "id": "genomics.readgroupsets.delete",
+          "description": "Deletes a read group set.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)"
+        },
+        "import": {
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/devstorage.read_write",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {},
+          "flatPath": "v1/readgroupsets:import",
+          "id": "genomics.readgroupsets.import",
+          "path": "v1/readgroupsets:import",
+          "description": "Creates read group sets by asynchronously importing the provided\ninformation.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThe caller must have WRITE permissions to the dataset.\n\n## Notes on [BAM](https://samtools.github.io/hts-specs/SAMv1.pdf) import\n\n- Tags will be converted to strings - tag types are not preserved\n- Comments (`@CO`) in the input file header will not be preserved\n- Original header order of references (`@SQ`) will not be preserved\n- Any reverse stranded unmapped reads will be reverse complemented, and\ntheir qualities (also the \"BQ\" and \"OQ\" tags, if any) will be reversed\n- Unmapped reads will be stripped of positional information (reference name\nand position)",
+          "request": {
+            "$ref": "ImportReadGroupSetsRequest"
+          }
+        },
+        "export": {
+          "id": "genomics.readgroupsets.export",
+          "path": "v1/readgroupsets/{readGroupSetId}:export",
           "request": {
             "$ref": "ExportReadGroupSetRequest"
           },
-          "flatPath": "v1/readgroupsets/{readGroupSetId}:export",
+          "description": "Exports a read group set to a BAM file in Google Cloud Storage.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nNote that currently there may be some differences between exported BAM\nfiles and the original BAM file at the time of import. See\nImportReadGroupSets\nfor caveats.",
           "httpMethod": "POST",
+          "parameterOrder": [
+            "readGroupSetId"
+          ],
+          "response": {
+            "$ref": "Operation"
+          },
           "parameters": {
             "readGroupSetId": {
               "description": "Required. The ID of the read group set to export. The caller must have\nREAD access to this read group set.",
               "required": true,
-              "location": "path",
-              "type": "string"
+              "type": "string",
+              "location": "path"
             }
           },
-          "path": "v1/readgroupsets/{readGroupSetId}:export",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/devstorage.read_write",
             "https://www.googleapis.com/auth/genomics"
-          ]
+          ],
+          "flatPath": "v1/readgroupsets/{readGroupSetId}:export"
         },
         "search": {
-          "id": "genomics.readgroupsets.search",
           "response": {
             "$ref": "SearchReadGroupSetsResponse"
           },
           "parameterOrder": [],
-          "description": "Searches for read group sets matching the criteria.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.searchReadGroupSets](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/readmethods.avdl#L135).",
-          "request": {
-            "$ref": "SearchReadGroupSetsRequest"
-          },
-          "flatPath": "v1/readgroupsets/search",
           "httpMethod": "POST",
           "parameters": {},
-          "path": "v1/readgroupsets/search",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics",
             "https://www.googleapis.com/auth/genomics.readonly"
-          ]
+          ],
+          "flatPath": "v1/readgroupsets/search",
+          "path": "v1/readgroupsets/search",
+          "id": "genomics.readgroupsets.search",
+          "request": {
+            "$ref": "SearchReadGroupSetsRequest"
+          },
+          "description": "Searches for read group sets matching the criteria.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.searchReadGroupSets](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/readmethods.avdl#L135)."
         },
         "get": {
-          "id": "genomics.readgroupsets.get",
+          "description": "Gets a read group set by ID.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+          "httpMethod": "GET",
           "response": {
             "$ref": "ReadGroupSet"
           },
           "parameterOrder": [
             "readGroupSetId"
           ],
-          "description": "Gets a read group set by ID.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "flatPath": "v1/readgroupsets/{readGroupSetId}",
-          "httpMethod": "GET",
           "parameters": {
             "readGroupSetId": {
               "description": "The ID of the read group set.",
               "required": true,
-              "location": "path",
-              "type": "string"
+              "type": "string",
+              "location": "path"
             }
           },
-          "path": "v1/readgroupsets/{readGroupSetId}",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics",
             "https://www.googleapis.com/auth/genomics.readonly"
-          ]
+          ],
+          "flatPath": "v1/readgroupsets/{readGroupSetId}",
+          "id": "genomics.readgroupsets.get",
+          "path": "v1/readgroupsets/{readGroupSetId}"
         },
         "patch": {
-          "id": "genomics.readgroupsets.patch",
-          "response": {
-            "$ref": "ReadGroupSet"
-          },
+          "httpMethod": "PATCH",
           "parameterOrder": [
             "readGroupSetId"
           ],
-          "description": "Updates a read group set.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThis method supports patch semantics.",
-          "request": {
+          "response": {
             "$ref": "ReadGroupSet"
           },
-          "flatPath": "v1/readgroupsets/{readGroupSetId}",
-          "httpMethod": "PATCH",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
           "parameters": {
             "readGroupSetId": {
               "description": "The ID of the read group set to be updated. The caller must have WRITE\npermissions to the dataset associated with this read group set.",
               "required": true,
-              "location": "path",
-              "type": "string"
+              "type": "string",
+              "location": "path"
             },
             "updateMask": {
+              "location": "query",
               "description": "An optional mask specifying which fields to update. Supported fields:\n\n* name.\n* referenceSetId.\n\nLeaving `updateMask` unset is equivalent to specifying all mutable\nfields.",
-              "location": "query",
-              "type": "string",
-              "format": "google-fieldmask"
+              "format": "google-fieldmask",
+              "type": "string"
             }
           },
-          "path": "v1/readgroupsets/{readGroupSetId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "delete": {
-          "id": "genomics.readgroupsets.delete",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [
-            "readGroupSetId"
-          ],
-          "description": "Deletes a read group set.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
           "flatPath": "v1/readgroupsets/{readGroupSetId}",
-          "httpMethod": "DELETE",
-          "parameters": {
-            "readGroupSetId": {
-              "description": "The ID of the read group set to be deleted. The caller must have WRITE\npermissions to the dataset associated with this read group set.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
+          "id": "genomics.readgroupsets.patch",
           "path": "v1/readgroupsets/{readGroupSetId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "import": {
-          "id": "genomics.readgroupsets.import",
-          "response": {
-            "$ref": "Operation"
-          },
-          "parameterOrder": [],
-          "description": "Creates read group sets by asynchronously importing the provided\ninformation.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThe caller must have WRITE permissions to the dataset.\n\n## Notes on [BAM](https://samtools.github.io/hts-specs/SAMv1.pdf) import\n\n- Tags will be converted to strings - tag types are not preserved\n- Comments (`@CO`) in the input file header will not be preserved\n- Original header order of references (`@SQ`) will not be preserved\n- Any reverse stranded unmapped reads will be reverse complemented, and\ntheir qualities (also the \"BQ\" and \"OQ\" tags, if any) will be reversed\n- Unmapped reads will be stripped of positional information (reference name\nand position)",
+          "description": "Updates a read group set.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThis method supports patch semantics.",
           "request": {
-            "$ref": "ImportReadGroupSetsRequest"
-          },
-          "flatPath": "v1/readgroupsets:import",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/readgroupsets:import",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/devstorage.read_write",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        }
-      }
-    },
-    "variantsets": {
-      "methods": {
-        "export": {
-          "id": "genomics.variantsets.export",
-          "response": {
-            "$ref": "Operation"
-          },
-          "parameterOrder": [
-            "variantSetId"
-          ],
-          "description": "Exports variant set data to an external destination.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "request": {
-            "$ref": "ExportVariantSetRequest"
-          },
-          "flatPath": "v1/variantsets/{variantSetId}:export",
-          "httpMethod": "POST",
-          "parameters": {
-            "variantSetId": {
-              "description": "Required. The ID of the variant set that contains variant data which\nshould be exported. The caller must have READ access to this variant set.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/variantsets/{variantSetId}:export",
-          "scopes": [
-            "https://www.googleapis.com/auth/bigquery",
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "search": {
-          "id": "genomics.variantsets.search",
-          "response": {
-            "$ref": "SearchVariantSetsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Returns a list of all variant sets matching search criteria.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.searchVariantSets](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/variantmethods.avdl#L49).",
-          "request": {
-            "$ref": "SearchVariantSetsRequest"
-          },
-          "flatPath": "v1/variantsets/search",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/variantsets/search",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
-        },
-        "get": {
-          "id": "genomics.variantsets.get",
-          "response": {
-            "$ref": "VariantSet"
-          },
-          "parameterOrder": [
-            "variantSetId"
-          ],
-          "description": "Gets a variant set by ID.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "flatPath": "v1/variantsets/{variantSetId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "variantSetId": {
-              "description": "Required. The ID of the variant set.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/variantsets/{variantSetId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
-        },
-        "create": {
-          "id": "genomics.variantsets.create",
-          "response": {
-            "$ref": "VariantSet"
-          },
-          "parameterOrder": [],
-          "description": "Creates a new variant set.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThe provided variant set must have a valid `datasetId` set - all other\nfields are optional. Note that the `id` field will be ignored, as this is\nassigned by the server.",
-          "request": {
-            "$ref": "VariantSet"
-          },
-          "flatPath": "v1/variantsets",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/variantsets",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "patch": {
-          "id": "genomics.variantsets.patch",
-          "response": {
-            "$ref": "VariantSet"
-          },
-          "parameterOrder": [
-            "variantSetId"
-          ],
-          "description": "Updates a variant set using patch semantics.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "request": {
-            "$ref": "VariantSet"
-          },
-          "flatPath": "v1/variantsets/{variantSetId}",
-          "httpMethod": "PATCH",
-          "parameters": {
-            "variantSetId": {
-              "description": "The ID of the variant to be updated (must already exist).",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            },
-            "updateMask": {
-              "description": "An optional mask specifying which fields to update. Supported fields:\n\n* metadata.\n* name.\n* description.\n\nLeaving `updateMask` unset is equivalent to specifying all mutable\nfields.",
-              "location": "query",
-              "type": "string",
-              "format": "google-fieldmask"
-            }
-          },
-          "path": "v1/variantsets/{variantSetId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "delete": {
-          "id": "genomics.variantsets.delete",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [
-            "variantSetId"
-          ],
-          "description": "Deletes a variant set including all variants, call sets, and calls within.\nThis is not reversible.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "flatPath": "v1/variantsets/{variantSetId}",
-          "httpMethod": "DELETE",
-          "parameters": {
-            "variantSetId": {
-              "description": "The ID of the variant set to be deleted.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/variantsets/{variantSetId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        }
-      }
-    },
-    "annotations": {
-      "methods": {
-        "search": {
-          "id": "genomics.annotations.search",
-          "response": {
-            "$ref": "SearchAnnotationsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Searches for annotations that match the given criteria. Results are\nordered by genomic coordinate (by reference sequence, then position).\nAnnotations with equivalent genomic coordinates are returned in an\nunspecified order. This order is consistent, such that two queries for the\nsame content (regardless of page size) yield annotations in the same order\nacross their respective streams of paginated responses. Caller must have\nREAD permission for the queried annotation sets.",
-          "request": {
-            "$ref": "SearchAnnotationsRequest"
-          },
-          "flatPath": "v1/annotations/search",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/annotations/search",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
-        },
-        "get": {
-          "id": "genomics.annotations.get",
-          "response": {
-            "$ref": "Annotation"
-          },
-          "parameterOrder": [
-            "annotationId"
-          ],
-          "description": "Gets an annotation. Caller must have READ permission\nfor the associated annotation set.",
-          "flatPath": "v1/annotations/{annotationId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "annotationId": {
-              "description": "The ID of the annotation to be retrieved.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/annotations/{annotationId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
-        },
-        "create": {
-          "id": "genomics.annotations.create",
-          "response": {
-            "$ref": "Annotation"
-          },
-          "parameterOrder": [],
-          "description": "Creates a new annotation. Caller must have WRITE permission\nfor the associated annotation set.\n\nThe following fields are required:\n\n* annotationSetId\n* referenceName or\n  referenceId\n\n### Transcripts\n\nFor annotations of type TRANSCRIPT, the following fields of\ntranscript must be provided:\n\n* exons.start\n* exons.end\n\nAll other fields may be optionally specified, unless documented as being\nserver-generated (for example, the `id` field). The annotated\nrange must be no longer than 100Mbp (mega base pairs). See the\nAnnotation resource\nfor additional restrictions on each field.",
-          "request": {
-            "$ref": "Annotation"
-          },
-          "flatPath": "v1/annotations",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/annotations",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "update": {
-          "id": "genomics.annotations.update",
-          "response": {
-            "$ref": "Annotation"
-          },
-          "parameterOrder": [
-            "annotationId"
-          ],
-          "description": "Updates an annotation. Caller must have\nWRITE permission for the associated dataset.",
-          "request": {
-            "$ref": "Annotation"
-          },
-          "flatPath": "v1/annotations/{annotationId}",
-          "httpMethod": "PUT",
-          "parameters": {
-            "annotationId": {
-              "description": "The ID of the annotation to be updated.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            },
-            "updateMask": {
-              "description": "An optional mask specifying which fields to update. Mutable fields are\nname,\nvariant,\ntranscript, and\ninfo. If unspecified, all mutable\nfields will be updated.",
-              "location": "query",
-              "type": "string",
-              "format": "google-fieldmask"
-            }
-          },
-          "path": "v1/annotations/{annotationId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "batchCreate": {
-          "id": "genomics.annotations.batchCreate",
-          "response": {
-            "$ref": "BatchCreateAnnotationsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Creates one or more new annotations atomically. All annotations must\nbelong to the same annotation set. Caller must have WRITE\npermission for this annotation set. For optimal performance, batch\npositionally adjacent annotations together.\n\nIf the request has a systemic issue, such as an attempt to write to\nan inaccessible annotation set, the entire RPC will fail accordingly. For\nlesser data issues, when possible an error will be isolated to the\ncorresponding batch entry in the response; the remaining well formed\nannotations will be created normally.\n\nFor details on the requirements for each individual annotation resource,\nsee\nCreateAnnotation.",
-          "request": {
-            "$ref": "BatchCreateAnnotationsRequest"
-          },
-          "flatPath": "v1/annotations:batchCreate",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/annotations:batchCreate",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "delete": {
-          "id": "genomics.annotations.delete",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [
-            "annotationId"
-          ],
-          "description": "Deletes an annotation. Caller must have WRITE permission for\nthe associated annotation set.",
-          "flatPath": "v1/annotations/{annotationId}",
-          "httpMethod": "DELETE",
-          "parameters": {
-            "annotationId": {
-              "description": "The ID of the annotation to be deleted.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/annotations/{annotationId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
+            "$ref": "ReadGroupSet"
+          }
         }
       }
     },
     "reads": {
       "methods": {
         "search": {
-          "id": "genomics.reads.search",
           "response": {
             "$ref": "SearchReadsResponse"
           },
           "parameterOrder": [],
-          "description": "Gets a list of reads for one or more read group sets.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nReads search operates over a genomic coordinate space of reference sequence\n& position defined over the reference sequences to which the requested\nread group sets are aligned.\n\nIf a target positional range is specified, search returns all reads whose\nalignment to the reference genome overlap the range. A query which\nspecifies only read group set IDs yields all reads in those read group\nsets, including unmapped reads.\n\nAll reads returned (including reads on subsequent pages) are ordered by\ngenomic coordinate (by reference sequence, then position). Reads with\nequivalent genomic coordinates are returned in an unspecified order. This\norder is consistent, such that two queries for the same content (regardless\nof page size) yield reads in the same order across their respective streams\nof paginated responses.\n\nImplements\n[GlobalAllianceApi.searchReads](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/readmethods.avdl#L85).",
-          "request": {
-            "$ref": "SearchReadsRequest"
-          },
-          "flatPath": "v1/reads/search",
           "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/reads/search",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics",
             "https://www.googleapis.com/auth/genomics.readonly"
-          ]
+          ],
+          "parameters": {},
+          "flatPath": "v1/reads/search",
+          "path": "v1/reads/search",
+          "id": "genomics.reads.search",
+          "description": "Gets a list of reads for one or more read group sets.\n\nFor the definitions of read group sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nReads search operates over a genomic coordinate space of reference sequence\n& position defined over the reference sequences to which the requested\nread group sets are aligned.\n\nIf a target positional range is specified, search returns all reads whose\nalignment to the reference genome overlap the range. A query which\nspecifies only read group set IDs yields all reads in those read group\nsets, including unmapped reads.\n\nAll reads returned (including reads on subsequent pages) are ordered by\ngenomic coordinate (by reference sequence, then position). Reads with\nequivalent genomic coordinates are returned in an unspecified order. This\norder is consistent, such that two queries for the same content (regardless\nof page size) yield reads in the same order across their respective streams\nof paginated responses.\n\nImplements\n[GlobalAllianceApi.searchReads](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/readmethods.avdl#L85).",
+          "request": {
+            "$ref": "SearchReadsRequest"
+          }
+        }
+      }
+    },
+    "callsets": {
+      "methods": {
+        "delete": {
+          "description": "Deletes a call set.\n\nFor the definitions of call sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameterOrder": [
+            "callSetId"
+          ],
+          "httpMethod": "DELETE",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {
+            "callSetId": {
+              "description": "The ID of the call set to be deleted.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "flatPath": "v1/callsets/{callSetId}",
+          "path": "v1/callsets/{callSetId}",
+          "id": "genomics.callsets.delete"
+        },
+        "search": {
+          "path": "v1/callsets/search",
+          "id": "genomics.callsets.search",
+          "description": "Gets a list of call sets matching the criteria.\n\nFor the definitions of call sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.searchCallSets](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/variantmethods.avdl#L178).",
+          "request": {
+            "$ref": "SearchCallSetsRequest"
+          },
+          "response": {
+            "$ref": "SearchCallSetsResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "parameters": {},
+          "flatPath": "v1/callsets/search"
+        },
+        "patch": {
+          "description": "Updates a call set.\n\nFor the definitions of call sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThis method supports patch semantics.",
+          "request": {
+            "$ref": "CallSet"
+          },
+          "response": {
+            "$ref": "CallSet"
+          },
+          "parameterOrder": [
+            "callSetId"
+          ],
+          "httpMethod": "PATCH",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {
+            "callSetId": {
+              "description": "The ID of the call set to be updated.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            },
+            "updateMask": {
+              "description": "An optional mask specifying which fields to update. At this time, the only\nmutable field is name. The only\nacceptable value is \"name\". If unspecified, all mutable fields will be\nupdated.",
+              "format": "google-fieldmask",
+              "type": "string",
+              "location": "query"
+            }
+          },
+          "flatPath": "v1/callsets/{callSetId}",
+          "path": "v1/callsets/{callSetId}",
+          "id": "genomics.callsets.patch"
+        },
+        "get": {
+          "httpMethod": "GET",
+          "response": {
+            "$ref": "CallSet"
+          },
+          "parameterOrder": [
+            "callSetId"
+          ],
+          "parameters": {
+            "callSetId": {
+              "location": "path",
+              "description": "The ID of the call set.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "flatPath": "v1/callsets/{callSetId}",
+          "id": "genomics.callsets.get",
+          "path": "v1/callsets/{callSetId}",
+          "description": "Gets a call set by ID.\n\nFor the definitions of call sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)"
+        },
+        "create": {
+          "path": "v1/callsets",
+          "id": "genomics.callsets.create",
+          "description": "Creates a new call set.\n\nFor the definitions of call sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+          "request": {
+            "$ref": "CallSet"
+          },
+          "response": {
+            "$ref": "CallSet"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {},
+          "flatPath": "v1/callsets"
         }
       }
     },
     "variants": {
       "methods": {
-        "merge": {
-          "id": "genomics.variants.merge",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [],
-          "description": "Merges the given variants with existing variants.\n\nFor the definitions of variants and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nEach variant will be\nmerged with an existing variant that matches its reference sequence,\nstart, end, reference bases, and alternative bases. If no such variant\nexists, a new one will be created.\n\nWhen variants are merged, the call information from the new variant\nis added to the existing variant. Variant info fields are merged as\nspecified in the\ninfoMergeConfig\nfield of the MergeVariantsRequest.\n\nPlease exercise caution when using this method!  It is easy to introduce\nmistakes in existing variants and difficult to back out of them.  For\nexample,\nsuppose you were trying to merge a new variant with an existing one and\nboth\nvariants contain calls that belong to callsets with the same callset ID.\n\n    // Existing variant - irrelevant fields trimmed for clarity\n    {\n        \"variantSetId\": \"10473108253681171589\",\n        \"referenceName\": \"1\",\n        \"start\": \"10582\",\n        \"referenceBases\": \"G\",\n        \"alternateBases\": [\n            \"A\"\n        ],\n        \"calls\": [\n            {\n                \"callSetId\": \"10473108253681171589-0\",\n                \"callSetName\": \"CALLSET0\",\n                \"genotype\": [\n                    0,\n                    1\n                ],\n            }\n        ]\n    }\n\n    // New variant with conflicting call information\n    {\n        \"variantSetId\": \"10473108253681171589\",\n        \"referenceName\": \"1\",\n        \"start\": \"10582\",\n        \"referenceBases\": \"G\",\n        \"alternateBases\": [\n            \"A\"\n        ],\n        \"calls\": [\n            {\n                \"callSetId\": \"10473108253681171589-0\",\n                \"callSetName\": \"CALLSET0\",\n                \"genotype\": [\n                    1,\n                    1\n                ],\n            }\n        ]\n    }\n\nThe resulting merged variant would overwrite the existing calls with those\nfrom the new variant:\n\n    {\n        \"variantSetId\": \"10473108253681171589\",\n        \"referenceName\": \"1\",\n        \"start\": \"10582\",\n        \"referenceBases\": \"G\",\n        \"alternateBases\": [\n            \"A\"\n        ],\n        \"calls\": [\n            {\n                \"callSetId\": \"10473108253681171589-0\",\n                \"callSetName\": \"CALLSET0\",\n                \"genotype\": [\n                    1,\n                    1\n                ],\n            }\n        ]\n    }\n\nThis may be the desired outcome, but it is up to the user to determine if\nif that is indeed the case.",
-          "request": {
-            "$ref": "MergeVariantsRequest"
-          },
-          "flatPath": "v1/variants:merge",
+        "create": {
           "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/variants:merge",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "Variant"
+          },
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "search": {
-          "id": "genomics.variants.search",
-          "response": {
-            "$ref": "SearchVariantsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Gets a list of variants matching the criteria.\n\nFor the definitions of variants and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.searchVariants](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/variantmethods.avdl#L126).",
-          "request": {
-            "$ref": "SearchVariantsRequest"
-          },
-          "flatPath": "v1/variants/search",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/variants/search",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
-        },
-        "get": {
-          "id": "genomics.variants.get",
-          "response": {
-            "$ref": "Variant"
-          },
-          "parameterOrder": [
-            "variantId"
           ],
-          "description": "Gets a variant by ID.\n\nFor the definitions of variants and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "flatPath": "v1/variants/{variantId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "variantId": {
-              "description": "The ID of the variant.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/variants/{variantId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
-        },
-        "create": {
+          "parameters": {},
+          "flatPath": "v1/variants",
           "id": "genomics.variants.create",
-          "response": {
-            "$ref": "Variant"
-          },
-          "parameterOrder": [],
+          "path": "v1/variants",
           "description": "Creates a new variant.\n\nFor the definitions of variants and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
           "request": {
             "$ref": "Variant"
-          },
-          "flatPath": "v1/variants",
+          }
+        },
+        "search": {
           "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/variants",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "SearchVariantsResponse"
+          },
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "parameters": {},
+          "flatPath": "v1/variants/search",
+          "id": "genomics.variants.search",
+          "path": "v1/variants/search",
+          "description": "Gets a list of variants matching the criteria.\n\nFor the definitions of variants and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.searchVariants](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/variantmethods.avdl#L126).",
+          "request": {
+            "$ref": "SearchVariantsRequest"
+          }
         },
-        "patch": {
-          "id": "genomics.variants.patch",
+        "get": {
+          "httpMethod": "GET",
           "response": {
             "$ref": "Variant"
           },
           "parameterOrder": [
             "variantId"
           ],
-          "description": "Updates a variant.\n\nFor the definitions of variants and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThis method supports patch semantics. Returns the modified variant without\nits calls.",
-          "request": {
-            "$ref": "Variant"
-          },
-          "flatPath": "v1/variants/{variantId}",
-          "httpMethod": "PATCH",
           "parameters": {
-            "updateMask": {
-              "description": "An optional mask specifying which fields to update. At this time, mutable\nfields are names and\ninfo. Acceptable values are \"names\" and\n\"info\". If unspecified, all mutable fields will be updated.",
-              "location": "query",
-              "type": "string",
-              "format": "google-fieldmask"
-            },
             "variantId": {
-              "description": "The ID of the variant to be updated.",
-              "required": true,
               "location": "path",
+              "description": "The ID of the variant.",
+              "required": true,
               "type": "string"
             }
           },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "flatPath": "v1/variants/{variantId}",
+          "id": "genomics.variants.get",
           "path": "v1/variants/{variantId}",
+          "description": "Gets a variant by ID.\n\nFor the definitions of variants and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)"
+        },
+        "patch": {
+          "response": {
+            "$ref": "Variant"
+          },
+          "parameterOrder": [
+            "variantId"
+          ],
+          "httpMethod": "PATCH",
+          "parameters": {
+            "variantId": {
+              "description": "The ID of the variant to be updated.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            },
+            "updateMask": {
+              "location": "query",
+              "description": "An optional mask specifying which fields to update. At this time, mutable\nfields are names and\ninfo. Acceptable values are \"names\" and\n\"info\". If unspecified, all mutable fields will be updated.",
+              "format": "google-fieldmask",
+              "type": "string"
+            }
+          },
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
+          ],
+          "flatPath": "v1/variants/{variantId}",
+          "path": "v1/variants/{variantId}",
+          "id": "genomics.variants.patch",
+          "request": {
+            "$ref": "Variant"
+          },
+          "description": "Updates a variant.\n\nFor the definitions of variants and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThis method supports patch semantics. Returns the modified variant without\nits calls."
         },
         "delete": {
-          "id": "genomics.variants.delete",
+          "httpMethod": "DELETE",
           "response": {
             "$ref": "Empty"
           },
           "parameterOrder": [
             "variantId"
           ],
-          "description": "Deletes a variant.\n\nFor the definitions of variants and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "flatPath": "v1/variants/{variantId}",
-          "httpMethod": "DELETE",
           "parameters": {
             "variantId": {
+              "location": "path",
               "description": "The ID of the variant to be deleted.",
               "required": true,
-              "location": "path",
               "type": "string"
             }
           },
-          "path": "v1/variants/{variantId}",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
+          ],
+          "flatPath": "v1/variants/{variantId}",
+          "id": "genomics.variants.delete",
+          "path": "v1/variants/{variantId}",
+          "description": "Deletes a variant.\n\nFor the definitions of variants and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)"
+        },
+        "merge": {
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "Empty"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {},
+          "flatPath": "v1/variants:merge",
+          "id": "genomics.variants.merge",
+          "path": "v1/variants:merge",
+          "description": "Merges the given variants with existing variants.\n\nFor the definitions of variants and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nEach variant will be\nmerged with an existing variant that matches its reference sequence,\nstart, end, reference bases, and alternative bases. If no such variant\nexists, a new one will be created.\n\nWhen variants are merged, the call information from the new variant\nis added to the existing variant. Variant info fields are merged as\nspecified in the\ninfoMergeConfig\nfield of the MergeVariantsRequest.\n\nPlease exercise caution when using this method!  It is easy to introduce\nmistakes in existing variants and difficult to back out of them.  For\nexample,\nsuppose you were trying to merge a new variant with an existing one and\nboth\nvariants contain calls that belong to callsets with the same callset ID.\n\n    // Existing variant - irrelevant fields trimmed for clarity\n    {\n        \"variantSetId\": \"10473108253681171589\",\n        \"referenceName\": \"1\",\n        \"start\": \"10582\",\n        \"referenceBases\": \"G\",\n        \"alternateBases\": [\n            \"A\"\n        ],\n        \"calls\": [\n            {\n                \"callSetId\": \"10473108253681171589-0\",\n                \"callSetName\": \"CALLSET0\",\n                \"genotype\": [\n                    0,\n                    1\n                ],\n            }\n        ]\n    }\n\n    // New variant with conflicting call information\n    {\n        \"variantSetId\": \"10473108253681171589\",\n        \"referenceName\": \"1\",\n        \"start\": \"10582\",\n        \"referenceBases\": \"G\",\n        \"alternateBases\": [\n            \"A\"\n        ],\n        \"calls\": [\n            {\n                \"callSetId\": \"10473108253681171589-0\",\n                \"callSetName\": \"CALLSET0\",\n                \"genotype\": [\n                    1,\n                    1\n                ],\n            }\n        ]\n    }\n\nThe resulting merged variant would overwrite the existing calls with those\nfrom the new variant:\n\n    {\n        \"variantSetId\": \"10473108253681171589\",\n        \"referenceName\": \"1\",\n        \"start\": \"10582\",\n        \"referenceBases\": \"G\",\n        \"alternateBases\": [\n            \"A\"\n        ],\n        \"calls\": [\n            {\n                \"callSetId\": \"10473108253681171589-0\",\n                \"callSetName\": \"CALLSET0\",\n                \"genotype\": [\n                    1,\n                    1\n                ],\n            }\n        ]\n    }\n\nThis may be the desired outcome, but it is up to the user to determine if\nif that is indeed the case.",
+          "request": {
+            "$ref": "MergeVariantsRequest"
+          }
         },
         "import": {
-          "id": "genomics.variants.import",
+          "httpMethod": "POST",
+          "parameterOrder": [],
           "response": {
             "$ref": "Operation"
           },
-          "parameterOrder": [],
-          "description": "Creates variant data by asynchronously importing the provided information.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThe variants for import will be merged with any existing variant that\nmatches its reference sequence, start, end, reference bases, and\nalternative bases. If no such variant exists, a new one will be created.\n\nWhen variants are merged, the call information from the new variant\nis added to the existing variant, and Variant info fields are merged\nas specified in\ninfoMergeConfig.\nAs a special case, for single-sample VCF files, QUAL and FILTER fields will\nbe moved to the call level; these are sometimes interpreted in a\ncall-specific context.\nImported VCF headers are appended to the metadata already in a variant set.",
-          "request": {
-            "$ref": "ImportVariantsRequest"
-          },
-          "flatPath": "v1/variants:import",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/variants:import",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/devstorage.read_write",
             "https://www.googleapis.com/auth/genomics"
-          ]
+          ],
+          "parameters": {},
+          "flatPath": "v1/variants:import",
+          "id": "genomics.variants.import",
+          "path": "v1/variants:import",
+          "description": "Creates variant data by asynchronously importing the provided information.\n\nFor the definitions of variant sets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThe variants for import will be merged with any existing variant that\nmatches its reference sequence, start, end, reference bases, and\nalternative bases. If no such variant exists, a new one will be created.\n\nWhen variants are merged, the call information from the new variant\nis added to the existing variant, and Variant info fields are merged\nas specified in\ninfoMergeConfig.\nAs a special case, for single-sample VCF files, QUAL and FILTER fields will\nbe moved to the call level; these are sometimes interpreted in a\ncall-specific context.\nImported VCF headers are appended to the metadata already in a variant set.",
+          "request": {
+            "$ref": "ImportVariantsRequest"
+          }
         }
       }
     },
-    "referencesets": {
+    "annotationsets": {
       "methods": {
-        "get": {
-          "id": "genomics.referencesets.get",
-          "response": {
-            "$ref": "ReferenceSet"
-          },
-          "parameterOrder": [
-            "referenceSetId"
-          ],
-          "description": "Gets a reference set.\n\nFor the definitions of references and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.getReferenceSet](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/referencemethods.avdl#L83).",
-          "flatPath": "v1/referencesets/{referenceSetId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "referenceSetId": {
-              "description": "The ID of the reference set.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/referencesets/{referenceSetId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
-        },
-        "search": {
-          "id": "genomics.referencesets.search",
-          "response": {
-            "$ref": "SearchReferenceSetsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Searches for reference sets which match the given criteria.\n\nFor the definitions of references and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.searchReferenceSets](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/referencemethods.avdl#L71)",
-          "request": {
-            "$ref": "SearchReferenceSetsRequest"
-          },
-          "flatPath": "v1/referencesets/search",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/referencesets/search",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
-        }
-      }
-    },
-    "datasets": {
-      "methods": {
-        "getIamPolicy": {
-          "id": "genomics.datasets.getIamPolicy",
-          "response": {
-            "$ref": "Policy"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
-          "description": "Gets the access control policy for the dataset. This is empty if the\npolicy or resource does not exist.\n\nSee \u003ca href=\"/iam/docs/managing-policies#getting_a_policy\"\u003eGetting a\nPolicy\u003c/a\u003e for more information.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "request": {
-            "$ref": "GetIamPolicyRequest"
-          },
-          "flatPath": "v1/datasets/{datasetsId}:getIamPolicy",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which policy is being specified. Format is\n`datasets/\u003cdataset ID\u003e`.",
-              "required": true,
-              "pattern": "^datasets/[^/]+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/{+resource}:getIamPolicy",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "undelete": {
-          "id": "genomics.datasets.undelete",
-          "response": {
-            "$ref": "Dataset"
-          },
-          "parameterOrder": [
-            "datasetId"
-          ],
-          "description": "Undeletes a dataset by restoring a dataset which was deleted via this API.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThis operation is only possible for a week after the deletion occurred.",
-          "request": {
-            "$ref": "UndeleteDatasetRequest"
-          },
-          "flatPath": "v1/datasets/{datasetId}:undelete",
-          "httpMethod": "POST",
-          "parameters": {
-            "datasetId": {
-              "description": "The ID of the dataset to be undeleted.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/datasets/{datasetId}:undelete",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "list": {
-          "id": "genomics.datasets.list",
-          "response": {
-            "$ref": "ListDatasetsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Lists datasets within a project.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "flatPath": "v1/datasets",
-          "httpMethod": "GET",
-          "parameters": {
-            "pageSize": {
-              "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 50. The maximum value is 1024.",
-              "location": "query",
-              "type": "integer",
-              "format": "int32"
-            },
-            "projectId": {
-              "description": "Required. The Google Cloud project ID to list datasets for.",
-              "location": "query",
-              "type": "string"
-            },
-            "pageToken": {
-              "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
-              "location": "query",
-              "type": "string"
-            }
-          },
-          "path": "v1/datasets",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
-        },
-        "get": {
-          "id": "genomics.datasets.get",
-          "response": {
-            "$ref": "Dataset"
-          },
-          "parameterOrder": [
-            "datasetId"
-          ],
-          "description": "Gets a dataset by ID.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "flatPath": "v1/datasets/{datasetId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "datasetId": {
-              "description": "The ID of the dataset.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/datasets/{datasetId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics",
-            "https://www.googleapis.com/auth/genomics.readonly"
-          ]
-        },
-        "create": {
-          "id": "genomics.datasets.create",
-          "response": {
-            "$ref": "Dataset"
-          },
-          "parameterOrder": [],
-          "description": "Creates a new dataset.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "request": {
-            "$ref": "Dataset"
-          },
-          "flatPath": "v1/datasets",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/datasets",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "patch": {
-          "id": "genomics.datasets.patch",
-          "response": {
-            "$ref": "Dataset"
-          },
-          "parameterOrder": [
-            "datasetId"
-          ],
-          "description": "Updates a dataset.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nThis method supports patch semantics.",
-          "request": {
-            "$ref": "Dataset"
-          },
-          "flatPath": "v1/datasets/{datasetId}",
-          "httpMethod": "PATCH",
-          "parameters": {
-            "updateMask": {
-              "description": "An optional mask specifying which fields to update. At this time, the only\nmutable field is name. The only\nacceptable value is \"name\". If unspecified, all mutable fields will be\nupdated.",
-              "location": "query",
-              "type": "string",
-              "format": "google-fieldmask"
-            },
-            "datasetId": {
-              "description": "The ID of the dataset to be updated.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/datasets/{datasetId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "setIamPolicy": {
-          "id": "genomics.datasets.setIamPolicy",
-          "response": {
-            "$ref": "Policy"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
-          "description": "Sets the access control policy on the specified dataset. Replaces any\nexisting policy.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nSee \u003ca href=\"/iam/docs/managing-policies#setting_a_policy\"\u003eSetting a\nPolicy\u003c/a\u003e for more information.",
-          "request": {
-            "$ref": "SetIamPolicyRequest"
-          },
-          "flatPath": "v1/datasets/{datasetsId}:setIamPolicy",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which policy is being specified. Format is\n`datasets/\u003cdataset ID\u003e`.",
-              "required": true,
-              "pattern": "^datasets/[^/]+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/{+resource}:setIamPolicy",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
         "delete": {
-          "id": "genomics.datasets.delete",
+          "description": "Deletes an annotation set. Caller must have WRITE permission\nfor the associated annotation set.",
+          "parameterOrder": [
+            "annotationSetId"
+          ],
+          "httpMethod": "DELETE",
           "response": {
             "$ref": "Empty"
           },
-          "parameterOrder": [
-            "datasetId"
-          ],
-          "description": "Deletes a dataset and all of its contents (all read group sets,\nreference sets, variant sets, call sets, annotation sets, etc.)\nThis is reversible (up to one week after the deletion) via\nthe\ndatasets.undelete\noperation.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "flatPath": "v1/datasets/{datasetId}",
-          "httpMethod": "DELETE",
-          "parameters": {
-            "datasetId": {
-              "description": "The ID of the dataset to be deleted.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/datasets/{datasetId}",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
+          ],
+          "parameters": {
+            "annotationSetId": {
+              "description": "The ID of the annotation set to be deleted.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "flatPath": "v1/annotationsets/{annotationSetId}",
+          "path": "v1/annotationsets/{annotationSetId}",
+          "id": "genomics.annotationsets.delete"
         },
-        "testIamPermissions": {
-          "id": "genomics.datasets.testIamPermissions",
+        "search": {
+          "httpMethod": "POST",
+          "parameterOrder": [],
           "response": {
-            "$ref": "TestIamPermissionsResponse"
+            "$ref": "SearchAnnotationSetsResponse"
+          },
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "flatPath": "v1/annotationsets/search",
+          "id": "genomics.annotationsets.search",
+          "path": "v1/annotationsets/search",
+          "request": {
+            "$ref": "SearchAnnotationSetsRequest"
+          },
+          "description": "Searches for annotation sets that match the given criteria. Annotation sets\nare returned in an unspecified order. This order is consistent, such that\ntwo queries for the same content (regardless of page size) yield annotation\nsets in the same order across their respective streams of paginated\nresponses. Caller must have READ permission for the queried datasets."
+        },
+        "get": {
+          "response": {
+            "$ref": "AnnotationSet"
           },
           "parameterOrder": [
-            "resource"
+            "annotationSetId"
           ],
-          "description": "Returns permissions that a caller has on the specified resource.\nSee \u003ca href=\"/iam/docs/managing-policies#testing_permissions\"\u003eTesting\nPermissions\u003c/a\u003e for more information.\n\nFor the definitions of datasets and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-          "request": {
-            "$ref": "TestIamPermissionsRequest"
-          },
-          "flatPath": "v1/datasets/{datasetsId}:testIamPermissions",
-          "httpMethod": "POST",
+          "httpMethod": "GET",
           "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which policy is being specified. Format is\n`datasets/\u003cdataset ID\u003e`.",
+            "annotationSetId": {
+              "description": "The ID of the annotation set to be retrieved.",
               "required": true,
-              "pattern": "^datasets/[^/]+$",
-              "location": "path",
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "flatPath": "v1/annotationsets/{annotationSetId}",
+          "path": "v1/annotationsets/{annotationSetId}",
+          "id": "genomics.annotationsets.get",
+          "description": "Gets an annotation set. Caller must have READ permission for\nthe associated dataset."
+        },
+        "update": {
+          "httpMethod": "PUT",
+          "parameterOrder": [
+            "annotationSetId"
+          ],
+          "response": {
+            "$ref": "AnnotationSet"
+          },
+          "parameters": {
+            "annotationSetId": {
+              "description": "The ID of the annotation set to be updated.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            },
+            "updateMask": {
+              "location": "query",
+              "description": "An optional mask specifying which fields to update. Mutable fields are\nname,\nsource_uri, and\ninfo. If unspecified, all\nmutable fields will be updated.",
+              "format": "google-fieldmask",
               "type": "string"
             }
           },
-          "path": "v1/{+resource}:testIamPermissions",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/genomics"
-          ]
+          ],
+          "flatPath": "v1/annotationsets/{annotationSetId}",
+          "id": "genomics.annotationsets.update",
+          "path": "v1/annotationsets/{annotationSetId}",
+          "request": {
+            "$ref": "AnnotationSet"
+          },
+          "description": "Updates an annotation set. The update must respect all mutability\nrestrictions and other invariants described on the annotation set resource.\nCaller must have WRITE permission for the associated dataset."
+        },
+        "create": {
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "AnnotationSet"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {},
+          "flatPath": "v1/annotationsets",
+          "id": "genomics.annotationsets.create",
+          "path": "v1/annotationsets",
+          "description": "Creates a new annotation set. Caller must have WRITE permission for the\nassociated dataset.\n\nThe following fields are required:\n\n  * datasetId\n  * referenceSetId\n\nAll other fields may be optionally specified, unless documented as being\nserver-generated (for example, the `id` field).",
+          "request": {
+            "$ref": "AnnotationSet"
+          }
+        }
+      }
+    },
+    "references": {
+      "methods": {
+        "search": {
+          "response": {
+            "$ref": "SearchReferencesResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "flatPath": "v1/references/search",
+          "path": "v1/references/search",
+          "id": "genomics.references.search",
+          "request": {
+            "$ref": "SearchReferencesRequest"
+          },
+          "description": "Searches for references which match the given criteria.\n\nFor the definitions of references and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.searchReferences](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/referencemethods.avdl#L146)."
+        },
+        "get": {
+          "id": "genomics.references.get",
+          "path": "v1/references/{referenceId}",
+          "description": "Gets a reference.\n\nFor the definitions of references and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.getReference](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/referencemethods.avdl#L158).",
+          "httpMethod": "GET",
+          "response": {
+            "$ref": "Reference"
+          },
+          "parameterOrder": [
+            "referenceId"
+          ],
+          "parameters": {
+            "referenceId": {
+              "location": "path",
+              "description": "The ID of the reference.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics",
+            "https://www.googleapis.com/auth/genomics.readonly"
+          ],
+          "flatPath": "v1/references/{referenceId}"
+        }
+      },
+      "resources": {
+        "bases": {
+          "methods": {
+            "list": {
+              "httpMethod": "GET",
+              "response": {
+                "$ref": "ListBasesResponse"
+              },
+              "parameterOrder": [
+                "referenceId"
+              ],
+              "parameters": {
+                "pageToken": {
+                  "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "description": "The maximum number of bases to return in a single page. If unspecified,\ndefaults to 200Kbp (kilo base pairs). The maximum value is 10Mbp (mega base\npairs).",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                },
+                "start": {
+                  "location": "query",
+                  "description": "The start position (0-based) of this query. Defaults to 0.",
+                  "format": "int64",
+                  "type": "string"
+                },
+                "referenceId": {
+                  "location": "path",
+                  "description": "The ID of the reference.",
+                  "required": true,
+                  "type": "string"
+                },
+                "end": {
+                  "description": "The end position (0-based, exclusive) of this query. Defaults to the length\nof this reference.",
+                  "format": "int64",
+                  "type": "string",
+                  "location": "query"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/genomics",
+                "https://www.googleapis.com/auth/genomics.readonly"
+              ],
+              "flatPath": "v1/references/{referenceId}/bases",
+              "id": "genomics.references.bases.list",
+              "path": "v1/references/{referenceId}/bases",
+              "description": "Lists the bases in a reference, optionally restricted to a range.\n\nFor the definitions of references and other genomics resources, see\n[Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nImplements\n[GlobalAllianceApi.getReferenceBases](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/referencemethods.avdl#L221)."
+            }
+          }
         }
       }
     }
   },
+  "parameters": {
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    },
+    "bearer_token": {
+      "location": "query",
+      "description": "OAuth bearer token.",
+      "type": "string"
+    },
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query"
+    },
+    "callback": {
+      "description": "JSONP",
+      "type": "string",
+      "location": "query"
+    },
+    "alt": {
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query"
+    },
+    "access_token": {
+      "description": "OAuth access token.",
+      "type": "string",
+      "location": "query"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string",
+      "location": "query"
+    },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string",
+      "location": "query"
+    },
+    "pp": {
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    }
+  },
   "schemas": {
-    "SearchReferencesRequest": {
-      "type": "object",
-      "properties": {
-        "referenceSetId": {
-          "description": "If present, return only references which belong to this reference set.",
-          "type": "string"
-        },
-        "md5checksums": {
-          "description": "If present, return references for which the\nmd5checksum matches exactly.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "pageSize": {
-          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 1024. The maximum value is 4096.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "accessions": {
-          "description": "If present, return references for which a prefix of any of\nsourceAccessions match\nany of these strings. Accession numbers typically have a main number and a\nversion, for example `GCF_000001405.26`.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "pageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
-          "type": "string"
-        }
-      },
-      "id": "SearchReferencesRequest"
-    },
-    "ReadGroupSet": {
-      "description": "A read group set is a logical collection of read groups, which are\ncollections of reads produced by a sequencer. A read group set typically\nmodels reads corresponding to one sample, sequenced one way, and aligned one\nway.\n\n* A read group set belongs to one dataset.\n* A read group belongs to one read group set.\n* A read belongs to one read group.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-      "type": "object",
-      "properties": {
-        "id": {
-          "description": "The server-generated read group set ID, unique for all read group sets.",
-          "type": "string"
-        },
-        "info": {
-          "description": "A map of additional read group set information.",
-          "additionalProperties": {
-            "type": "array",
-            "items": {
-              "type": "any"
-            }
-          },
-          "type": "object"
-        },
-        "datasetId": {
-          "description": "The dataset to which this read group set belongs.",
-          "type": "string"
-        },
-        "filename": {
-          "description": "The filename of the original source file for this read group set, if any.",
-          "type": "string"
-        },
-        "name": {
-          "description": "The read group set name. By default this will be initialized to the sample\nname of the sequenced data contained in this set.",
-          "type": "string"
-        },
-        "referenceSetId": {
-          "description": "The reference set to which the reads in this read group set are aligned.",
-          "type": "string"
-        },
-        "readGroups": {
-          "description": "The read groups in this set. There are typically 1-10 read groups in a read\ngroup set.",
-          "type": "array",
-          "items": {
-            "$ref": "ReadGroup"
-          }
-        }
-      },
-      "id": "ReadGroupSet"
-    },
-    "ExportVariantSetRequest": {
-      "description": "The variant data export request.",
-      "type": "object",
-      "properties": {
-        "callSetIds": {
-          "description": "If provided, only variant call information from the specified call sets\nwill be exported. By default all variant calls are exported.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "bigqueryDataset": {
-          "description": "Required. The BigQuery dataset to export data to. This dataset must already\nexist. Note that this is distinct from the Genomics concept of \"dataset\".",
-          "type": "string"
-        },
-        "bigqueryTable": {
-          "description": "Required. The BigQuery table to export data to.\nIf the table doesn't exist, it will be created. If it already exists, it\nwill be overwritten.",
-          "type": "string"
-        },
-        "projectId": {
-          "description": "Required. The Google Cloud project ID that owns the destination\nBigQuery dataset. The caller must have WRITE access to this project.  This\nproject will also own the resulting export job.",
-          "type": "string"
-        },
-        "format": {
-          "description": "The format for the exported data.",
-          "enum": [
-            "FORMAT_UNSPECIFIED",
-            "FORMAT_BIGQUERY"
-          ],
-          "enumDescriptions": [
-            "",
-            "Export the data to Google BigQuery."
-          ],
-          "type": "string"
-        }
-      },
-      "id": "ExportVariantSetRequest"
-    },
-    "ComputeEngine": {
-      "description": "Describes a Compute Engine resource that is being managed by a running\npipeline.",
-      "type": "object",
-      "properties": {
-        "instanceName": {
-          "description": "The instance on which the operation is running.",
-          "type": "string"
-        },
-        "machineType": {
-          "description": "The machine type of the instance.",
-          "type": "string"
-        },
-        "zone": {
-          "description": "The availability zone in which the instance resides.",
-          "type": "string"
-        },
-        "diskNames": {
-          "description": "The names of the disks that were created for this pipeline.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "ComputeEngine"
-    },
-    "CodingSequence": {
-      "type": "object",
-      "properties": {
-        "end": {
-          "description": "The end of the coding sequence on this annotation's reference sequence,\n0-based exclusive. Note that this position is relative to the reference\nstart, and *not* the containing annotation start.",
-          "type": "string",
-          "format": "int64"
-        },
-        "start": {
-          "description": "The start of the coding sequence on this annotation's reference sequence,\n0-based inclusive. Note that this position is relative to the reference\nstart, and *not* the containing annotation start.",
-          "type": "string",
-          "format": "int64"
-        }
-      },
-      "id": "CodingSequence"
-    },
-    "Transcript": {
-      "description": "A transcript represents the assertion that a particular region of the\nreference genome may be transcribed as RNA.",
-      "type": "object",
-      "properties": {
-        "codingSequence": {
-          "description": "The range of the coding sequence for this transcript, if any. To determine\nthe exact ranges of coding sequence, intersect this range with those of the\nexons, if any. If there are any\nexons, the\ncodingSequence must start\nand end within them.\n\nNote that in some cases, the reference genome will not exactly match the\nobserved mRNA transcript e.g. due to variance in the source genome from\nreference. In these cases,\nexon.frame will not necessarily\nmatch the expected reference reading frame and coding exon reference bases\ncannot necessarily be concatenated to produce the original transcript mRNA.",
-          "$ref": "CodingSequence"
-        },
-        "geneId": {
-          "description": "The annotation ID of the gene from which this transcript is transcribed.",
-          "type": "string"
-        },
-        "exons": {
-          "description": "The \u003ca href=\"http://en.wikipedia.org/wiki/Exon\"\u003eexons\u003c/a\u003e that compose\nthis transcript. This field should be unset for genomes where transcript\nsplicing does not occur, for example prokaryotes.\n\nIntrons are regions of the transcript that are not included in the\nspliced RNA product. Though not explicitly modeled here, intron ranges can\nbe deduced; all regions of this transcript that are not exons are introns.\n\nExonic sequences do not necessarily code for a translational product\n(amino acids). Only the regions of exons bounded by the\ncodingSequence correspond\nto coding DNA sequence.\n\nExons are ordered by start position and may not overlap.",
-          "type": "array",
-          "items": {
-            "$ref": "Exon"
-          }
-        }
-      },
-      "id": "Transcript"
-    },
     "ListOperationsResponse": {
       "description": "The response message for Operations.ListOperations.",
       "type": "object",
@@ -1712,57 +1607,106 @@
       },
       "id": "ListOperationsResponse"
     },
-    "Entry": {
+    "Variant": {
+      "description": "A variant represents a change in DNA sequence relative to a reference\nsequence. For example, a variant could represent a SNP or an insertion.\nVariants belong to a variant set.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nEach of the calls on a variant represent a determination of genotype with\nrespect to that variant. For example, a call might assign probability of 0.32\nto the occurrence of a SNP named rs1234 in a sample named NA12345. A call\nbelongs to a call set, which contains related calls typically from one\nsample.",
       "type": "object",
       "properties": {
-        "annotation": {
-          "description": "The created annotation, if creation was successful.",
-          "$ref": "Annotation"
+        "variantSetId": {
+          "description": "The ID of the variant set this variant belongs to.",
+          "type": "string"
         },
-        "status": {
-          "description": "The creation status.",
-          "$ref": "Status"
-        }
-      },
-      "id": "Entry"
-    },
-    "ClinicalCondition": {
-      "type": "object",
-      "properties": {
-        "externalIds": {
-          "description": "The set of external IDs for this condition.",
-          "type": "array",
-          "items": {
-            "$ref": "ExternalId"
-          }
+        "referenceName": {
+          "description": "The reference on which this variant occurs.\n(such as `chr20` or `X`)",
+          "type": "string"
+        },
+        "info": {
+          "additionalProperties": {
+            "type": "array",
+            "items": {
+              "type": "any"
+            }
+          },
+          "description": "A map of additional variant information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
+          "type": "object"
+        },
+        "referenceBases": {
+          "description": "The reference bases for this variant. They start at the given\nposition.",
+          "type": "string"
         },
         "names": {
-          "description": "A set of names for the condition.",
+          "description": "Names for the variant, for example a RefSNP ID.",
           "type": "array",
           "items": {
             "type": "string"
           }
         },
-        "omimId": {
-          "description": "The OMIM id for this condition.\nSearch for these IDs at http://omim.org/",
+        "alternateBases": {
+          "description": "The bases that appear instead of the reference bases.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "end": {
+          "description": "The end position (0-based) of this variant. This corresponds to the first\nbase after the last base in the reference allele. So, the length of\nthe reference allele is (end - start). This is useful for variants\nthat don't explicitly give alternate bases, for example large deletions.",
+          "format": "int64",
           "type": "string"
         },
-        "conceptId": {
-          "description": "The MedGen concept id associated with this gene.\nSearch for these IDs at http://www.ncbi.nlm.nih.gov/medgen/",
+        "filter": {
+          "description": "A list of filters (normally quality filters) this variant has failed.\n`PASS` indicates this variant has passed all filters.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "calls": {
+          "description": "The variant calls for this particular variant. Each one represents the\ndetermination of genotype with respect to this variant.",
+          "type": "array",
+          "items": {
+            "$ref": "VariantCall"
+          }
+        },
+        "created": {
+          "description": "The date this variant was created, in milliseconds from the epoch.",
+          "format": "int64",
+          "type": "string"
+        },
+        "start": {
+          "description": "The position at which this variant occurs (0-based).\nThis corresponds to the first base of the string of reference bases.",
+          "format": "int64",
+          "type": "string"
+        },
+        "quality": {
+          "description": "A measure of how likely this variant is to be real.\nA higher value is better.",
+          "format": "double",
+          "type": "number"
+        },
+        "id": {
+          "description": "The server-generated variant ID, unique across all variants.",
           "type": "string"
         }
       },
-      "id": "ClinicalCondition"
+      "id": "Variant"
     },
-    "CancelOperationRequest": {
-      "description": "The request message for Operations.CancelOperation.",
+    "SearchCallSetsResponse": {
+      "description": "The call set search response.",
       "type": "object",
-      "properties": {},
-      "id": "CancelOperationRequest"
+      "properties": {
+        "nextPageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
+          "type": "string"
+        },
+        "callSets": {
+          "description": "The list of matching call sets.",
+          "type": "array",
+          "items": {
+            "$ref": "CallSet"
+          }
+        }
+      },
+      "id": "SearchCallSetsResponse"
     },
     "SearchVariantsRequest": {
-      "description": "The variant search request.",
-      "type": "object",
       "properties": {
         "referenceName": {
           "description": "Required. Only return variants in this reference sequence.",
@@ -1775,20 +1719,24 @@
             "type": "string"
           }
         },
+        "end": {
+          "description": "The end of the window, 0-based exclusive. If unspecified or 0, defaults to\nthe length of the reference.",
+          "format": "int64",
+          "type": "string"
+        },
         "maxCalls": {
           "description": "The maximum number of calls to return in a single page. Note that this\nlimit may be exceeded in the event that a matching variant contains more\ncalls than the requested maximum. If unspecified, defaults to 5000. The\nmaximum value is 10000.",
-          "type": "integer",
-          "format": "int32"
+          "format": "int32",
+          "type": "integer"
+        },
+        "pageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
+          "type": "string"
         },
         "pageSize": {
           "description": "The maximum number of variants to return in a single page. If unspecified,\ndefaults to 5000. The maximum value is 10000.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "start": {
-          "description": "The beginning of the window (0-based, inclusive) for which\noverlapping variants should be returned. If unspecified, defaults to 0.",
-          "type": "string",
-          "format": "int64"
+          "format": "int32",
+          "type": "integer"
         },
         "callSetIds": {
           "description": "Only return variant calls which belong to call sets with these ids.\nLeaving this blank returns all variant calls. If a variant has no\ncalls belonging to any of these call sets, it won't be returned at all.",
@@ -1797,58 +1745,286 @@
             "type": "string"
           }
         },
+        "start": {
+          "description": "The beginning of the window (0-based, inclusive) for which\noverlapping variants should be returned. If unspecified, defaults to 0.",
+          "format": "int64",
+          "type": "string"
+        },
         "variantName": {
           "description": "Only return variants which have exactly this name.",
           "type": "string"
+        }
+      },
+      "id": "SearchVariantsRequest",
+      "description": "The variant search request.",
+      "type": "object"
+    },
+    "OperationMetadata": {
+      "properties": {
+        "startTime": {
+          "description": "The time at which the job began to run.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "request": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "The original request that started the operation. Note that this will be in\ncurrent version of the API. If the operation was started with v1beta2 API\nand a GetOperation is performed on v1 API, a v1 request will be returned.",
+          "type": "object"
+        },
+        "runtimeMetadata": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "Runtime metadata on this Operation.",
+          "type": "object"
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optionally provided by the caller when submitting the request that creates\nthe operation.",
+          "type": "object"
+        },
+        "createTime": {
+          "description": "The time at which the job was submitted to the Genomics service.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "projectId": {
+          "description": "The Google Cloud Project in which the job is scoped.",
+          "type": "string"
+        },
+        "clientId": {
+          "description": "This field is deprecated. Use `labels` instead. Optionally provided by the\ncaller when submitting the request that creates the operation.",
+          "type": "string"
+        },
+        "endTime": {
+          "description": "The time at which the job stopped running.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "events": {
+          "description": "Optional event messages that were generated during the job's execution.\nThis also contains any warnings that were generated during import\nor export.",
+          "type": "array",
+          "items": {
+            "$ref": "OperationEvent"
+          }
+        }
+      },
+      "id": "OperationMetadata",
+      "description": "Metadata describing an Operation.",
+      "type": "object"
+    },
+    "SearchReadGroupSetsRequest": {
+      "description": "The read group set search request.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "Only return read group sets for which a substring of the name matches this\nstring.",
+          "type": "string"
         },
         "pageToken": {
           "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
           "type": "string"
         },
-        "end": {
-          "description": "The end of the window, 0-based exclusive. If unspecified or 0, defaults to\nthe length of the reference.",
-          "type": "string",
-          "format": "int64"
+        "pageSize": {
+          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 256. The maximum value is 1024.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "datasetIds": {
+          "description": "Restricts this query to read group sets within the given datasets. At least\none ID must be provided.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
         }
       },
-      "id": "SearchVariantsRequest"
+      "id": "SearchReadGroupSetsRequest"
     },
-    "VariantSetMetadata": {
-      "description": "Metadata describes a single piece of variant call metadata.\nThese data include a top level key and either a single value string (value)\nor a list of key-value pairs (info.)\nValue and info are mutually exclusive.",
+    "SearchAnnotationsResponse": {
+      "properties": {
+        "nextPageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
+          "type": "string"
+        },
+        "annotations": {
+          "description": "The matching annotations.",
+          "type": "array",
+          "items": {
+            "$ref": "Annotation"
+          }
+        }
+      },
+      "id": "SearchAnnotationsResponse",
+      "type": "object"
+    },
+    "SearchReadsResponse": {
+      "properties": {
+        "nextPageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
+          "type": "string"
+        },
+        "alignments": {
+          "description": "The list of matching alignments sorted by mapped genomic coordinate,\nif any, ascending in position within the same reference. Unmapped reads,\nwhich have no position, are returned contiguously and are sorted in\nascending lexicographic order by fragment name.",
+          "type": "array",
+          "items": {
+            "$ref": "Read"
+          }
+        }
+      },
+      "id": "SearchReadsResponse",
+      "description": "The read search response.",
+      "type": "object"
+    },
+    "ClinicalCondition": {
+      "properties": {
+        "conceptId": {
+          "description": "The MedGen concept id associated with this gene.\nSearch for these IDs at http://www.ncbi.nlm.nih.gov/medgen/",
+          "type": "string"
+        },
+        "names": {
+          "description": "A set of names for the condition.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "omimId": {
+          "description": "The OMIM id for this condition.\nSearch for these IDs at http://omim.org/",
+          "type": "string"
+        },
+        "externalIds": {
+          "description": "The set of external IDs for this condition.",
+          "type": "array",
+          "items": {
+            "$ref": "ExternalId"
+          }
+        }
+      },
+      "id": "ClinicalCondition",
+      "type": "object"
+    },
+    "Program": {
       "type": "object",
       "properties": {
+        "commandLine": {
+          "description": "The command line used to run this program.",
+          "type": "string"
+        },
+        "prevProgramId": {
+          "description": "The ID of the program run before this one.",
+          "type": "string"
+        },
         "id": {
-          "description": "User-provided ID field, not enforced by this API.\nTwo or more pieces of structured metadata with identical\nid and key fields are considered equivalent.",
+          "description": "The user specified locally unique ID of the program. Used along with\n`prevProgramId` to define an ordering between programs.",
+          "type": "string"
+        },
+        "version": {
+          "description": "The version of the program run.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The display name of the program. This is typically the colloquial name of\nthe tool used, for example 'bwa' or 'picard'.",
+          "type": "string"
+        }
+      },
+      "id": "Program"
+    },
+    "ComputeEngine": {
+      "properties": {
+        "machineType": {
+          "description": "The machine type of the instance.",
+          "type": "string"
+        },
+        "diskNames": {
+          "description": "The names of the disks that were created for this pipeline.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "instanceName": {
+          "description": "The instance on which the operation is running.",
+          "type": "string"
+        },
+        "zone": {
+          "description": "The availability zone in which the instance resides.",
+          "type": "string"
+        }
+      },
+      "id": "ComputeEngine",
+      "description": "Describes a Compute Engine resource that is being managed by a running\npipeline.",
+      "type": "object"
+    },
+    "CoverageBucket": {
+      "properties": {
+        "meanCoverage": {
+          "description": "The average number of reads which are aligned to each individual\nreference base in this bucket.",
+          "format": "float",
+          "type": "number"
+        },
+        "range": {
+          "$ref": "Range",
+          "description": "The genomic coordinate range spanned by this bucket."
+        }
+      },
+      "id": "CoverageBucket",
+      "description": "A bucket over which read coverage has been precomputed. A bucket corresponds\nto a specific range of the reference sequence.",
+      "type": "object"
+    },
+    "ExternalId": {
+      "properties": {
+        "sourceName": {
+          "description": "The name of the source of this data.",
+          "type": "string"
+        },
+        "id": {
+          "description": "The id used by the source of this data.",
+          "type": "string"
+        }
+      },
+      "id": "ExternalId",
+      "type": "object"
+    },
+    "SearchVariantSetsRequest": {
+      "properties": {
+        "pageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
+          "type": "string"
+        },
+        "pageSize": {
+          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 1024.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "datasetIds": {
+          "description": "Exactly one dataset ID must be provided here. Only variant sets which\nbelong to this dataset will be returned.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "SearchVariantSetsRequest",
+      "description": "The search variant sets request.",
+      "type": "object"
+    },
+    "VariantSetMetadata": {
+      "properties": {
+        "key": {
+          "description": "The top-level key.",
           "type": "string"
         },
         "description": {
           "description": "A textual description of this metadata.",
           "type": "string"
         },
-        "info": {
-          "description": "Remaining structured metadata key-value pairs. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
-          "additionalProperties": {
-            "type": "array",
-            "items": {
-              "type": "any"
-            }
-          },
-          "type": "object"
-        },
-        "key": {
-          "description": "The top-level key.",
-          "type": "string"
-        },
-        "value": {
-          "description": "The value field for simple metadata",
-          "type": "string"
-        },
-        "number": {
-          "description": "The number of values that can be included in a field described by this\nmetadata.",
-          "type": "string"
-        },
         "type": {
-          "description": "The type of data. Possible types include: Integer, Float,\nFlag, Character, and String.",
           "enum": [
             "TYPE_UNSPECIFIED",
             "INTEGER",
@@ -1857,6 +2033,8 @@
             "CHARACTER",
             "STRING"
           ],
+          "description": "The type of data. Possible types include: Integer, Float,\nFlag, Character, and String.",
+          "type": "string",
           "enumDescriptions": [
             "",
             "",
@@ -1864,394 +2042,79 @@
             "",
             "",
             ""
-          ],
+          ]
+        },
+        "info": {
+          "additionalProperties": {
+            "type": "array",
+            "items": {
+              "type": "any"
+            }
+          },
+          "description": "Remaining structured metadata key-value pairs. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
+          "type": "object"
+        },
+        "number": {
+          "description": "The number of values that can be included in a field described by this\nmetadata.",
           "type": "string"
-        }
-      },
-      "id": "VariantSetMetadata"
-    },
-    "Policy": {
-      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
-      "type": "object",
-      "properties": {
-        "bindings": {
-          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
-          "type": "array",
-          "items": {
-            "$ref": "Binding"
-          }
         },
-        "etag": {
-          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
-          "type": "string",
-          "format": "byte"
-        },
-        "version": {
-          "description": "Version of the `Policy`. The default version is 0.",
-          "type": "integer",
-          "format": "int32"
-        }
-      },
-      "id": "Policy"
-    },
-    "Read": {
-      "description": "A read alignment describes a linear alignment of a string of DNA to a\nreference sequence, in addition to metadata\nabout the fragment (the molecule of DNA sequenced) and the read (the bases\nwhich were read by the sequencer). A read is equivalent to a line in a SAM\nfile. A read belongs to exactly one read group and exactly one\nread group set.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\n### Reverse-stranded reads\n\nMapped reads (reads having a non-null `alignment`) can be aligned to either\nthe forward or the reverse strand of their associated reference. Strandedness\nof a mapped read is encoded by `alignment.position.reverseStrand`.\n\nIf we consider the reference to be a forward-stranded coordinate space of\n`[0, reference.length)` with `0` as the left-most position and\n`reference.length` as the right-most position, reads are always aligned left\nto right. That is, `alignment.position.position` always refers to the\nleft-most reference coordinate and `alignment.cigar` describes the alignment\nof this read to the reference from left to right. All per-base fields such as\n`alignedSequence` and `alignedQuality` share this same left-to-right\norientation; this is true of reads which are aligned to either strand. For\nreverse-stranded reads, this means that `alignedSequence` is the reverse\ncomplement of the bases that were originally reported by the sequencing\nmachine.\n\n### Generating a reference-aligned sequence string\n\nWhen interacting with mapped reads, it's often useful to produce a string\nrepresenting the local alignment of the read to reference. The following\npseudocode demonstrates one way of doing this:\n\n    out = \"\"\n    offset = 0\n    for c in read.alignment.cigar {\n      switch c.operation {\n      case \"ALIGNMENT_MATCH\", \"SEQUENCE_MATCH\", \"SEQUENCE_MISMATCH\":\n        out += read.alignedSequence[offset:offset+c.operationLength]\n        offset += c.operationLength\n        break\n      case \"CLIP_SOFT\", \"INSERT\":\n        offset += c.operationLength\n        break\n      case \"PAD\":\n        out += repeat(\"*\", c.operationLength)\n        break\n      case \"DELETE\":\n        out += repeat(\"-\", c.operationLength)\n        break\n      case \"SKIP\":\n        out += repeat(\" \", c.operationLength)\n        break\n      case \"CLIP_HARD\":\n        break\n      }\n    }\n    return out\n\n### Converting to SAM's CIGAR string\n\nThe following pseudocode generates a SAM CIGAR string from the\n`cigar` field. Note that this is a lossy conversion\n(`cigar.referenceSequence` is lost).\n\n    cigarMap = {\n      \"ALIGNMENT_MATCH\": \"M\",\n      \"INSERT\": \"I\",\n      \"DELETE\": \"D\",\n      \"SKIP\": \"N\",\n      \"CLIP_SOFT\": \"S\",\n      \"CLIP_HARD\": \"H\",\n      \"PAD\": \"P\",\n      \"SEQUENCE_MATCH\": \"=\",\n      \"SEQUENCE_MISMATCH\": \"X\",\n    }\n    cigarStr = \"\"\n    for c in read.alignment.cigar {\n      cigarStr += c.operationLength + cigarMap[c.operation]\n    }\n    return cigarStr",
-      "type": "object",
-      "properties": {
         "id": {
-          "description": "The server-generated read ID, unique across all reads. This is different\nfrom the `fragmentName`.",
+          "description": "User-provided ID field, not enforced by this API.\nTwo or more pieces of structured metadata with identical\nid and key fields are considered equivalent.",
           "type": "string"
         },
-        "alignment": {
-          "description": "The linear alignment for this alignment record. This field is null for\nunmapped reads.",
-          "$ref": "LinearAlignment"
-        },
-        "failedVendorQualityChecks": {
-          "description": "Whether this read did not pass filters, such as platform or vendor quality\ncontrols (SAM flag 0x200).",
-          "type": "boolean"
-        },
-        "supplementaryAlignment": {
-          "description": "Whether this alignment is supplementary. Equivalent to SAM flag 0x800.\nSupplementary alignments are used in the representation of a chimeric\nalignment. In a chimeric alignment, a read is split into multiple\nlinear alignments that map to different reference contigs. The first\nlinear alignment in the read will be designated as the representative\nalignment; the remaining linear alignments will be designated as\nsupplementary alignments. These alignments may have different mapping\nquality scores. In each linear alignment in a chimeric alignment, the read\nwill be hard clipped. The `alignedSequence` and\n`alignedQuality` fields in the alignment record will only\nrepresent the bases for its respective linear alignment.",
-          "type": "boolean"
-        },
-        "numberReads": {
-          "description": "The number of reads in the fragment (extension to SAM flag 0x1).",
-          "type": "integer",
-          "format": "int32"
-        },
-        "info": {
-          "description": "A map of additional read alignment information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
-          "additionalProperties": {
-            "type": "array",
-            "items": {
-              "type": "any"
-            }
-          },
-          "type": "object"
-        },
-        "properPlacement": {
-          "description": "The orientation and the distance between reads from the fragment are\nconsistent with the sequencing protocol (SAM flag 0x2).",
-          "type": "boolean"
-        },
-        "readGroupId": {
-          "description": "The ID of the read group this read belongs to. A read belongs to exactly\none read group. This is a server-generated ID which is distinct from SAM's\nRG tag (for that value, see\nReadGroup.name).",
-          "type": "string"
-        },
-        "fragmentName": {
-          "description": "The fragment name. Equivalent to QNAME (query template name) in SAM.",
-          "type": "string"
-        },
-        "nextMatePosition": {
-          "description": "The mapping of the primary alignment of the\n`(readNumber+1)%numberReads` read in the fragment. It replaces\nmate position and mate strand in SAM.",
-          "$ref": "Position"
-        },
-        "secondaryAlignment": {
-          "description": "Whether this alignment is secondary. Equivalent to SAM flag 0x100.\nA secondary alignment represents an alternative to the primary alignment\nfor this read. Aligners may return secondary alignments if a read can map\nambiguously to multiple coordinates in the genome. By convention, each read\nhas one and only one alignment where both `secondaryAlignment`\nand `supplementaryAlignment` are false.",
-          "type": "boolean"
-        },
-        "alignedQuality": {
-          "description": "The quality of the read sequence contained in this alignment record\n(equivalent to QUAL in SAM).\n`alignedSequence` and `alignedQuality` may be shorter than the full read\nsequence and quality. This will occur if the alignment is part of a\nchimeric alignment, or if the read was trimmed. When this occurs, the CIGAR\nfor this read will begin/end with a hard clip operator that will indicate\nthe length of the excised sequence.",
-          "type": "array",
-          "items": {
-            "type": "integer",
-            "format": "int32"
-          }
-        },
-        "readGroupSetId": {
-          "description": "The ID of the read group set this read belongs to. A read belongs to\nexactly one read group set.",
-          "type": "string"
-        },
-        "fragmentLength": {
-          "description": "The observed length of the fragment, equivalent to TLEN in SAM.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "duplicateFragment": {
-          "description": "The fragment is a PCR or optical duplicate (SAM flag 0x400).",
-          "type": "boolean"
-        },
-        "readNumber": {
-          "description": "The read number in sequencing. 0-based and less than numberReads. This\nfield replaces SAM flag 0x40 and 0x80.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "alignedSequence": {
-          "description": "The bases of the read sequence contained in this alignment record,\n**without CIGAR operations applied** (equivalent to SEQ in SAM).\n`alignedSequence` and `alignedQuality` may be\nshorter than the full read sequence and quality. This will occur if the\nalignment is part of a chimeric alignment, or if the read was trimmed. When\nthis occurs, the CIGAR for this read will begin/end with a hard clip\noperator that will indicate the length of the excised sequence.",
+        "value": {
+          "description": "The value field for simple metadata",
           "type": "string"
         }
       },
-      "id": "Read"
+      "id": "VariantSetMetadata",
+      "description": "Metadata describes a single piece of variant call metadata.\nThese data include a top level key and either a single value string (value)\nor a list of key-value pairs (info.)\nValue and info are mutually exclusive.",
+      "type": "object"
     },
-    "SearchReadsRequest": {
-      "description": "The read search request.",
-      "type": "object",
+    "Reference": {
       "properties": {
-        "referenceName": {
-          "description": "The reference sequence name, for example `chr1`, `1`, or `chrX`. If set to\n`*`, only unmapped reads are returned. If unspecified, all reads (mapped\nand unmapped) are returned.",
+        "name": {
+          "description": "The name of this reference, for example `22`.",
           "type": "string"
         },
-        "pageSize": {
-          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 256. The maximum value is 2048.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "readGroupSetIds": {
-          "description": "The IDs of the read groups sets within which to search for reads. All\nspecified read group sets must be aligned against a common set of reference\nsequences; this defines the genomic coordinates for the query. Must specify\none of `readGroupSetIds` or `readGroupIds`.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "start": {
-          "description": "The start position of the range on the reference, 0-based inclusive. If\nspecified, `referenceName` must also be specified.",
-          "type": "string",
-          "format": "int64"
-        },
-        "readGroupIds": {
-          "description": "The IDs of the read groups within which to search for reads. All specified\nread groups must belong to the same read group sets. Must specify one of\n`readGroupSetIds` or `readGroupIds`.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "pageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
+        "md5checksum": {
+          "description": "MD5 of the upper-case sequence excluding all whitespace characters (this\nis equivalent to SQ:M5 in SAM). This value is represented in lower case\nhexadecimal format.",
           "type": "string"
         },
-        "end": {
-          "description": "The end position of the range on the reference, 0-based exclusive. If\nspecified, `referenceName` must also be specified.",
-          "type": "string",
-          "format": "int64"
-        }
-      },
-      "id": "SearchReadsRequest"
-    },
-    "UndeleteDatasetRequest": {
-      "type": "object",
-      "properties": {},
-      "id": "UndeleteDatasetRequest"
-    },
-    "Exon": {
-      "type": "object",
-      "properties": {
-        "end": {
-          "description": "The end position of the exon on this annotation's reference sequence,\n0-based exclusive. Note that this is relative to the reference start, and\n*not* the containing annotation start.",
-          "type": "string",
-          "format": "int64"
-        },
-        "start": {
-          "description": "The start position of the exon on this annotation's reference sequence,\n0-based inclusive. Note that this is relative to the reference start, and\n**not** the containing annotation start.",
-          "type": "string",
-          "format": "int64"
-        },
-        "frame": {
-          "description": "The frame of this exon. Contains a value of 0, 1, or 2, which indicates\nthe offset of the first coding base of the exon within the reading frame\nof the coding DNA sequence, if any. This field is dependent on the\nstrandedness of this annotation (see\nAnnotation.reverse_strand).\nFor forward stranded annotations, this offset is relative to the\nexon.start. For reverse\nstrand annotations, this offset is relative to the\nexon.end `- 1`.\n\nUnset if this exon does not intersect the coding sequence. Upon creation\nof a transcript, the frame must be populated for all or none of the\ncoding exons.",
-          "type": "integer",
-          "format": "int32"
-        }
-      },
-      "id": "Exon"
-    },
-    "GetIamPolicyRequest": {
-      "description": "Request message for `GetIamPolicy` method.",
-      "type": "object",
-      "properties": {},
-      "id": "GetIamPolicyRequest"
-    },
-    "ReferenceBound": {
-      "description": "ReferenceBound records an upper bound for the starting coordinate of\nvariants in a particular reference.",
-      "type": "object",
-      "properties": {
-        "referenceName": {
-          "description": "The name of the reference associated with this reference bound.",
-          "type": "string"
-        },
-        "upperBound": {
-          "description": "An upper bound (inclusive) on the starting coordinate of any\nvariant in the reference sequence.",
-          "type": "string",
-          "format": "int64"
-        }
-      },
-      "id": "ReferenceBound"
-    },
-    "LinearAlignment": {
-      "description": "A linear alignment can be represented by one CIGAR string. Describes the\nmapped position and local alignment of the read to the reference.",
-      "type": "object",
-      "properties": {
-        "position": {
-          "description": "The position of this alignment.",
-          "$ref": "Position"
-        },
-        "mappingQuality": {
-          "description": "The mapping quality of this alignment. Represents how likely\nthe read maps to this position as opposed to other locations.\n\nSpecifically, this is -10 log10 Pr(mapping position is wrong), rounded to\nthe nearest integer.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "cigar": {
-          "description": "Represents the local alignment of this sequence (alignment matches, indels,\netc) against the reference.",
-          "type": "array",
-          "items": {
-            "$ref": "CigarUnit"
-          }
-        }
-      },
-      "id": "LinearAlignment"
-    },
-    "Annotation": {
-      "description": "An annotation describes a region of reference genome. The value of an\nannotation may be one of several canonical types, supplemented by arbitrary\ninfo tags. An annotation is not inherently associated with a specific\nsample or individual (though a client could choose to use annotations in\nthis way). Example canonical annotation types are `GENE` and\n`VARIANT`.",
-      "type": "object",
-      "properties": {
         "id": {
-          "description": "The server-generated annotation ID, unique across all annotations.",
+          "description": "The server-generated reference ID, unique across all references.",
           "type": "string"
         },
-        "referenceName": {
-          "description": "The display name corresponding to the reference specified by\n`referenceId`, for example `chr1`, `1`, or `chrX`.",
+        "length": {
+          "description": "The length of this reference's sequence.",
+          "format": "int64",
           "type": "string"
         },
-        "info": {
-          "description": "A map of additional read alignment information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
-          "additionalProperties": {
-            "type": "array",
-            "items": {
-              "type": "any"
-            }
-          },
-          "type": "object"
-        },
-        "referenceId": {
-          "description": "The ID of the Google Genomics reference associated with this range.",
-          "type": "string"
-        },
-        "variant": {
-          "description": "A variant annotation, which describes the effect of a variant on the\ngenome, the coding sequence, and/or higher level consequences at the\norganism level e.g. pathogenicity. This field is only set for annotations\nof type `VARIANT`.",
-          "$ref": "VariantAnnotation"
-        },
-        "annotationSetId": {
-          "description": "The annotation set to which this annotation belongs.",
-          "type": "string"
-        },
-        "name": {
-          "description": "The display name of this annotation.",
-          "type": "string"
-        },
-        "transcript": {
-          "description": "A transcript value represents the assertion that a particular region of\nthe reference genome may be transcribed as RNA. An alternative splicing\npattern would be represented as a separate transcript object. This field\nis only set for annotations of type `TRANSCRIPT`.",
-          "$ref": "Transcript"
-        },
-        "start": {
-          "description": "The start position of the range on the reference, 0-based inclusive.",
-          "type": "string",
-          "format": "int64"
-        },
-        "reverseStrand": {
-          "description": "Whether this range refers to the reverse strand, as opposed to the forward\nstrand. Note that regardless of this field, the start/end position of the\nrange always refer to the forward strand.",
-          "type": "boolean"
-        },
-        "end": {
-          "description": "The end position of the range on the reference, 0-based exclusive.",
-          "type": "string",
-          "format": "int64"
-        },
-        "type": {
-          "description": "The data type for this annotation. Must match the containing annotation\nset's type.",
-          "enum": [
-            "ANNOTATION_TYPE_UNSPECIFIED",
-            "GENERIC",
-            "VARIANT",
-            "GENE",
-            "TRANSCRIPT"
-          ],
-          "enumDescriptions": [
-            "",
-            "A `GENERIC` annotation type should be used when no other annotation\ntype will suffice. This represents an untyped annotation of the reference\ngenome.",
-            "A `VARIANT` annotation type.",
-            "A `GENE` annotation type represents the existence of a gene at the\nassociated reference coordinates. The start coordinate is typically the\ngene's transcription start site and the end is typically the end of the\ngene's last exon.",
-            "A `TRANSCRIPT` annotation type represents the assertion that a\nparticular region of the reference genome may be transcribed as RNA."
-          ],
-          "type": "string"
-        }
-      },
-      "id": "Annotation"
-    },
-    "Experiment": {
-      "type": "object",
-      "properties": {
-        "instrumentModel": {
-          "description": "The instrument model used as part of this experiment. This maps to\nsequencing technology in the SAM spec.",
-          "type": "string"
-        },
-        "sequencingCenter": {
-          "description": "The sequencing center used as part of this experiment.",
-          "type": "string"
-        },
-        "libraryId": {
-          "description": "A client-supplied library identifier; a library is a collection of DNA\nfragments which have been prepared for sequencing from a sample. This\nfield is important for quality control as error or bias can be introduced\nduring sample preparation.",
-          "type": "string"
-        },
-        "platformUnit": {
-          "description": "The platform unit used as part of this experiment, for example\nflowcell-barcode.lane for Illumina or slide for SOLiD. Corresponds to the\n@RG PU field in the SAM spec.",
-          "type": "string"
-        }
-      },
-      "id": "Experiment"
-    },
-    "VariantCall": {
-      "description": "A call represents the determination of genotype with respect to a particular\nvariant. It may include associated information such as quality and phasing.\nFor example, a call might assign a probability of 0.32 to the occurrence of\na SNP named rs1234 in a call set with the name NA12345.",
-      "type": "object",
-      "properties": {
-        "callSetName": {
-          "description": "The name of the call set this variant call belongs to.",
-          "type": "string"
-        },
-        "info": {
-          "description": "A map of additional variant call information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
-          "additionalProperties": {
-            "type": "array",
-            "items": {
-              "type": "any"
-            }
-          },
-          "type": "object"
-        },
-        "callSetId": {
-          "description": "The ID of the call set this variant call belongs to.",
-          "type": "string"
-        },
-        "phaseset": {
-          "description": "If this field is present, this variant call's genotype ordering implies\nthe phase of the bases and is consistent with any other variant calls in\nthe same reference sequence which have the same phaseset value.\nWhen importing data from VCF, if the genotype data was phased but no\nphase set was specified this field will be set to `*`.",
-          "type": "string"
-        },
-        "genotype": {
-          "description": "The genotype of this variant call. Each value represents either the value\nof the `referenceBases` field or a 1-based index into\n`alternateBases`. If a variant had a `referenceBases`\nvalue of `T` and an `alternateBases`\nvalue of `[\"A\", \"C\"]`, and the `genotype` was\n`[2, 1]`, that would mean the call\nrepresented the heterozygous value `CA` for this variant.\nIf the `genotype` was instead `[0, 1]`, the\nrepresented value would be `TA`. Ordering of the\ngenotype values is important if the `phaseset` is present.\nIf a genotype is not called (that is, a `.` is present in the\nGT string) -1 is returned.",
+        "sourceAccessions": {
+          "description": "All known corresponding accession IDs in INSDC (GenBank/ENA/DDBJ) ideally\nwith a version number, for example `GCF_000001405.26`.",
           "type": "array",
           "items": {
-            "type": "integer",
-            "format": "int32"
+            "type": "string"
           }
         },
-        "genotypeLikelihood": {
-          "description": "The genotype likelihoods for this variant call. Each array entry\nrepresents how likely a specific genotype is for this call. The value\nordering is defined by the GL tag in the VCF spec.\nIf Phred-scaled genotype likelihood scores (PL) are available and\nlog10(P) genotype likelihood scores (GL) are not, PL scores are converted\nto GL scores.  If both are available, PL scores are stored in `info`.",
-          "type": "array",
-          "items": {
-            "type": "number",
-            "format": "double"
-          }
+        "ncbiTaxonId": {
+          "description": "ID from http://www.ncbi.nlm.nih.gov/taxonomy. For example, 9606 for human.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "sourceUri": {
+          "description": "The URI from which the sequence was obtained. Typically specifies a FASTA\nformat file.",
+          "type": "string"
         }
       },
-      "id": "VariantCall"
+      "id": "Reference",
+      "description": "A reference is a canonical assembled DNA sequence, intended to act as a\nreference coordinate space for other genomic annotations. A single reference\nmight represent the human chromosome 1 or mitochandrial DNA, for instance. A\nreference belongs to one or more reference sets.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+      "type": "object"
     },
-    "SearchVariantSetsRequest": {
-      "description": "The search variant sets request.",
-      "type": "object",
+    "SearchReferenceSetsRequest": {
       "properties": {
-        "pageSize": {
-          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 1024.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "datasetIds": {
-          "description": "Exactly one dataset ID must be provided here. Only variant sets which\nbelong to this dataset will be returned.",
+        "accessions": {
+          "description": "If present, return reference sets for which a prefix of any of\nsourceAccessions\nmatch any of these strings. Accession numbers typically have a main number\nand a version, for example `NC_000001.11`.",
           "type": "array",
           "items": {
             "type": "string"
@@ -2260,277 +2123,66 @@
         "pageToken": {
           "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
           "type": "string"
-        }
-      },
-      "id": "SearchVariantSetsRequest"
-    },
-    "Operation": {
-      "description": "This resource represents a long-running operation that is the result of a\nnetwork API call.",
-      "type": "object",
-      "properties": {
-        "error": {
-          "description": "The error result of the operation in case of failure or cancellation.",
-          "$ref": "Status"
-        },
-        "done": {
-          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
-          "type": "boolean"
-        },
-        "metadata": {
-          "description": "An OperationMetadata object. This will always be returned with the Operation.",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        },
-        "response": {
-          "description": "If importing ReadGroupSets, an ImportReadGroupSetsResponse is returned. If importing Variants, an ImportVariantsResponse is returned. For pipelines and exports, an empty response is returned.",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        },
-        "name": {
-          "description": "The server-assigned name, which is only unique within the same service that originally returns it. For example&#58; `operations/CJHU7Oi_ChDrveSpBRjfuL-qzoWAgEw`",
-          "type": "string"
-        }
-      },
-      "id": "Operation"
-    },
-    "SearchAnnotationsRequest": {
-      "type": "object",
-      "properties": {
-        "referenceName": {
-          "description": "The name of the reference to query, within the reference set associated\nwith this query.",
-          "type": "string"
-        },
-        "referenceId": {
-          "description": "The ID of the reference to query.",
-          "type": "string"
         },
         "pageSize": {
-          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 256. The maximum value is 2048.",
-          "type": "integer",
-          "format": "int32"
+          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 1024. The maximum value is 4096.",
+          "format": "int32",
+          "type": "integer"
         },
-        "annotationSetIds": {
-          "description": "Required. The annotation sets to search within. The caller must have\n`READ` access to these annotation sets.\nAll queried annotation sets must have the same type.",
+        "assemblyId": {
+          "description": "If present, return reference sets for which a substring of their\n`assemblyId` matches this string (case insensitive).",
+          "type": "string"
+        },
+        "md5checksums": {
+          "description": "If present, return reference sets for which the\nmd5checksum matches exactly.",
           "type": "array",
           "items": {
             "type": "string"
           }
-        },
-        "start": {
-          "description": "The start position of the range on the reference, 0-based inclusive. If\nspecified,\nreferenceId or\nreferenceName\nmust be specified. Defaults to 0.",
-          "type": "string",
-          "format": "int64"
-        },
-        "pageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
-          "type": "string"
-        },
-        "end": {
-          "description": "The end position of the range on the reference, 0-based exclusive. If\nreferenceId or\nreferenceName\nmust be specified, Defaults to the length of the reference.",
-          "type": "string",
-          "format": "int64"
         }
       },
-      "id": "SearchAnnotationsRequest"
+      "id": "SearchReferenceSetsRequest",
+      "type": "object"
     },
     "SetIamPolicyRequest": {
-      "description": "Request message for `SetIamPolicy` method.",
-      "type": "object",
       "properties": {
         "policy": {
-          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them.",
-          "$ref": "Policy"
+          "$ref": "Policy",
+          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them."
         }
       },
-      "id": "SetIamPolicyRequest"
+      "id": "SetIamPolicyRequest",
+      "description": "Request message for `SetIamPolicy` method.",
+      "type": "object"
     },
-    "ExportReadGroupSetRequest": {
-      "description": "The read group set export request.",
-      "type": "object",
+    "MergeVariantsRequest": {
       "properties": {
-        "referenceNames": {
-          "description": "The reference names to export. If this is not specified, all reference\nsequences, including unmapped reads, are exported.\nUse `*` to export only unmapped reads.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "projectId": {
-          "description": "Required. The Google Cloud project ID that owns this\nexport. The caller must have WRITE access to this project.",
-          "type": "string"
-        },
-        "exportUri": {
-          "description": "Required. A Google Cloud Storage URI for the exported BAM file.\nThe currently authenticated user must have write access to the new file.\nAn error will be returned if the URI already contains data.",
-          "type": "string"
-        }
-      },
-      "id": "ExportReadGroupSetRequest"
-    },
-    "SearchVariantsResponse": {
-      "description": "The variant search response.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
-          "type": "string"
-        },
         "variants": {
-          "description": "The list of matching Variants.",
+          "description": "The variants to be merged with existing variants.",
           "type": "array",
           "items": {
             "$ref": "Variant"
           }
-        }
-      },
-      "id": "SearchVariantsResponse"
-    },
-    "ReadGroup": {
-      "description": "A read group is all the data that's processed the same way by the sequencer.",
-      "type": "object",
-      "properties": {
-        "id": {
-          "description": "The server-generated read group ID, unique for all read groups.\nNote: This is different than the @RG ID field in the SAM spec. For that\nvalue, see name.",
-          "type": "string"
         },
-        "description": {
-          "description": "A free-form text description of this read group.",
-          "type": "string"
-        },
-        "sampleId": {
-          "description": "A client-supplied sample identifier for the reads in this read group.",
-          "type": "string"
-        },
-        "experiment": {
-          "description": "The experiment used to generate this read group.",
-          "$ref": "Experiment"
-        },
-        "predictedInsertSize": {
-          "description": "The predicted insert size of this read group. The insert size is the length\nthe sequenced DNA fragment from end-to-end, not including the adapters.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "info": {
-          "description": "A map of additional read group information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
+        "infoMergeConfig": {
           "additionalProperties": {
-            "type": "array",
-            "items": {
-              "type": "any"
-            }
+            "enum": [
+              "INFO_MERGE_OPERATION_UNSPECIFIED",
+              "IGNORE_NEW",
+              "MOVE_TO_CALLS"
+            ],
+            "type": "string"
           },
+          "description": "A mapping between info field keys and the InfoMergeOperations to\nbe performed on them.",
           "type": "object"
         },
-        "datasetId": {
-          "description": "The dataset to which this read group belongs.",
-          "type": "string"
-        },
-        "name": {
-          "description": "The read group name. This corresponds to the @RG ID field in the SAM spec.",
-          "type": "string"
-        },
-        "referenceSetId": {
-          "description": "The reference set the reads in this read group are aligned to.",
-          "type": "string"
-        },
-        "programs": {
-          "description": "The programs used to generate this read group. Programs are always\nidentical for all read groups within a read group set. For this reason,\nonly the first read group in a returned set will have this field\npopulated.",
-          "type": "array",
-          "items": {
-            "$ref": "Program"
-          }
-        }
-      },
-      "id": "ReadGroup"
-    },
-    "BatchCreateAnnotationsResponse": {
-      "type": "object",
-      "properties": {
-        "entries": {
-          "description": "The resulting per-annotation entries, ordered consistently with the\noriginal request.",
-          "type": "array",
-          "items": {
-            "$ref": "Entry"
-          }
-        }
-      },
-      "id": "BatchCreateAnnotationsResponse"
-    },
-    "SearchVariantSetsResponse": {
-      "description": "The search variant sets response.",
-      "type": "object",
-      "properties": {
-        "variantSets": {
-          "description": "The variant sets belonging to the requested dataset.",
-          "type": "array",
-          "items": {
-            "$ref": "VariantSet"
-          }
-        },
-        "nextPageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
+        "variantSetId": {
+          "description": "The destination variant set.",
           "type": "string"
         }
       },
-      "id": "SearchVariantSetsResponse"
-    },
-    "Status": {
-      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
-      "type": "object",
-      "properties": {
-        "code": {
-          "description": "The status code, which should be an enum value of google.rpc.Code.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "details": {
-          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
-          "type": "array",
-          "items": {
-            "additionalProperties": {
-              "description": "Properties of the object. Contains field @type with type URL.",
-              "type": "any"
-            },
-            "type": "object"
-          }
-        },
-        "message": {
-          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
-          "type": "string"
-        }
-      },
-      "id": "Status"
-    },
-    "SearchCallSetsRequest": {
-      "description": "The call set search request.",
-      "type": "object",
-      "properties": {
-        "variantSetIds": {
-          "description": "Restrict the query to call sets within the given variant sets. At least one\nID must be provided.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "pageSize": {
-          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 1024.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "name": {
-          "description": "Only return call sets for which a substring of the name matches this\nstring.",
-          "type": "string"
-        },
-        "pageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
-          "type": "string"
-        }
-      },
-      "id": "SearchCallSetsRequest"
+      "id": "MergeVariantsRequest",
+      "type": "object"
     },
     "BatchCreateAnnotationsRequest": {
       "type": "object",
@@ -2549,109 +2201,300 @@
       },
       "id": "BatchCreateAnnotationsRequest"
     },
-    "ListCoverageBucketsResponse": {
+    "Read": {
+      "description": "A read alignment describes a linear alignment of a string of DNA to a\nreference sequence, in addition to metadata\nabout the fragment (the molecule of DNA sequenced) and the read (the bases\nwhich were read by the sequencer). A read is equivalent to a line in a SAM\nfile. A read belongs to exactly one read group and exactly one\nread group set.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\n### Reverse-stranded reads\n\nMapped reads (reads having a non-null `alignment`) can be aligned to either\nthe forward or the reverse strand of their associated reference. Strandedness\nof a mapped read is encoded by `alignment.position.reverseStrand`.\n\nIf we consider the reference to be a forward-stranded coordinate space of\n`[0, reference.length)` with `0` as the left-most position and\n`reference.length` as the right-most position, reads are always aligned left\nto right. That is, `alignment.position.position` always refers to the\nleft-most reference coordinate and `alignment.cigar` describes the alignment\nof this read to the reference from left to right. All per-base fields such as\n`alignedSequence` and `alignedQuality` share this same left-to-right\norientation; this is true of reads which are aligned to either strand. For\nreverse-stranded reads, this means that `alignedSequence` is the reverse\ncomplement of the bases that were originally reported by the sequencing\nmachine.\n\n### Generating a reference-aligned sequence string\n\nWhen interacting with mapped reads, it's often useful to produce a string\nrepresenting the local alignment of the read to reference. The following\npseudocode demonstrates one way of doing this:\n\n    out = \"\"\n    offset = 0\n    for c in read.alignment.cigar {\n      switch c.operation {\n      case \"ALIGNMENT_MATCH\", \"SEQUENCE_MATCH\", \"SEQUENCE_MISMATCH\":\n        out += read.alignedSequence[offset:offset+c.operationLength]\n        offset += c.operationLength\n        break\n      case \"CLIP_SOFT\", \"INSERT\":\n        offset += c.operationLength\n        break\n      case \"PAD\":\n        out += repeat(\"*\", c.operationLength)\n        break\n      case \"DELETE\":\n        out += repeat(\"-\", c.operationLength)\n        break\n      case \"SKIP\":\n        out += repeat(\" \", c.operationLength)\n        break\n      case \"CLIP_HARD\":\n        break\n      }\n    }\n    return out\n\n### Converting to SAM's CIGAR string\n\nThe following pseudocode generates a SAM CIGAR string from the\n`cigar` field. Note that this is a lossy conversion\n(`cigar.referenceSequence` is lost).\n\n    cigarMap = {\n      \"ALIGNMENT_MATCH\": \"M\",\n      \"INSERT\": \"I\",\n      \"DELETE\": \"D\",\n      \"SKIP\": \"N\",\n      \"CLIP_SOFT\": \"S\",\n      \"CLIP_HARD\": \"H\",\n      \"PAD\": \"P\",\n      \"SEQUENCE_MATCH\": \"=\",\n      \"SEQUENCE_MISMATCH\": \"X\",\n    }\n    cigarStr = \"\"\n    for c in read.alignment.cigar {\n      cigarStr += c.operationLength + cigarMap[c.operation]\n    }\n    return cigarStr",
       "type": "object",
       "properties": {
-        "coverageBuckets": {
-          "description": "The coverage buckets. The list of buckets is sparse; a bucket with 0\noverlapping reads is not returned. A bucket never crosses more than one\nreference sequence. Each bucket has width `bucketWidth`, unless\nits end is the end of the reference sequence.",
-          "type": "array",
-          "items": {
-            "$ref": "CoverageBucket"
-          }
-        },
-        "nextPageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
+        "readGroupSetId": {
+          "description": "The ID of the read group set this read belongs to. A read belongs to\nexactly one read group set.",
           "type": "string"
         },
-        "bucketWidth": {
-          "description": "The length of each coverage bucket in base pairs. Note that buckets at the\nend of a reference sequence may be shorter. This value is omitted if the\nbucket width is infinity (the default behaviour, with no range or\n`targetBucketWidth`).",
-          "type": "string",
-          "format": "int64"
+        "duplicateFragment": {
+          "description": "The fragment is a PCR or optical duplicate (SAM flag 0x400).",
+          "type": "boolean"
+        },
+        "readNumber": {
+          "description": "The read number in sequencing. 0-based and less than numberReads. This\nfield replaces SAM flag 0x40 and 0x80.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "readGroupId": {
+          "description": "The ID of the read group this read belongs to. A read belongs to exactly\none read group. This is a server-generated ID which is distinct from SAM's\nRG tag (for that value, see\nReadGroup.name).",
+          "type": "string"
+        },
+        "alignedSequence": {
+          "description": "The bases of the read sequence contained in this alignment record,\n**without CIGAR operations applied** (equivalent to SEQ in SAM).\n`alignedSequence` and `alignedQuality` may be\nshorter than the full read sequence and quality. This will occur if the\nalignment is part of a chimeric alignment, or if the read was trimmed. When\nthis occurs, the CIGAR for this read will begin/end with a hard clip\noperator that will indicate the length of the excised sequence.",
+          "type": "string"
+        },
+        "nextMatePosition": {
+          "$ref": "Position",
+          "description": "The mapping of the primary alignment of the\n`(readNumber+1)%numberReads` read in the fragment. It replaces\nmate position and mate strand in SAM."
+        },
+        "info": {
+          "additionalProperties": {
+            "type": "array",
+            "items": {
+              "type": "any"
+            }
+          },
+          "description": "A map of additional read alignment information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
+          "type": "object"
+        },
+        "properPlacement": {
+          "description": "The orientation and the distance between reads from the fragment are\nconsistent with the sequencing protocol (SAM flag 0x2).",
+          "type": "boolean"
+        },
+        "supplementaryAlignment": {
+          "description": "Whether this alignment is supplementary. Equivalent to SAM flag 0x800.\nSupplementary alignments are used in the representation of a chimeric\nalignment. In a chimeric alignment, a read is split into multiple\nlinear alignments that map to different reference contigs. The first\nlinear alignment in the read will be designated as the representative\nalignment; the remaining linear alignments will be designated as\nsupplementary alignments. These alignments may have different mapping\nquality scores. In each linear alignment in a chimeric alignment, the read\nwill be hard clipped. The `alignedSequence` and\n`alignedQuality` fields in the alignment record will only\nrepresent the bases for its respective linear alignment.",
+          "type": "boolean"
+        },
+        "fragmentLength": {
+          "description": "The observed length of the fragment, equivalent to TLEN in SAM.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "failedVendorQualityChecks": {
+          "description": "Whether this read did not pass filters, such as platform or vendor quality\ncontrols (SAM flag 0x200).",
+          "type": "boolean"
+        },
+        "alignedQuality": {
+          "description": "The quality of the read sequence contained in this alignment record\n(equivalent to QUAL in SAM).\n`alignedSequence` and `alignedQuality` may be shorter than the full read\nsequence and quality. This will occur if the alignment is part of a\nchimeric alignment, or if the read was trimmed. When this occurs, the CIGAR\nfor this read will begin/end with a hard clip operator that will indicate\nthe length of the excised sequence.",
+          "type": "array",
+          "items": {
+            "format": "int32",
+            "type": "integer"
+          }
+        },
+        "alignment": {
+          "description": "The linear alignment for this alignment record. This field is null for\nunmapped reads.",
+          "$ref": "LinearAlignment"
+        },
+        "numberReads": {
+          "description": "The number of reads in the fragment (extension to SAM flag 0x1).",
+          "format": "int32",
+          "type": "integer"
+        },
+        "id": {
+          "description": "The server-generated read ID, unique across all reads. This is different\nfrom the `fragmentName`.",
+          "type": "string"
+        },
+        "secondaryAlignment": {
+          "description": "Whether this alignment is secondary. Equivalent to SAM flag 0x100.\nA secondary alignment represents an alternative to the primary alignment\nfor this read. Aligners may return secondary alignments if a read can map\nambiguously to multiple coordinates in the genome. By convention, each read\nhas one and only one alignment where both `secondaryAlignment`\nand `supplementaryAlignment` are false.",
+          "type": "boolean"
+        },
+        "fragmentName": {
+          "description": "The fragment name. Equivalent to QNAME (query template name) in SAM.",
+          "type": "string"
         }
       },
-      "id": "ListCoverageBucketsResponse"
+      "id": "Read"
+    },
+    "ReferenceSet": {
+      "properties": {
+        "id": {
+          "description": "The server-generated reference set ID, unique across all reference sets.",
+          "type": "string"
+        },
+        "description": {
+          "description": "Free text description of this reference set.",
+          "type": "string"
+        },
+        "sourceAccessions": {
+          "description": "All known corresponding accession IDs in INSDC (GenBank/ENA/DDBJ) ideally\nwith a version number, for example `NC_000001.11`.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "ncbiTaxonId": {
+          "description": "ID from http://www.ncbi.nlm.nih.gov/taxonomy (for example, 9606 for human)\nindicating the species which this reference set is intended to model. Note\nthat contained references may specify a different `ncbiTaxonId`, as\nassemblies may contain reference sequences which do not belong to the\nmodeled species, for example EBV in a human reference genome.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "sourceUri": {
+          "description": "The URI from which the references were obtained.",
+          "type": "string"
+        },
+        "referenceIds": {
+          "description": "The IDs of the reference objects that are part of this set.\n`Reference.md5checksum` must be unique within this set.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "assemblyId": {
+          "description": "Public id of this reference set, such as `GRCh37`.",
+          "type": "string"
+        },
+        "md5checksum": {
+          "description": "Order-independent MD5 checksum which identifies this reference set. The\nchecksum is computed by sorting all lower case hexidecimal string\n`reference.md5checksum` (for all reference in this set) in\nascending lexicographic order, concatenating, and taking the MD5 of that\nvalue. The resulting value is represented in lower case hexadecimal format.",
+          "type": "string"
+        }
+      },
+      "id": "ReferenceSet",
+      "description": "A reference set is a set of references which typically comprise a reference\nassembly for a species, such as `GRCh38` which is representative\nof the human genome. A reference set defines a common coordinate space for\ncomparing reference-aligned experimental data. A reference set contains 1 or\nmore references.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+      "type": "object"
+    },
+    "CigarUnit": {
+      "properties": {
+        "operation": {
+          "enum": [
+            "OPERATION_UNSPECIFIED",
+            "ALIGNMENT_MATCH",
+            "INSERT",
+            "DELETE",
+            "SKIP",
+            "CLIP_SOFT",
+            "CLIP_HARD",
+            "PAD",
+            "SEQUENCE_MATCH",
+            "SEQUENCE_MISMATCH"
+          ],
+          "type": "string",
+          "enumDescriptions": [
+            "",
+            "An alignment match indicates that a sequence can be aligned to the\nreference without evidence of an INDEL. Unlike the\n`SEQUENCE_MATCH` and `SEQUENCE_MISMATCH` operators,\nthe `ALIGNMENT_MATCH` operator does not indicate whether the\nreference and read sequences are an exact match. This operator is\nequivalent to SAM's `M`.",
+            "The insert operator indicates that the read contains evidence of bases\nbeing inserted into the reference. This operator is equivalent to SAM's\n`I`.",
+            "The delete operator indicates that the read contains evidence of bases\nbeing deleted from the reference. This operator is equivalent to SAM's\n`D`.",
+            "The skip operator indicates that this read skips a long segment of the\nreference, but the bases have not been deleted. This operator is commonly\nused when working with RNA-seq data, where reads may skip long segments\nof the reference between exons. This operator is equivalent to SAM's\n`N`.",
+            "The soft clip operator indicates that bases at the start/end of a read\nhave not been considered during alignment. This may occur if the majority\nof a read maps, except for low quality bases at the start/end of a read.\nThis operator is equivalent to SAM's `S`. Bases that are soft\nclipped will still be stored in the read.",
+            "The hard clip operator indicates that bases at the start/end of a read\nhave been omitted from this alignment. This may occur if this linear\nalignment is part of a chimeric alignment, or if the read has been\ntrimmed (for example, during error correction or to trim poly-A tails for\nRNA-seq). This operator is equivalent to SAM's `H`.",
+            "The pad operator indicates that there is padding in an alignment. This\noperator is equivalent to SAM's `P`.",
+            "This operator indicates that this portion of the aligned sequence exactly\nmatches the reference. This operator is equivalent to SAM's `=`.",
+            "This operator indicates that this portion of the aligned sequence is an\nalignment match to the reference, but a sequence mismatch. This can\nindicate a SNP or a read error. This operator is equivalent to SAM's\n`X`."
+          ]
+        },
+        "referenceSequence": {
+          "description": "`referenceSequence` is only used at mismatches\n(`SEQUENCE_MISMATCH`) and deletions (`DELETE`).\nFilling this field replaces SAM's MD tag. If the relevant information is\nnot available, this field is unset.",
+          "type": "string"
+        },
+        "operationLength": {
+          "description": "The number of genomic bases that the operation runs for. Required.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "id": "CigarUnit",
+      "description": "A single CIGAR operation.",
+      "type": "object"
+    },
+    "AnnotationSet": {
+      "properties": {
+        "sourceUri": {
+          "description": "The source URI describing the file from which this annotation set was\ngenerated, if any.",
+          "type": "string"
+        },
+        "datasetId": {
+          "description": "The dataset to which this annotation set belongs.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The display name for this annotation set.",
+          "type": "string"
+        },
+        "referenceSetId": {
+          "description": "The ID of the reference set that defines the coordinate space for this\nset's annotations.",
+          "type": "string"
+        },
+        "info": {
+          "additionalProperties": {
+            "type": "array",
+            "items": {
+              "type": "any"
+            }
+          },
+          "description": "A map of additional read alignment information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
+          "type": "object"
+        },
+        "type": {
+          "enum": [
+            "ANNOTATION_TYPE_UNSPECIFIED",
+            "GENERIC",
+            "VARIANT",
+            "GENE",
+            "TRANSCRIPT"
+          ],
+          "description": "The type of annotations contained within this set.",
+          "type": "string",
+          "enumDescriptions": [
+            "",
+            "A `GENERIC` annotation type should be used when no other annotation\ntype will suffice. This represents an untyped annotation of the reference\ngenome.",
+            "A `VARIANT` annotation type.",
+            "A `GENE` annotation type represents the existence of a gene at the\nassociated reference coordinates. The start coordinate is typically the\ngene's transcription start site and the end is typically the end of the\ngene's last exon.",
+            "A `TRANSCRIPT` annotation type represents the assertion that a\nparticular region of the reference genome may be transcribed as RNA."
+          ]
+        },
+        "id": {
+          "description": "The server-generated annotation set ID, unique across all annotation sets.",
+          "type": "string"
+        }
+      },
+      "id": "AnnotationSet",
+      "description": "An annotation set is a logical grouping of annotations that share consistent\ntype information and provenance. Examples of annotation sets include 'all\ngenes from refseq', and 'all variant annotations from ClinVar'.",
+      "type": "object"
+    },
+    "Transcript": {
+      "properties": {
+        "exons": {
+          "description": "The \u003ca href=\"http://en.wikipedia.org/wiki/Exon\"\u003eexons\u003c/a\u003e that compose\nthis transcript. This field should be unset for genomes where transcript\nsplicing does not occur, for example prokaryotes.\n\nIntrons are regions of the transcript that are not included in the\nspliced RNA product. Though not explicitly modeled here, intron ranges can\nbe deduced; all regions of this transcript that are not exons are introns.\n\nExonic sequences do not necessarily code for a translational product\n(amino acids). Only the regions of exons bounded by the\ncodingSequence correspond\nto coding DNA sequence.\n\nExons are ordered by start position and may not overlap.",
+          "type": "array",
+          "items": {
+            "$ref": "Exon"
+          }
+        },
+        "codingSequence": {
+          "description": "The range of the coding sequence for this transcript, if any. To determine\nthe exact ranges of coding sequence, intersect this range with those of the\nexons, if any. If there are any\nexons, the\ncodingSequence must start\nand end within them.\n\nNote that in some cases, the reference genome will not exactly match the\nobserved mRNA transcript e.g. due to variance in the source genome from\nreference. In these cases,\nexon.frame will not necessarily\nmatch the expected reference reading frame and coding exon reference bases\ncannot necessarily be concatenated to produce the original transcript mRNA.",
+          "$ref": "CodingSequence"
+        },
+        "geneId": {
+          "description": "The annotation ID of the gene from which this transcript is transcribed.",
+          "type": "string"
+        }
+      },
+      "id": "Transcript",
+      "description": "A transcript represents the assertion that a particular region of the\nreference genome may be transcribed as RNA.",
+      "type": "object"
+    },
+    "Experiment": {
+      "properties": {
+        "libraryId": {
+          "description": "A client-supplied library identifier; a library is a collection of DNA\nfragments which have been prepared for sequencing from a sample. This\nfield is important for quality control as error or bias can be introduced\nduring sample preparation.",
+          "type": "string"
+        },
+        "instrumentModel": {
+          "description": "The instrument model used as part of this experiment. This maps to\nsequencing technology in the SAM spec.",
+          "type": "string"
+        },
+        "sequencingCenter": {
+          "description": "The sequencing center used as part of this experiment.",
+          "type": "string"
+        },
+        "platformUnit": {
+          "description": "The platform unit used as part of this experiment, for example\nflowcell-barcode.lane for Illumina or slide for SOLiD. Corresponds to the\n@RG PU field in the SAM spec.",
+          "type": "string"
+        }
+      },
+      "id": "Experiment",
+      "type": "object"
     },
     "ListDatasetsResponse": {
       "description": "The dataset list response.",
       "type": "object",
       "properties": {
-        "nextPageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
-          "type": "string"
-        },
         "datasets": {
           "description": "The list of matching Datasets.",
           "type": "array",
           "items": {
             "$ref": "Dataset"
           }
+        },
+        "nextPageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
+          "type": "string"
         }
       },
       "id": "ListDatasetsResponse"
     },
-    "ListBasesResponse": {
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
-          "type": "string"
-        },
-        "offset": {
-          "description": "The offset position (0-based) of the given `sequence` from the\nstart of this `Reference`. This value will differ for each page\nin a paginated request.",
-          "type": "string",
-          "format": "int64"
-        },
-        "sequence": {
-          "description": "A substring of the bases that make up this reference.",
-          "type": "string"
-        }
-      },
-      "id": "ListBasesResponse"
-    },
-    "SearchAnnotationsResponse": {
-      "type": "object",
-      "properties": {
-        "annotations": {
-          "description": "The matching annotations.",
-          "type": "array",
-          "items": {
-            "$ref": "Annotation"
-          }
-        },
-        "nextPageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
-          "type": "string"
-        }
-      },
-      "id": "SearchAnnotationsResponse"
-    },
-    "SearchReadGroupSetsRequest": {
-      "description": "The read group set search request.",
-      "type": "object",
-      "properties": {
-        "pageSize": {
-          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 256. The maximum value is 1024.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "datasetIds": {
-          "description": "Restricts this query to read group sets within the given datasets. At least\none ID must be provided.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "name": {
-          "description": "Only return read group sets for which a substring of the name matches this\nstring.",
-          "type": "string"
-        },
-        "pageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
-          "type": "string"
-        }
-      },
-      "id": "SearchReadGroupSetsRequest"
-    },
     "TestIamPermissionsRequest": {
       "description": "Request message for `TestIamPermissions` method.",
       "type": "object",
@@ -2666,96 +2509,53 @@
       },
       "id": "TestIamPermissionsRequest"
     },
-    "TestIamPermissionsResponse": {
-      "description": "Response message for `TestIamPermissions` method.",
+    "ExportReadGroupSetRequest": {
+      "description": "The read group set export request.",
       "type": "object",
       "properties": {
-        "permissions": {
-          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "TestIamPermissionsResponse"
-    },
-    "MergeVariantsRequest": {
-      "type": "object",
-      "properties": {
-        "variantSetId": {
-          "description": "The destination variant set.",
+        "exportUri": {
+          "description": "Required. A Google Cloud Storage URI for the exported BAM file.\nThe currently authenticated user must have write access to the new file.\nAn error will be returned if the URI already contains data.",
           "type": "string"
         },
-        "variants": {
-          "description": "The variants to be merged with existing variants.",
-          "type": "array",
-          "items": {
-            "$ref": "Variant"
-          }
-        },
-        "infoMergeConfig": {
-          "description": "A mapping between info field keys and the InfoMergeOperations to\nbe performed on them.",
-          "additionalProperties": {
-            "enum": [
-              "INFO_MERGE_OPERATION_UNSPECIFIED",
-              "IGNORE_NEW",
-              "MOVE_TO_CALLS"
-            ],
-            "type": "string"
-          },
-          "type": "object"
-        }
-      },
-      "id": "MergeVariantsRequest"
-    },
-    "ImportVariantsResponse": {
-      "description": "The variant data import response.",
-      "type": "object",
-      "properties": {
-        "callSetIds": {
-          "description": "IDs of the call sets created during the import.",
+        "referenceNames": {
+          "description": "The reference names to export. If this is not specified, all reference\nsequences, including unmapped reads, are exported.\nUse `*` to export only unmapped reads.",
           "type": "array",
           "items": {
             "type": "string"
           }
-        }
-      },
-      "id": "ImportVariantsResponse"
-    },
-    "CoverageBucket": {
-      "description": "A bucket over which read coverage has been precomputed. A bucket corresponds\nto a specific range of the reference sequence.",
-      "type": "object",
-      "properties": {
-        "range": {
-          "description": "The genomic coordinate range spanned by this bucket.",
-          "$ref": "Range"
         },
-        "meanCoverage": {
-          "description": "The average number of reads which are aligned to each individual\nreference base in this bucket.",
-          "type": "number",
-          "format": "float"
+        "projectId": {
+          "description": "Required. The Google Cloud project ID that owns this\nexport. The caller must have WRITE access to this project.",
+          "type": "string"
         }
       },
-      "id": "CoverageBucket"
+      "id": "ExportReadGroupSetRequest"
+    },
+    "Exon": {
+      "properties": {
+        "start": {
+          "description": "The start position of the exon on this annotation's reference sequence,\n0-based inclusive. Note that this is relative to the reference start, and\n**not** the containing annotation start.",
+          "format": "int64",
+          "type": "string"
+        },
+        "end": {
+          "description": "The end position of the exon on this annotation's reference sequence,\n0-based exclusive. Note that this is relative to the reference start, and\n*not* the containing annotation start.",
+          "format": "int64",
+          "type": "string"
+        },
+        "frame": {
+          "description": "The frame of this exon. Contains a value of 0, 1, or 2, which indicates\nthe offset of the first coding base of the exon within the reading frame\nof the coding DNA sequence, if any. This field is dependent on the\nstrandedness of this annotation (see\nAnnotation.reverse_strand).\nFor forward stranded annotations, this offset is relative to the\nexon.start. For reverse\nstrand annotations, this offset is relative to the\nexon.end `- 1`.\n\nUnset if this exon does not intersect the coding sequence. Upon creation\nof a transcript, the frame must be populated for all or none of the\ncoding exons.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "Exon",
+      "type": "object"
     },
     "CallSet": {
       "description": "A call set is a collection of variant calls, typically for one sample. It\nbelongs to a variant set.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
       "type": "object",
       "properties": {
-        "id": {
-          "description": "The server-generated call set ID, unique across all call sets.",
-          "type": "string"
-        },
-        "created": {
-          "description": "The date this call set was created in milliseconds from the epoch.",
-          "type": "string",
-          "format": "int64"
-        },
-        "sampleId": {
-          "description": "The sample ID this call set corresponds to.",
-          "type": "string"
-        },
         "variantSetIds": {
           "description": "The IDs of the variant sets this call set belongs to. This field must\nhave exactly length one, as a call set belongs to a single variant set.\nThis field is repeated for compatibility with the\n[GA4GH 0.5.1\nAPI](https://github.com/ga4gh/schemas/blob/v0.5.1/src/main/resources/avro/variants.avdl#L76).",
           "type": "array",
@@ -2763,356 +2563,35 @@
             "type": "string"
           }
         },
-        "info": {
-          "description": "A map of additional call set information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
-          "additionalProperties": {
-            "type": "array",
-            "items": {
-              "type": "any"
-            }
-          },
-          "type": "object"
+        "id": {
+          "description": "The server-generated call set ID, unique across all call sets.",
+          "type": "string"
+        },
+        "created": {
+          "description": "The date this call set was created in milliseconds from the epoch.",
+          "format": "int64",
+          "type": "string"
+        },
+        "sampleId": {
+          "description": "The sample ID this call set corresponds to.",
+          "type": "string"
         },
         "name": {
           "description": "The call set name.",
           "type": "string"
-        }
-      },
-      "id": "CallSet"
-    },
-    "VariantAnnotation": {
-      "type": "object",
-      "properties": {
-        "alternateBases": {
-          "description": "The alternate allele for this variant. If multiple alternate alleles\nexist at this location, create a separate variant for each one, as they\nmay represent distinct conditions.",
-          "type": "string"
-        },
-        "geneId": {
-          "description": "Google annotation ID of the gene affected by this variant. This should\nbe provided when the variant is created.",
-          "type": "string"
-        },
-        "transcriptIds": {
-          "description": "Google annotation IDs of the transcripts affected by this variant. These\nshould be provided when the variant is created.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "conditions": {
-          "description": "The set of conditions associated with this variant.\nA condition describes the way a variant influences human health.",
-          "type": "array",
-          "items": {
-            "$ref": "ClinicalCondition"
-          }
-        },
-        "effect": {
-          "description": "Effect of the variant on the coding sequence.",
-          "enum": [
-            "EFFECT_UNSPECIFIED",
-            "EFFECT_OTHER",
-            "FRAMESHIFT",
-            "FRAME_PRESERVING_INDEL",
-            "SYNONYMOUS_SNP",
-            "NONSYNONYMOUS_SNP",
-            "STOP_GAIN",
-            "STOP_LOSS",
-            "SPLICE_SITE_DISRUPTION"
-          ],
-          "enumDescriptions": [
-            "",
-            "`EFFECT_OTHER` should be used when no other Effect\nwill suffice.",
-            "`FRAMESHIFT` indicates a mutation in which the insertion or\ndeletion of nucleotides resulted in a frameshift change.",
-            "`FRAME_PRESERVING_INDEL` indicates a mutation in which a\nmultiple of three nucleotides has been inserted or deleted, resulting\nin no change to the reading frame of the coding sequence.",
-            "`SYNONYMOUS_SNP` indicates a single nucleotide polymorphism\nmutation that results in no amino acid change.",
-            "`NONSYNONYMOUS_SNP` indicates a single nucleotide\npolymorphism mutation that results in an amino acid change.",
-            "`STOP_GAIN` indicates a mutation that leads to the creation\nof a stop codon at the variant site. Frameshift mutations creating\ndownstream stop codons do not count as `STOP_GAIN`.",
-            "`STOP_LOSS` indicates a mutation that eliminates a\nstop codon at the variant site.",
-            "`SPLICE_SITE_DISRUPTION` indicates that this variant is\nfound in a splice site for the associated transcript, and alters the\nnormal splicing pattern."
-          ],
-          "type": "string"
-        },
-        "clinicalSignificance": {
-          "description": "Describes the clinical significance of a variant.\nIt is adapted from the ClinVar controlled vocabulary for clinical\nsignificance described at:\nhttp://www.ncbi.nlm.nih.gov/clinvar/docs/clinsig/",
-          "enum": [
-            "CLINICAL_SIGNIFICANCE_UNSPECIFIED",
-            "CLINICAL_SIGNIFICANCE_OTHER",
-            "UNCERTAIN",
-            "BENIGN",
-            "LIKELY_BENIGN",
-            "LIKELY_PATHOGENIC",
-            "PATHOGENIC",
-            "DRUG_RESPONSE",
-            "HISTOCOMPATIBILITY",
-            "CONFERS_SENSITIVITY",
-            "RISK_FACTOR",
-            "ASSOCIATION",
-            "PROTECTIVE",
-            "MULTIPLE_REPORTED"
-          ],
-          "enumDescriptions": [
-            "",
-            "`OTHER` should be used when no other clinical significance\nvalue will suffice.",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "`MULTIPLE_REPORTED` should be used when multiple clinical\nsignficances are reported for a variant. The original clinical\nsignificance values may be provided in the `info` field."
-          ],
-          "type": "string"
-        },
-        "type": {
-          "description": "Type has been adapted from ClinVar's list of variant types.",
-          "enum": [
-            "TYPE_UNSPECIFIED",
-            "TYPE_OTHER",
-            "INSERTION",
-            "DELETION",
-            "SUBSTITUTION",
-            "SNP",
-            "STRUCTURAL",
-            "CNV"
-          ],
-          "enumDescriptions": [
-            "",
-            "`TYPE_OTHER` should be used when no other Type will suffice.\nFurther explanation of the variant type may be included in the\ninfo field.",
-            "`INSERTION` indicates an insertion.",
-            "`DELETION` indicates a deletion.",
-            "`SUBSTITUTION` indicates a block substitution of\ntwo or more nucleotides.",
-            "`SNP` indicates a single nucleotide polymorphism.",
-            "`STRUCTURAL` indicates a large structural variant,\nincluding chromosomal fusions, inversions, etc.",
-            "`CNV` indicates a variation in copy number."
-          ],
-          "type": "string"
-        }
-      },
-      "id": "VariantAnnotation"
-    },
-    "ImportVariantsRequest": {
-      "description": "The variant data import request.",
-      "type": "object",
-      "properties": {
-        "variantSetId": {
-          "description": "Required. The variant set to which variant data should be imported.",
-          "type": "string"
-        },
-        "sourceUris": {
-          "description": "A list of URIs referencing variant files in Google Cloud Storage. URIs can\ninclude wildcards [as described\nhere](https://cloud.google.com/storage/docs/gsutil/addlhelp/WildcardNames).\nNote that recursive wildcards ('**') are not supported.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "format": {
-          "description": "The format of the variant data being imported. If unspecified, defaults to\nto `VCF`.",
-          "enum": [
-            "FORMAT_UNSPECIFIED",
-            "FORMAT_VCF",
-            "FORMAT_COMPLETE_GENOMICS"
-          ],
-          "enumDescriptions": [
-            "",
-            "VCF (Variant Call Format). The VCF files may be gzip compressed. gVCF is\nalso supported.",
-            "Complete Genomics masterVarBeta format. The masterVarBeta files may\nbe bzip2 compressed."
-          ],
-          "type": "string"
-        },
-        "normalizeReferenceNames": {
-          "description": "Convert reference names to the canonical representation.\nhg19 haploytypes (those reference names containing \"_hap\")\nare not modified in any way.\nAll other reference names are modified according to the following rules:\nThe reference name is capitalized.\nThe \"chr\" prefix is dropped for all autosomes and sex chromsomes.\nFor example \"chr17\" becomes \"17\" and \"chrX\" becomes \"X\".\nAll mitochondrial chromosomes (\"chrM\", \"chrMT\", etc) become \"MT\".",
-          "type": "boolean"
-        },
-        "infoMergeConfig": {
-          "description": "A mapping between info field keys and the InfoMergeOperations to\nbe performed on them. This is plumbed down to the MergeVariantRequests\ngenerated by the resulting import job.",
-          "additionalProperties": {
-            "enum": [
-              "INFO_MERGE_OPERATION_UNSPECIFIED",
-              "IGNORE_NEW",
-              "MOVE_TO_CALLS"
-            ],
-            "type": "string"
-          },
-          "type": "object"
-        }
-      },
-      "id": "ImportVariantsRequest"
-    },
-    "SearchCallSetsResponse": {
-      "description": "The call set search response.",
-      "type": "object",
-      "properties": {
-        "callSets": {
-          "description": "The list of matching call sets.",
-          "type": "array",
-          "items": {
-            "$ref": "CallSet"
-          }
-        },
-        "nextPageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
-          "type": "string"
-        }
-      },
-      "id": "SearchCallSetsResponse"
-    },
-    "SearchReferenceSetsRequest": {
-      "type": "object",
-      "properties": {
-        "md5checksums": {
-          "description": "If present, return reference sets for which the\nmd5checksum matches exactly.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "pageSize": {
-          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 1024. The maximum value is 4096.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "accessions": {
-          "description": "If present, return reference sets for which a prefix of any of\nsourceAccessions\nmatch any of these strings. Accession numbers typically have a main number\nand a version, for example `NC_000001.11`.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "assemblyId": {
-          "description": "If present, return reference sets for which a substring of their\n`assemblyId` matches this string (case insensitive).",
-          "type": "string"
-        },
-        "pageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
-          "type": "string"
-        }
-      },
-      "id": "SearchReferenceSetsRequest"
-    },
-    "Variant": {
-      "description": "A variant represents a change in DNA sequence relative to a reference\nsequence. For example, a variant could represent a SNP or an insertion.\nVariants belong to a variant set.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)\n\nEach of the calls on a variant represent a determination of genotype with\nrespect to that variant. For example, a call might assign probability of 0.32\nto the occurrence of a SNP named rs1234 in a sample named NA12345. A call\nbelongs to a call set, which contains related calls typically from one\nsample.",
-      "type": "object",
-      "properties": {
-        "alternateBases": {
-          "description": "The bases that appear instead of the reference bases.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "id": {
-          "description": "The server-generated variant ID, unique across all variants.",
-          "type": "string"
-        },
-        "filter": {
-          "description": "A list of filters (normally quality filters) this variant has failed.\n`PASS` indicates this variant has passed all filters.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "referenceName": {
-          "description": "The reference on which this variant occurs.\n(such as `chr20` or `X`)",
-          "type": "string"
-        },
-        "created": {
-          "description": "The date this variant was created, in milliseconds from the epoch.",
-          "type": "string",
-          "format": "int64"
         },
         "info": {
-          "description": "A map of additional variant information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
           "additionalProperties": {
             "type": "array",
             "items": {
               "type": "any"
             }
           },
+          "description": "A map of additional call set information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
           "type": "object"
-        },
-        "calls": {
-          "description": "The variant calls for this particular variant. Each one represents the\ndetermination of genotype with respect to this variant.",
-          "type": "array",
-          "items": {
-            "$ref": "VariantCall"
-          }
-        },
-        "variantSetId": {
-          "description": "The ID of the variant set this variant belongs to.",
-          "type": "string"
-        },
-        "names": {
-          "description": "Names for the variant, for example a RefSNP ID.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "quality": {
-          "description": "A measure of how likely this variant is to be real.\nA higher value is better.",
-          "type": "number",
-          "format": "double"
-        },
-        "start": {
-          "description": "The position at which this variant occurs (0-based).\nThis corresponds to the first base of the string of reference bases.",
-          "type": "string",
-          "format": "int64"
-        },
-        "referenceBases": {
-          "description": "The reference bases for this variant. They start at the given\nposition.",
-          "type": "string"
-        },
-        "end": {
-          "description": "The end position (0-based) of this variant. This corresponds to the first\nbase after the last base in the reference allele. So, the length of\nthe reference allele is (end - start). This is useful for variants\nthat don't explicitly give alternate bases, for example large deletions.",
-          "type": "string",
-          "format": "int64"
         }
       },
-      "id": "Variant"
-    },
-    "Reference": {
-      "description": "A reference is a canonical assembled DNA sequence, intended to act as a\nreference coordinate space for other genomic annotations. A single reference\nmight represent the human chromosome 1 or mitochandrial DNA, for instance. A\nreference belongs to one or more reference sets.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-      "type": "object",
-      "properties": {
-        "id": {
-          "description": "The server-generated reference ID, unique across all references.",
-          "type": "string"
-        },
-        "ncbiTaxonId": {
-          "description": "ID from http://www.ncbi.nlm.nih.gov/taxonomy. For example, 9606 for human.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "sourceUri": {
-          "description": "The URI from which the sequence was obtained. Typically specifies a FASTA\nformat file.",
-          "type": "string"
-        },
-        "sourceAccessions": {
-          "description": "All known corresponding accession IDs in INSDC (GenBank/ENA/DDBJ) ideally\nwith a version number, for example `GCF_000001405.26`.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "length": {
-          "description": "The length of this reference's sequence.",
-          "type": "string",
-          "format": "int64"
-        },
-        "name": {
-          "description": "The name of this reference, for example `22`.",
-          "type": "string"
-        },
-        "md5checksum": {
-          "description": "MD5 of the upper-case sequence excluding all whitespace characters (this\nis equivalent to SQ:M5 in SAM). This value is represented in lower case\nhexadecimal format.",
-          "type": "string"
-        }
-      },
-      "id": "Reference"
+      "id": "CallSet"
     },
     "SearchAnnotationSetsResponse": {
       "type": "object",
@@ -3131,221 +2610,306 @@
       },
       "id": "SearchAnnotationSetsResponse"
     },
-    "CigarUnit": {
-      "description": "A single CIGAR operation.",
-      "type": "object",
+    "ImportVariantsRequest": {
       "properties": {
-        "operation": {
-          "enum": [
-            "OPERATION_UNSPECIFIED",
-            "ALIGNMENT_MATCH",
-            "INSERT",
-            "DELETE",
-            "SKIP",
-            "CLIP_SOFT",
-            "CLIP_HARD",
-            "PAD",
-            "SEQUENCE_MATCH",
-            "SEQUENCE_MISMATCH"
-          ],
-          "enumDescriptions": [
-            "",
-            "An alignment match indicates that a sequence can be aligned to the\nreference without evidence of an INDEL. Unlike the\n`SEQUENCE_MATCH` and `SEQUENCE_MISMATCH` operators,\nthe `ALIGNMENT_MATCH` operator does not indicate whether the\nreference and read sequences are an exact match. This operator is\nequivalent to SAM's `M`.",
-            "The insert operator indicates that the read contains evidence of bases\nbeing inserted into the reference. This operator is equivalent to SAM's\n`I`.",
-            "The delete operator indicates that the read contains evidence of bases\nbeing deleted from the reference. This operator is equivalent to SAM's\n`D`.",
-            "The skip operator indicates that this read skips a long segment of the\nreference, but the bases have not been deleted. This operator is commonly\nused when working with RNA-seq data, where reads may skip long segments\nof the reference between exons. This operator is equivalent to SAM's\n`N`.",
-            "The soft clip operator indicates that bases at the start/end of a read\nhave not been considered during alignment. This may occur if the majority\nof a read maps, except for low quality bases at the start/end of a read.\nThis operator is equivalent to SAM's `S`. Bases that are soft\nclipped will still be stored in the read.",
-            "The hard clip operator indicates that bases at the start/end of a read\nhave been omitted from this alignment. This may occur if this linear\nalignment is part of a chimeric alignment, or if the read has been\ntrimmed (for example, during error correction or to trim poly-A tails for\nRNA-seq). This operator is equivalent to SAM's `H`.",
-            "The pad operator indicates that there is padding in an alignment. This\noperator is equivalent to SAM's `P`.",
-            "This operator indicates that this portion of the aligned sequence exactly\nmatches the reference. This operator is equivalent to SAM's `=`.",
-            "This operator indicates that this portion of the aligned sequence is an\nalignment match to the reference, but a sequence mismatch. This can\nindicate a SNP or a read error. This operator is equivalent to SAM's\n`X`."
-          ],
-          "type": "string"
-        },
-        "referenceSequence": {
-          "description": "`referenceSequence` is only used at mismatches\n(`SEQUENCE_MISMATCH`) and deletions (`DELETE`).\nFilling this field replaces SAM's MD tag. If the relevant information is\nnot available, this field is unset.",
-          "type": "string"
-        },
-        "operationLength": {
-          "description": "The number of genomic bases that the operation runs for. Required.",
-          "type": "string",
-          "format": "int64"
-        }
-      },
-      "id": "CigarUnit"
-    },
-    "OperationMetadata": {
-      "description": "Metadata describing an Operation.",
-      "type": "object",
-      "properties": {
-        "clientId": {
-          "description": "This field is deprecated. Use `labels` instead. Optionally provided by the\ncaller when submitting the request that creates the operation.",
-          "type": "string"
-        },
-        "request": {
-          "description": "The original request that started the operation. Note that this will be in\ncurrent version of the API. If the operation was started with v1beta2 API\nand a GetOperation is performed on v1 API, a v1 request will be returned.",
+        "infoMergeConfig": {
           "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        },
-        "events": {
-          "description": "Optional event messages that were generated during the job's execution.\nThis also contains any warnings that were generated during import\nor export.",
-          "type": "array",
-          "items": {
-            "$ref": "OperationEvent"
-          }
-        },
-        "endTime": {
-          "description": "The time at which the job stopped running.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "labels": {
-          "description": "Optionally provided by the caller when submitting the request that creates\nthe operation.",
-          "additionalProperties": {
+            "enum": [
+              "INFO_MERGE_OPERATION_UNSPECIFIED",
+              "IGNORE_NEW",
+              "MOVE_TO_CALLS"
+            ],
             "type": "string"
           },
+          "description": "A mapping between info field keys and the InfoMergeOperations to\nbe performed on them. This is plumbed down to the MergeVariantRequests\ngenerated by the resulting import job.",
           "type": "object"
         },
-        "createTime": {
-          "description": "The time at which the job was submitted to the Genomics service.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "runtimeMetadata": {
-          "description": "Runtime metadata on this Operation.",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        },
-        "startTime": {
-          "description": "The time at which the job began to run.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "projectId": {
-          "description": "The Google Cloud Project in which the job is scoped.",
-          "type": "string"
-        }
-      },
-      "id": "OperationMetadata"
-    },
-    "Dataset": {
-      "description": "A Dataset is a collection of genomic data.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-      "type": "object",
-      "properties": {
-        "createTime": {
-          "description": "The time this dataset was created, in seconds from the epoch.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "id": {
-          "description": "The server-generated dataset ID, unique across all datasets.",
-          "type": "string"
-        },
-        "projectId": {
-          "description": "The Google Cloud project ID that this dataset belongs to.",
-          "type": "string"
-        },
-        "name": {
-          "description": "The dataset name.",
-          "type": "string"
-        }
-      },
-      "id": "Dataset"
-    },
-    "ImportReadGroupSetsRequest": {
-      "description": "The read group set import request.",
-      "type": "object",
-      "properties": {
-        "referenceSetId": {
-          "description": "The reference set to which the imported read group sets are aligned to, if\nany. The reference names of this reference set must be a superset of those\nfound in the imported file headers. If no reference set id is provided, a\nbest effort is made to associate with a matching reference set.",
-          "type": "string"
-        },
-        "partitionStrategy": {
-          "description": "The partition strategy describes how read groups are partitioned into read\ngroup sets.",
-          "enum": [
-            "PARTITION_STRATEGY_UNSPECIFIED",
-            "PER_FILE_PER_SAMPLE",
-            "MERGE_ALL"
-          ],
-          "enumDescriptions": [
-            "",
-            "In most cases, this strategy yields one read group set per file. This is\nthe default behavior.\n\nAllocate one read group set per file per sample. For BAM files, read\ngroups are considered to share a sample if they have identical sample\nnames. Furthermore, all reads for each file which do not belong to a read\ngroup, if any, will be grouped into a single read group set per-file.",
-            "Includes all read groups in all imported files into a single read group\nset. Requires that the headers for all imported files are equivalent. All\nreads which do not belong to a read group, if any, will be grouped into a\nseparate read group set."
-          ],
-          "type": "string"
-        },
-        "datasetId": {
-          "description": "Required. The ID of the dataset these read group sets will belong to. The\ncaller must have WRITE permissions to this dataset.",
+        "variantSetId": {
+          "description": "Required. The variant set to which variant data should be imported.",
           "type": "string"
         },
         "sourceUris": {
-          "description": "A list of URIs pointing at [BAM\nfiles](https://samtools.github.io/hts-specs/SAMv1.pdf)\nin Google Cloud Storage.\nThose URIs can include wildcards (*), but do not add or remove\nmatching files before import has completed.\n\nNote that Google Cloud Storage object listing is only eventually\nconsistent: files added may be not be immediately visible to\neveryone. Thus, if using a wildcard it is preferable not to start\nthe import immediately after the files are created.",
+          "description": "A list of URIs referencing variant files in Google Cloud Storage. URIs can\ninclude wildcards [as described\nhere](https://cloud.google.com/storage/docs/gsutil/addlhelp/WildcardNames).\nNote that recursive wildcards ('**') are not supported.",
           "type": "array",
           "items": {
             "type": "string"
           }
+        },
+        "normalizeReferenceNames": {
+          "description": "Convert reference names to the canonical representation.\nhg19 haploytypes (those reference names containing \"_hap\")\nare not modified in any way.\nAll other reference names are modified according to the following rules:\nThe reference name is capitalized.\nThe \"chr\" prefix is dropped for all autosomes and sex chromsomes.\nFor example \"chr17\" becomes \"17\" and \"chrX\" becomes \"X\".\nAll mitochondrial chromosomes (\"chrM\", \"chrMT\", etc) become \"MT\".",
+          "type": "boolean"
+        },
+        "format": {
+          "enum": [
+            "FORMAT_UNSPECIFIED",
+            "FORMAT_VCF",
+            "FORMAT_COMPLETE_GENOMICS"
+          ],
+          "description": "The format of the variant data being imported. If unspecified, defaults to\nto `VCF`.",
+          "type": "string",
+          "enumDescriptions": [
+            "",
+            "VCF (Variant Call Format). The VCF files may be gzip compressed. gVCF is\nalso supported.",
+            "Complete Genomics masterVarBeta format. The masterVarBeta files may\nbe bzip2 compressed."
+          ]
         }
       },
-      "id": "ImportReadGroupSetsRequest"
+      "id": "ImportVariantsRequest",
+      "description": "The variant data import request.",
+      "type": "object"
     },
-    "Range": {
-      "description": "A 0-based half-open genomic coordinate range for search requests.",
+    "ListCoverageBucketsResponse": {
+      "properties": {
+        "nextPageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
+          "type": "string"
+        },
+        "bucketWidth": {
+          "description": "The length of each coverage bucket in base pairs. Note that buckets at the\nend of a reference sequence may be shorter. This value is omitted if the\nbucket width is infinity (the default behaviour, with no range or\n`targetBucketWidth`).",
+          "format": "int64",
+          "type": "string"
+        },
+        "coverageBuckets": {
+          "description": "The coverage buckets. The list of buckets is sparse; a bucket with 0\noverlapping reads is not returned. A bucket never crosses more than one\nreference sequence. Each bucket has width `bucketWidth`, unless\nits end is the end of the reference sequence.",
+          "type": "array",
+          "items": {
+            "$ref": "CoverageBucket"
+          }
+        }
+      },
+      "id": "ListCoverageBucketsResponse",
+      "type": "object"
+    },
+    "VariantAnnotation": {
       "type": "object",
       "properties": {
-        "referenceName": {
-          "description": "The reference sequence name, for example `chr1`,\n`1`, or `chrX`.",
+        "effect": {
+          "enum": [
+            "EFFECT_UNSPECIFIED",
+            "EFFECT_OTHER",
+            "FRAMESHIFT",
+            "FRAME_PRESERVING_INDEL",
+            "SYNONYMOUS_SNP",
+            "NONSYNONYMOUS_SNP",
+            "STOP_GAIN",
+            "STOP_LOSS",
+            "SPLICE_SITE_DISRUPTION"
+          ],
+          "description": "Effect of the variant on the coding sequence.",
+          "type": "string",
+          "enumDescriptions": [
+            "",
+            "`EFFECT_OTHER` should be used when no other Effect\nwill suffice.",
+            "`FRAMESHIFT` indicates a mutation in which the insertion or\ndeletion of nucleotides resulted in a frameshift change.",
+            "`FRAME_PRESERVING_INDEL` indicates a mutation in which a\nmultiple of three nucleotides has been inserted or deleted, resulting\nin no change to the reading frame of the coding sequence.",
+            "`SYNONYMOUS_SNP` indicates a single nucleotide polymorphism\nmutation that results in no amino acid change.",
+            "`NONSYNONYMOUS_SNP` indicates a single nucleotide\npolymorphism mutation that results in an amino acid change.",
+            "`STOP_GAIN` indicates a mutation that leads to the creation\nof a stop codon at the variant site. Frameshift mutations creating\ndownstream stop codons do not count as `STOP_GAIN`.",
+            "`STOP_LOSS` indicates a mutation that eliminates a\nstop codon at the variant site.",
+            "`SPLICE_SITE_DISRUPTION` indicates that this variant is\nfound in a splice site for the associated transcript, and alters the\nnormal splicing pattern."
+          ]
+        },
+        "transcriptIds": {
+          "description": "Google annotation IDs of the transcripts affected by this variant. These\nshould be provided when the variant is created.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "type": {
+          "enumDescriptions": [
+            "",
+            "`TYPE_OTHER` should be used when no other Type will suffice.\nFurther explanation of the variant type may be included in the\ninfo field.",
+            "`INSERTION` indicates an insertion.",
+            "`DELETION` indicates a deletion.",
+            "`SUBSTITUTION` indicates a block substitution of\ntwo or more nucleotides.",
+            "`SNP` indicates a single nucleotide polymorphism.",
+            "`STRUCTURAL` indicates a large structural variant,\nincluding chromosomal fusions, inversions, etc.",
+            "`CNV` indicates a variation in copy number."
+          ],
+          "enum": [
+            "TYPE_UNSPECIFIED",
+            "TYPE_OTHER",
+            "INSERTION",
+            "DELETION",
+            "SUBSTITUTION",
+            "SNP",
+            "STRUCTURAL",
+            "CNV"
+          ],
+          "description": "Type has been adapted from ClinVar's list of variant types.",
+          "type": "string"
+        },
+        "alternateBases": {
+          "description": "The alternate allele for this variant. If multiple alternate alleles\nexist at this location, create a separate variant for each one, as they\nmay represent distinct conditions.",
+          "type": "string"
+        },
+        "geneId": {
+          "description": "Google annotation ID of the gene affected by this variant. This should\nbe provided when the variant is created.",
+          "type": "string"
+        },
+        "clinicalSignificance": {
+          "enum": [
+            "CLINICAL_SIGNIFICANCE_UNSPECIFIED",
+            "CLINICAL_SIGNIFICANCE_OTHER",
+            "UNCERTAIN",
+            "BENIGN",
+            "LIKELY_BENIGN",
+            "LIKELY_PATHOGENIC",
+            "PATHOGENIC",
+            "DRUG_RESPONSE",
+            "HISTOCOMPATIBILITY",
+            "CONFERS_SENSITIVITY",
+            "RISK_FACTOR",
+            "ASSOCIATION",
+            "PROTECTIVE",
+            "MULTIPLE_REPORTED"
+          ],
+          "description": "Describes the clinical significance of a variant.\nIt is adapted from the ClinVar controlled vocabulary for clinical\nsignificance described at:\nhttp://www.ncbi.nlm.nih.gov/clinvar/docs/clinsig/",
+          "type": "string",
+          "enumDescriptions": [
+            "",
+            "`OTHER` should be used when no other clinical significance\nvalue will suffice.",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "`MULTIPLE_REPORTED` should be used when multiple clinical\nsignficances are reported for a variant. The original clinical\nsignificance values may be provided in the `info` field."
+          ]
+        },
+        "conditions": {
+          "description": "The set of conditions associated with this variant.\nA condition describes the way a variant influences human health.",
+          "type": "array",
+          "items": {
+            "$ref": "ClinicalCondition"
+          }
+        }
+      },
+      "id": "VariantAnnotation"
+    },
+    "ExportVariantSetRequest": {
+      "properties": {
+        "format": {
+          "enumDescriptions": [
+            "",
+            "Export the data to Google BigQuery."
+          ],
+          "enum": [
+            "FORMAT_UNSPECIFIED",
+            "FORMAT_BIGQUERY"
+          ],
+          "description": "The format for the exported data.",
+          "type": "string"
+        },
+        "bigqueryDataset": {
+          "description": "Required. The BigQuery dataset to export data to. This dataset must already\nexist. Note that this is distinct from the Genomics concept of \"dataset\".",
+          "type": "string"
+        },
+        "bigqueryTable": {
+          "description": "Required. The BigQuery table to export data to.\nIf the table doesn't exist, it will be created. If it already exists, it\nwill be overwritten.",
+          "type": "string"
+        },
+        "callSetIds": {
+          "description": "If provided, only variant call information from the specified call sets\nwill be exported. By default all variant calls are exported.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "projectId": {
+          "description": "Required. The Google Cloud project ID that owns the destination\nBigQuery dataset. The caller must have WRITE access to this project.  This\nproject will also own the resulting export job.",
+          "type": "string"
+        }
+      },
+      "id": "ExportVariantSetRequest",
+      "description": "The variant data export request.",
+      "type": "object"
+    },
+    "SearchAnnotationsRequest": {
+      "type": "object",
+      "properties": {
+        "referenceId": {
+          "description": "The ID of the reference to query.",
           "type": "string"
         },
         "end": {
-          "description": "The end position of the range on the reference, 0-based exclusive.",
-          "type": "string",
-          "format": "int64"
+          "description": "The end position of the range on the reference, 0-based exclusive. If\nreferenceId or\nreferenceName\nmust be specified, Defaults to the length of the reference.",
+          "format": "int64",
+          "type": "string"
+        },
+        "pageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
+          "type": "string"
+        },
+        "pageSize": {
+          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 256. The maximum value is 2048.",
+          "format": "int32",
+          "type": "integer"
         },
         "start": {
-          "description": "The start position of the range on the reference, 0-based inclusive.",
-          "type": "string",
-          "format": "int64"
-        }
-      },
-      "id": "Range"
-    },
-    "Binding": {
-      "description": "Associates `members` with a `role`.",
-      "type": "object",
-      "properties": {
-        "members": {
-          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
+          "description": "The start position of the range on the reference, 0-based inclusive. If\nspecified,\nreferenceId or\nreferenceName\nmust be specified. Defaults to 0.",
+          "format": "int64",
+          "type": "string"
+        },
+        "annotationSetIds": {
+          "description": "Required. The annotation sets to search within. The caller must have\n`READ` access to these annotation sets.\nAll queried annotation sets must have the same type.",
           "type": "array",
           "items": {
             "type": "string"
           }
         },
-        "role": {
-          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
+        "referenceName": {
+          "description": "The name of the reference to query, within the reference set associated\nwith this query.",
           "type": "string"
         }
       },
-      "id": "Binding"
+      "id": "SearchAnnotationsRequest"
     },
-    "RuntimeMetadata": {
-      "description": "Runtime metadata that will be populated in the\nruntimeMetadata\nfield of the Operation associated with a RunPipeline execution.",
-      "type": "object",
+    "OperationEvent": {
       "properties": {
-        "computeEngine": {
-          "description": "Execution information specific to Google Compute Engine.",
-          "$ref": "ComputeEngine"
+        "startTime": {
+          "description": "Optional time of when event started.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "description": {
+          "description": "Required description of event.",
+          "type": "string"
+        },
+        "endTime": {
+          "description": "Optional time of when event finished. An event can have a start time and no\nfinish time. If an event has a finish time, there must be a start time.",
+          "format": "google-datetime",
+          "type": "string"
         }
       },
-      "id": "RuntimeMetadata"
+      "id": "OperationEvent",
+      "description": "An event that occurred during an Operation.",
+      "type": "object"
+    },
+    "CodingSequence": {
+      "type": "object",
+      "properties": {
+        "start": {
+          "description": "The start of the coding sequence on this annotation's reference sequence,\n0-based inclusive. Note that this position is relative to the reference\nstart, and *not* the containing annotation start.",
+          "format": "int64",
+          "type": "string"
+        },
+        "end": {
+          "description": "The end of the coding sequence on this annotation's reference sequence,\n0-based exclusive. Note that this position is relative to the reference\nstart, and *not* the containing annotation start.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "id": "CodingSequence"
     },
     "SearchReferencesResponse": {
-      "type": "object",
       "properties": {
         "nextPageToken": {
           "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
@@ -3359,193 +2923,350 @@
           }
         }
       },
-      "id": "SearchReferencesResponse"
+      "id": "SearchReferencesResponse",
+      "type": "object"
     },
-    "ReferenceSet": {
-      "description": "A reference set is a set of references which typically comprise a reference\nassembly for a species, such as `GRCh38` which is representative\nof the human genome. A reference set defines a common coordinate space for\ncomparing reference-aligned experimental data. A reference set contains 1 or\nmore references.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
-      "type": "object",
+    "TestIamPermissionsResponse": {
       "properties": {
-        "id": {
-          "description": "The server-generated reference set ID, unique across all reference sets.",
-          "type": "string"
-        },
-        "description": {
-          "description": "Free text description of this reference set.",
-          "type": "string"
-        },
-        "ncbiTaxonId": {
-          "description": "ID from http://www.ncbi.nlm.nih.gov/taxonomy (for example, 9606 for human)\nindicating the species which this reference set is intended to model. Note\nthat contained references may specify a different `ncbiTaxonId`, as\nassemblies may contain reference sequences which do not belong to the\nmodeled species, for example EBV in a human reference genome.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "referenceIds": {
-          "description": "The IDs of the reference objects that are part of this set.\n`Reference.md5checksum` must be unique within this set.",
+        "permissions": {
+          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
           "type": "array",
           "items": {
             "type": "string"
           }
-        },
-        "sourceUri": {
-          "description": "The URI from which the references were obtained.",
-          "type": "string"
-        },
-        "sourceAccessions": {
-          "description": "All known corresponding accession IDs in INSDC (GenBank/ENA/DDBJ) ideally\nwith a version number, for example `NC_000001.11`.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "assemblyId": {
-          "description": "Public id of this reference set, such as `GRCh37`.",
-          "type": "string"
-        },
-        "md5checksum": {
-          "description": "Order-independent MD5 checksum which identifies this reference set. The\nchecksum is computed by sorting all lower case hexidecimal string\n`reference.md5checksum` (for all reference in this set) in\nascending lexicographic order, concatenating, and taking the MD5 of that\nvalue. The resulting value is represented in lower case hexadecimal format.",
-          "type": "string"
         }
       },
-      "id": "ReferenceSet"
+      "id": "TestIamPermissionsResponse",
+      "description": "Response message for `TestIamPermissions` method.",
+      "type": "object"
     },
-    "AnnotationSet": {
-      "description": "An annotation set is a logical grouping of annotations that share consistent\ntype information and provenance. Examples of annotation sets include 'all\ngenes from refseq', and 'all variant annotations from ClinVar'.",
+    "GetIamPolicyRequest": {
+      "description": "Request message for `GetIamPolicy` method.",
+      "type": "object",
+      "properties": {},
+      "id": "GetIamPolicyRequest"
+    },
+    "SearchAnnotationSetsRequest": {
       "type": "object",
       "properties": {
-        "id": {
-          "description": "The server-generated annotation set ID, unique across all annotation sets.",
+        "pageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
           "type": "string"
         },
-        "info": {
-          "description": "A map of additional read alignment information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
-          "additionalProperties": {
-            "type": "array",
-            "items": {
-              "type": "any"
-            }
+        "pageSize": {
+          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 128. The maximum value is 1024.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "datasetIds": {
+          "description": "Required. The dataset IDs to search within. Caller must have `READ` access\nto these datasets.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "types": {
+          "description": "If specified, only annotation sets that have any of these types are\nreturned.",
+          "type": "array",
+          "items": {
+            "enum": [
+              "ANNOTATION_TYPE_UNSPECIFIED",
+              "GENERIC",
+              "VARIANT",
+              "GENE",
+              "TRANSCRIPT"
+            ],
+            "type": "string"
           },
-          "type": "object"
-        },
-        "sourceUri": {
-          "description": "The source URI describing the file from which this annotation set was\ngenerated, if any.",
-          "type": "string"
-        },
-        "datasetId": {
-          "description": "The dataset to which this annotation set belongs.",
-          "type": "string"
-        },
-        "name": {
-          "description": "The display name for this annotation set.",
-          "type": "string"
-        },
-        "referenceSetId": {
-          "description": "The ID of the reference set that defines the coordinate space for this\nset's annotations.",
-          "type": "string"
-        },
-        "type": {
-          "description": "The type of annotations contained within this set.",
-          "enum": [
-            "ANNOTATION_TYPE_UNSPECIFIED",
-            "GENERIC",
-            "VARIANT",
-            "GENE",
-            "TRANSCRIPT"
-          ],
           "enumDescriptions": [
             "",
             "A `GENERIC` annotation type should be used when no other annotation\ntype will suffice. This represents an untyped annotation of the reference\ngenome.",
             "A `VARIANT` annotation type.",
             "A `GENE` annotation type represents the existence of a gene at the\nassociated reference coordinates. The start coordinate is typically the\ngene's transcription start site and the end is typically the end of the\ngene's last exon.",
             "A `TRANSCRIPT` annotation type represents the assertion that a\nparticular region of the reference genome may be transcribed as RNA."
-          ],
-          "type": "string"
-        }
-      },
-      "id": "AnnotationSet"
-    },
-    "ImportReadGroupSetsResponse": {
-      "description": "The read group set import response.",
-      "type": "object",
-      "properties": {
-        "readGroupSetIds": {
-          "description": "IDs of the read group sets that were created.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "ImportReadGroupSetsResponse"
-    },
-    "ExternalId": {
-      "type": "object",
-      "properties": {
-        "sourceName": {
-          "description": "The name of the source of this data.",
+          ]
+        },
+        "name": {
+          "description": "Only return annotations sets for which a substring of the name matches this\nstring (case insensitive).",
           "type": "string"
         },
-        "id": {
-          "description": "The id used by the source of this data.",
+        "referenceSetId": {
+          "description": "If specified, only annotation sets associated with the given reference set\nare returned.",
           "type": "string"
         }
       },
-      "id": "ExternalId"
+      "id": "SearchAnnotationSetsRequest"
     },
     "SearchReadGroupSetsResponse": {
-      "description": "The read group set search response.",
-      "type": "object",
       "properties": {
+        "nextPageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
+          "type": "string"
+        },
         "readGroupSets": {
           "description": "The list of matching read group sets.",
           "type": "array",
           "items": {
             "$ref": "ReadGroupSet"
           }
-        },
-        "nextPageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
-          "type": "string"
         }
       },
-      "id": "SearchReadGroupSetsResponse"
+      "id": "SearchReadGroupSetsResponse",
+      "description": "The read group set search response.",
+      "type": "object"
     },
-    "OperationEvent": {
-      "description": "An event that occurred during an Operation.",
+    "LinearAlignment": {
+      "description": "A linear alignment can be represented by one CIGAR string. Describes the\nmapped position and local alignment of the read to the reference.",
       "type": "object",
       "properties": {
-        "description": {
-          "description": "Required description of event.",
-          "type": "string"
+        "position": {
+          "$ref": "Position",
+          "description": "The position of this alignment."
         },
-        "startTime": {
-          "description": "Optional time of when event started.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "endTime": {
-          "description": "Optional time of when event finished. An event can have a start time and no\nfinish time. If an event has a finish time, there must be a start time.",
-          "type": "string",
-          "format": "google-datetime"
-        }
-      },
-      "id": "OperationEvent"
-    },
-    "SearchReadsResponse": {
-      "description": "The read search response.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
-          "type": "string"
-        },
-        "alignments": {
-          "description": "The list of matching alignments sorted by mapped genomic coordinate,\nif any, ascending in position within the same reference. Unmapped reads,\nwhich have no position, are returned contiguously and are sorted in\nascending lexicographic order by fragment name.",
+        "cigar": {
+          "description": "Represents the local alignment of this sequence (alignment matches, indels,\netc) against the reference.",
           "type": "array",
           "items": {
-            "$ref": "Read"
+            "$ref": "CigarUnit"
+          }
+        },
+        "mappingQuality": {
+          "description": "The mapping quality of this alignment. Represents how likely\nthe read maps to this position as opposed to other locations.\n\nSpecifically, this is -10 log10 Pr(mapping position is wrong), rounded to\nthe nearest integer.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "LinearAlignment"
+    },
+    "SearchReferencesRequest": {
+      "type": "object",
+      "properties": {
+        "accessions": {
+          "description": "If present, return references for which a prefix of any of\nsourceAccessions match\nany of these strings. Accession numbers typically have a main number and a\nversion, for example `GCF_000001405.26`.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "pageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
+          "type": "string"
+        },
+        "referenceSetId": {
+          "description": "If present, return only references which belong to this reference set.",
+          "type": "string"
+        },
+        "pageSize": {
+          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 1024. The maximum value is 4096.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "md5checksums": {
+          "description": "If present, return references for which the\nmd5checksum matches exactly.",
+          "type": "array",
+          "items": {
+            "type": "string"
           }
         }
       },
-      "id": "SearchReadsResponse"
+      "id": "SearchReferencesRequest"
+    },
+    "Dataset": {
+      "description": "A Dataset is a collection of genomic data.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The dataset name.",
+          "type": "string"
+        },
+        "projectId": {
+          "description": "The Google Cloud project ID that this dataset belongs to.",
+          "type": "string"
+        },
+        "id": {
+          "description": "The server-generated dataset ID, unique across all datasets.",
+          "type": "string"
+        },
+        "createTime": {
+          "description": "The time this dataset was created, in seconds from the epoch.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "Dataset"
+    },
+    "ImportVariantsResponse": {
+      "properties": {
+        "callSetIds": {
+          "description": "IDs of the call sets created during the import.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "ImportVariantsResponse",
+      "description": "The variant data import response.",
+      "type": "object"
+    },
+    "ReadGroup": {
+      "properties": {
+        "name": {
+          "description": "The read group name. This corresponds to the @RG ID field in the SAM spec.",
+          "type": "string"
+        },
+        "referenceSetId": {
+          "description": "The reference set the reads in this read group are aligned to.",
+          "type": "string"
+        },
+        "info": {
+          "additionalProperties": {
+            "type": "array",
+            "items": {
+              "type": "any"
+            }
+          },
+          "description": "A map of additional read group information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
+          "type": "object"
+        },
+        "id": {
+          "description": "The server-generated read group ID, unique for all read groups.\nNote: This is different than the @RG ID field in the SAM spec. For that\nvalue, see name.",
+          "type": "string"
+        },
+        "predictedInsertSize": {
+          "description": "The predicted insert size of this read group. The insert size is the length\nthe sequenced DNA fragment from end-to-end, not including the adapters.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "programs": {
+          "description": "The programs used to generate this read group. Programs are always\nidentical for all read groups within a read group set. For this reason,\nonly the first read group in a returned set will have this field\npopulated.",
+          "type": "array",
+          "items": {
+            "$ref": "Program"
+          }
+        },
+        "description": {
+          "description": "A free-form text description of this read group.",
+          "type": "string"
+        },
+        "sampleId": {
+          "description": "A client-supplied sample identifier for the reads in this read group.",
+          "type": "string"
+        },
+        "datasetId": {
+          "description": "The dataset to which this read group belongs.",
+          "type": "string"
+        },
+        "experiment": {
+          "$ref": "Experiment",
+          "description": "The experiment used to generate this read group."
+        }
+      },
+      "id": "ReadGroup",
+      "description": "A read group is all the data that's processed the same way by the sequencer.",
+      "type": "object"
+    },
+    "ReadGroupSet": {
+      "properties": {
+        "readGroups": {
+          "description": "The read groups in this set. There are typically 1-10 read groups in a read\ngroup set.",
+          "type": "array",
+          "items": {
+            "$ref": "ReadGroup"
+          }
+        },
+        "filename": {
+          "description": "The filename of the original source file for this read group set, if any.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The read group set name. By default this will be initialized to the sample\nname of the sequenced data contained in this set.",
+          "type": "string"
+        },
+        "referenceSetId": {
+          "description": "The reference set to which the reads in this read group set are aligned.",
+          "type": "string"
+        },
+        "info": {
+          "additionalProperties": {
+            "type": "array",
+            "items": {
+              "type": "any"
+            }
+          },
+          "description": "A map of additional read group set information.",
+          "type": "object"
+        },
+        "id": {
+          "description": "The server-generated read group set ID, unique for all read group sets.",
+          "type": "string"
+        },
+        "datasetId": {
+          "description": "The dataset to which this read group set belongs.",
+          "type": "string"
+        }
+      },
+      "id": "ReadGroupSet",
+      "description": "A read group set is a logical collection of read groups, which are\ncollections of reads produced by a sequencer. A read group set typically\nmodels reads corresponding to one sample, sequenced one way, and aligned one\nway.\n\n* A read group set belongs to one dataset.\n* A read group belongs to one read group set.\n* A read belongs to one read group.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
+      "type": "object"
+    },
+    "SearchVariantSetsResponse": {
+      "description": "The search variant sets response.",
+      "type": "object",
+      "properties": {
+        "nextPageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
+          "type": "string"
+        },
+        "variantSets": {
+          "description": "The variant sets belonging to the requested dataset.",
+          "type": "array",
+          "items": {
+            "$ref": "VariantSet"
+          }
+        }
+      },
+      "id": "SearchVariantSetsResponse"
+    },
+    "Empty": {
+      "properties": {},
+      "id": "Empty",
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
+      "type": "object"
+    },
+    "Entry": {
+      "properties": {
+        "status": {
+          "$ref": "Status",
+          "description": "The creation status."
+        },
+        "annotation": {
+          "description": "The created annotation, if creation was successful.",
+          "$ref": "Annotation"
+        }
+      },
+      "id": "Entry",
+      "type": "object"
+    },
+    "Position": {
+      "description": "An abstraction for referring to a genomic position, in relation to some\nalready known reference. For now, represents a genomic position as a\nreference name, a base number on that reference (0-based), and a\ndetermination of forward or reverse strand.",
+      "type": "object",
+      "properties": {
+        "position": {
+          "description": "The 0-based offset from the start of the forward strand for that reference.",
+          "format": "int64",
+          "type": "string"
+        },
+        "referenceName": {
+          "description": "The name of the reference in whatever reference set is being used.",
+          "type": "string"
+        },
+        "reverseStrand": {
+          "description": "Whether this position is on the reverse strand, as opposed to the forward\nstrand.",
+          "type": "boolean"
+        }
+      },
+      "id": "Position"
     },
     "SearchReferenceSetsResponse": {
       "type": "object",
@@ -3564,63 +3285,148 @@
       },
       "id": "SearchReferenceSetsResponse"
     },
-    "Program": {
-      "type": "object",
+    "SearchCallSetsRequest": {
       "properties": {
-        "prevProgramId": {
-          "description": "The ID of the program run before this one.",
-          "type": "string"
-        },
-        "commandLine": {
-          "description": "The command line used to run this program.",
-          "type": "string"
-        },
-        "id": {
-          "description": "The user specified locally unique ID of the program. Used along with\n`prevProgramId` to define an ordering between programs.",
-          "type": "string"
-        },
-        "name": {
-          "description": "The display name of the program. This is typically the colloquial name of\nthe tool used, for example 'bwa' or 'picard'.",
-          "type": "string"
-        },
-        "version": {
-          "description": "The version of the program run.",
-          "type": "string"
-        }
-      },
-      "id": "Program"
-    },
-    "Empty": {
-      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
-      "type": "object",
-      "properties": {},
-      "id": "Empty"
-    },
-    "SearchAnnotationSetsRequest": {
-      "type": "object",
-      "properties": {
-        "datasetIds": {
-          "description": "Required. The dataset IDs to search within. Caller must have `READ` access\nto these datasets.",
+        "variantSetIds": {
+          "description": "Restrict the query to call sets within the given variant sets. At least one\nID must be provided.",
           "type": "array",
           "items": {
             "type": "string"
           }
         },
+        "name": {
+          "description": "Only return call sets for which a substring of the name matches this\nstring.",
+          "type": "string"
+        },
+        "pageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
+          "type": "string"
+        },
         "pageSize": {
-          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 128. The maximum value is 1024.",
-          "type": "integer",
-          "format": "int32"
+          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 1024.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "SearchCallSetsRequest",
+      "description": "The call set search request.",
+      "type": "object"
+    },
+    "ImportReadGroupSetsRequest": {
+      "description": "The read group set import request.",
+      "type": "object",
+      "properties": {
+        "referenceSetId": {
+          "description": "The reference set to which the imported read group sets are aligned to, if\nany. The reference names of this reference set must be a superset of those\nfound in the imported file headers. If no reference set id is provided, a\nbest effort is made to associate with a matching reference set.",
+          "type": "string"
+        },
+        "partitionStrategy": {
+          "enumDescriptions": [
+            "",
+            "In most cases, this strategy yields one read group set per file. This is\nthe default behavior.\n\nAllocate one read group set per file per sample. For BAM files, read\ngroups are considered to share a sample if they have identical sample\nnames. Furthermore, all reads for each file which do not belong to a read\ngroup, if any, will be grouped into a single read group set per-file.",
+            "Includes all read groups in all imported files into a single read group\nset. Requires that the headers for all imported files are equivalent. All\nreads which do not belong to a read group, if any, will be grouped into a\nseparate read group set."
+          ],
+          "enum": [
+            "PARTITION_STRATEGY_UNSPECIFIED",
+            "PER_FILE_PER_SAMPLE",
+            "MERGE_ALL"
+          ],
+          "description": "The partition strategy describes how read groups are partitioned into read\ngroup sets.",
+          "type": "string"
+        },
+        "datasetId": {
+          "description": "Required. The ID of the dataset these read group sets will belong to. The\ncaller must have WRITE permissions to this dataset.",
+          "type": "string"
+        },
+        "sourceUris": {
+          "description": "A list of URIs pointing at [BAM\nfiles](https://samtools.github.io/hts-specs/SAMv1.pdf)\nin Google Cloud Storage.\nThose URIs can include wildcards (*), but do not add or remove\nmatching files before import has completed.\n\nNote that Google Cloud Storage object listing is only eventually\nconsistent: files added may be not be immediately visible to\neveryone. Thus, if using a wildcard it is preferable not to start\nthe import immediately after the files are created.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "ImportReadGroupSetsRequest"
+    },
+    "Policy": {
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
+      "type": "object",
+      "properties": {
+        "etag": {
+          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
+          "format": "byte",
+          "type": "string"
+        },
+        "version": {
+          "description": "Version of the `Policy`. The default version is 0.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "bindings": {
+          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
+          "type": "array",
+          "items": {
+            "$ref": "Binding"
+          }
+        }
+      },
+      "id": "Policy"
+    },
+    "Annotation": {
+      "properties": {
+        "end": {
+          "description": "The end position of the range on the reference, 0-based exclusive.",
+          "format": "int64",
+          "type": "string"
+        },
+        "transcript": {
+          "$ref": "Transcript",
+          "description": "A transcript value represents the assertion that a particular region of\nthe reference genome may be transcribed as RNA. An alternative splicing\npattern would be represented as a separate transcript object. This field\nis only set for annotations of type `TRANSCRIPT`."
+        },
+        "start": {
+          "description": "The start position of the range on the reference, 0-based inclusive.",
+          "format": "int64",
+          "type": "string"
+        },
+        "annotationSetId": {
+          "description": "The annotation set to which this annotation belongs.",
+          "type": "string"
         },
         "name": {
-          "description": "Only return annotations sets for which a substring of the name matches this\nstring (case insensitive).",
+          "description": "The display name of this annotation.",
           "type": "string"
         },
-        "referenceSetId": {
-          "description": "If specified, only annotation sets associated with the given reference set\nare returned.",
+        "variant": {
+          "$ref": "VariantAnnotation",
+          "description": "A variant annotation, which describes the effect of a variant on the\ngenome, the coding sequence, and/or higher level consequences at the\norganism level e.g. pathogenicity. This field is only set for annotations\nof type `VARIANT`."
+        },
+        "referenceId": {
+          "description": "The ID of the Google Genomics reference associated with this range.",
           "type": "string"
         },
-        "types": {
-          "description": "If specified, only annotation sets that have any of these types are\nreturned.",
+        "id": {
+          "description": "The server-generated annotation ID, unique across all annotations.",
+          "type": "string"
+        },
+        "reverseStrand": {
+          "description": "Whether this range refers to the reverse strand, as opposed to the forward\nstrand. Note that regardless of this field, the start/end position of the\nrange always refer to the forward strand.",
+          "type": "boolean"
+        },
+        "referenceName": {
+          "description": "The display name corresponding to the reference specified by\n`referenceId`, for example `chr1`, `1`, or `chrX`.",
+          "type": "string"
+        },
+        "info": {
+          "additionalProperties": {
+            "type": "array",
+            "items": {
+              "type": "any"
+            }
+          },
+          "description": "A map of additional read alignment information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
+          "type": "object"
+        },
+        "type": {
           "enumDescriptions": [
             "",
             "A `GENERIC` annotation type should be used when no other annotation\ntype will suffice. This represents an untyped annotation of the reference\ngenome.",
@@ -3628,46 +3434,294 @@
             "A `GENE` annotation type represents the existence of a gene at the\nassociated reference coordinates. The start coordinate is typically the\ngene's transcription start site and the end is typically the end of the\ngene's last exon.",
             "A `TRANSCRIPT` annotation type represents the assertion that a\nparticular region of the reference genome may be transcribed as RNA."
           ],
-          "type": "array",
-          "items": {
-            "enum": [
-              "ANNOTATION_TYPE_UNSPECIFIED",
-              "GENERIC",
-              "VARIANT",
-              "GENE",
-              "TRANSCRIPT"
-            ],
-            "type": "string"
-          }
-        },
-        "pageToken": {
-          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
+          "enum": [
+            "ANNOTATION_TYPE_UNSPECIFIED",
+            "GENERIC",
+            "VARIANT",
+            "GENE",
+            "TRANSCRIPT"
+          ],
+          "description": "The data type for this annotation. Must match the containing annotation\nset's type.",
           "type": "string"
         }
       },
-      "id": "SearchAnnotationSetsRequest"
+      "id": "Annotation",
+      "description": "An annotation describes a region of reference genome. The value of an\nannotation may be one of several canonical types, supplemented by arbitrary\ninfo tags. An annotation is not inherently associated with a specific\nsample or individual (though a client could choose to use annotations in\nthis way). Example canonical annotation types are `GENE` and\n`VARIANT`.",
+      "type": "object"
+    },
+    "CancelOperationRequest": {
+      "description": "The request message for Operations.CancelOperation.",
+      "type": "object",
+      "properties": {},
+      "id": "CancelOperationRequest"
+    },
+    "SearchReadsRequest": {
+      "properties": {
+        "pageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nTo get the next page of results, set this parameter to the value of\n`nextPageToken` from the previous response.",
+          "type": "string"
+        },
+        "pageSize": {
+          "description": "The maximum number of results to return in a single page. If unspecified,\ndefaults to 256. The maximum value is 2048.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "start": {
+          "description": "The start position of the range on the reference, 0-based inclusive. If\nspecified, `referenceName` must also be specified.",
+          "format": "int64",
+          "type": "string"
+        },
+        "referenceName": {
+          "description": "The reference sequence name, for example `chr1`, `1`, or `chrX`. If set to\n`*`, only unmapped reads are returned. If unspecified, all reads (mapped\nand unmapped) are returned.",
+          "type": "string"
+        },
+        "readGroupSetIds": {
+          "description": "The IDs of the read groups sets within which to search for reads. All\nspecified read group sets must be aligned against a common set of reference\nsequences; this defines the genomic coordinates for the query. Must specify\none of `readGroupSetIds` or `readGroupIds`.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "readGroupIds": {
+          "description": "The IDs of the read groups within which to search for reads. All specified\nread groups must belong to the same read group sets. Must specify one of\n`readGroupSetIds` or `readGroupIds`.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "end": {
+          "description": "The end position of the range on the reference, 0-based exclusive. If\nspecified, `referenceName` must also be specified.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "id": "SearchReadsRequest",
+      "description": "The read search request.",
+      "type": "object"
+    },
+    "Operation": {
+      "properties": {
+        "response": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "If importing ReadGroupSets, an ImportReadGroupSetsResponse is returned. If importing Variants, an ImportVariantsResponse is returned. For pipelines and exports, an empty response is returned.",
+          "type": "object"
+        },
+        "name": {
+          "description": "The server-assigned name, which is only unique within the same service that originally returns it. For example&#58; `operations/CJHU7Oi_ChDrveSpBRjfuL-qzoWAgEw`",
+          "type": "string"
+        },
+        "error": {
+          "description": "The error result of the operation in case of failure or cancellation.",
+          "$ref": "Status"
+        },
+        "metadata": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "An OperationMetadata object. This will always be returned with the Operation.",
+          "type": "object"
+        },
+        "done": {
+          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
+          "type": "boolean"
+        }
+      },
+      "id": "Operation",
+      "description": "This resource represents a long-running operation that is the result of a\nnetwork API call.",
+      "type": "object"
+    },
+    "RuntimeMetadata": {
+      "description": "Runtime metadata that will be populated in the\nruntimeMetadata\nfield of the Operation associated with a RunPipeline execution.",
+      "type": "object",
+      "properties": {
+        "computeEngine": {
+          "description": "Execution information specific to Google Compute Engine.",
+          "$ref": "ComputeEngine"
+        }
+      },
+      "id": "RuntimeMetadata"
+    },
+    "ImportReadGroupSetsResponse": {
+      "properties": {
+        "readGroupSetIds": {
+          "description": "IDs of the read group sets that were created.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "ImportReadGroupSetsResponse",
+      "description": "The read group set import response.",
+      "type": "object"
+    },
+    "VariantCall": {
+      "properties": {
+        "phaseset": {
+          "description": "If this field is present, this variant call's genotype ordering implies\nthe phase of the bases and is consistent with any other variant calls in\nthe same reference sequence which have the same phaseset value.\nWhen importing data from VCF, if the genotype data was phased but no\nphase set was specified this field will be set to `*`.",
+          "type": "string"
+        },
+        "info": {
+          "additionalProperties": {
+            "type": "array",
+            "items": {
+              "type": "any"
+            }
+          },
+          "description": "A map of additional variant call information. This must be of the form\nmap\u003cstring, string[]\u003e (string key mapping to a list of string values).",
+          "type": "object"
+        },
+        "callSetName": {
+          "description": "The name of the call set this variant call belongs to.",
+          "type": "string"
+        },
+        "genotypeLikelihood": {
+          "description": "The genotype likelihoods for this variant call. Each array entry\nrepresents how likely a specific genotype is for this call. The value\nordering is defined by the GL tag in the VCF spec.\nIf Phred-scaled genotype likelihood scores (PL) are available and\nlog10(P) genotype likelihood scores (GL) are not, PL scores are converted\nto GL scores.  If both are available, PL scores are stored in `info`.",
+          "type": "array",
+          "items": {
+            "format": "double",
+            "type": "number"
+          }
+        },
+        "callSetId": {
+          "description": "The ID of the call set this variant call belongs to.",
+          "type": "string"
+        },
+        "genotype": {
+          "description": "The genotype of this variant call. Each value represents either the value\nof the `referenceBases` field or a 1-based index into\n`alternateBases`. If a variant had a `referenceBases`\nvalue of `T` and an `alternateBases`\nvalue of `[\"A\", \"C\"]`, and the `genotype` was\n`[2, 1]`, that would mean the call\nrepresented the heterozygous value `CA` for this variant.\nIf the `genotype` was instead `[0, 1]`, the\nrepresented value would be `TA`. Ordering of the\ngenotype values is important if the `phaseset` is present.\nIf a genotype is not called (that is, a `.` is present in the\nGT string) -1 is returned.",
+          "type": "array",
+          "items": {
+            "format": "int32",
+            "type": "integer"
+          }
+        }
+      },
+      "id": "VariantCall",
+      "description": "A call represents the determination of genotype with respect to a particular\nvariant. It may include associated information such as quality and phasing.\nFor example, a call might assign a probability of 0.32 to the occurrence of\na SNP named rs1234 in a call set with the name NA12345.",
+      "type": "object"
+    },
+    "SearchVariantsResponse": {
+      "properties": {
+        "variants": {
+          "description": "The list of matching Variants.",
+          "type": "array",
+          "items": {
+            "$ref": "Variant"
+          }
+        },
+        "nextPageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
+          "type": "string"
+        }
+      },
+      "id": "SearchVariantsResponse",
+      "description": "The variant search response.",
+      "type": "object"
+    },
+    "ListBasesResponse": {
+      "type": "object",
+      "properties": {
+        "sequence": {
+          "description": "A substring of the bases that make up this reference.",
+          "type": "string"
+        },
+        "offset": {
+          "description": "The offset position (0-based) of the given `sequence` from the\nstart of this `Reference`. This value will differ for each page\nin a paginated request.",
+          "format": "int64",
+          "type": "string"
+        },
+        "nextPageToken": {
+          "description": "The continuation token, which is used to page through large result sets.\nProvide this value in a subsequent request to return the next page of\nresults. This field will be empty if there aren't any additional results.",
+          "type": "string"
+        }
+      },
+      "id": "ListBasesResponse"
+    },
+    "Status": {
+      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
+      "type": "object",
+      "properties": {
+        "details": {
+          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
+          "type": "array",
+          "items": {
+            "additionalProperties": {
+              "description": "Properties of the object. Contains field @type with type URL.",
+              "type": "any"
+            },
+            "type": "object"
+          }
+        },
+        "code": {
+          "description": "The status code, which should be an enum value of google.rpc.Code.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "message": {
+          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
+          "type": "string"
+        }
+      },
+      "id": "Status"
+    },
+    "Binding": {
+      "properties": {
+        "members": {
+          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "role": {
+          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
+          "type": "string"
+        }
+      },
+      "id": "Binding",
+      "description": "Associates `members` with a `role`.",
+      "type": "object"
+    },
+    "UndeleteDatasetRequest": {
+      "properties": {},
+      "id": "UndeleteDatasetRequest",
+      "type": "object"
+    },
+    "Range": {
+      "properties": {
+        "start": {
+          "description": "The start position of the range on the reference, 0-based inclusive.",
+          "format": "int64",
+          "type": "string"
+        },
+        "end": {
+          "description": "The end position of the range on the reference, 0-based exclusive.",
+          "format": "int64",
+          "type": "string"
+        },
+        "referenceName": {
+          "description": "The reference sequence name, for example `chr1`,\n`1`, or `chrX`.",
+          "type": "string"
+        }
+      },
+      "id": "Range",
+      "description": "A 0-based half-open genomic coordinate range for search requests.",
+      "type": "object"
     },
     "VariantSet": {
       "description": "A variant set is a collection of call sets and variants. It contains summary\nstatistics of those contents. A variant set belongs to a dataset.\n\nFor more genomics resource definitions, see [Fundamentals of Google\nGenomics](https://cloud.google.com/genomics/fundamentals-of-google-genomics)",
       "type": "object",
       "properties": {
-        "id": {
-          "description": "The server-generated variant set ID, unique across all variant sets.",
+        "name": {
+          "description": "User-specified, mutable name.",
           "type": "string"
         },
-        "description": {
-          "description": "A textual description of this variant set.",
-          "type": "string"
-        },
-        "referenceBounds": {
-          "description": "A list of all references used by the variants in a variant set\nwith associated coordinate upper bounds for each one.",
-          "type": "array",
-          "items": {
-            "$ref": "ReferenceBound"
-          }
-        },
-        "datasetId": {
-          "description": "The dataset to which this variant set belongs.",
+        "referenceSetId": {
+          "description": "The reference set to which the variant set is mapped. The reference set\ndescribes the alignment provenance of the variant set, while the\n`referenceBounds` describe the shape of the actual variant data. The\nreference set's reference names are a superset of those found in the\n`referenceBounds`.\n\nFor example, given a variant set that is mapped to the GRCh38 reference set\nand contains a single variant on reference 'X', `referenceBounds` would\ncontain only an entry for 'X', while the associated reference set\nenumerates all possible references: '1', '2', 'X', 'Y', 'MT', etc.",
           "type": "string"
         },
         "metadata": {
@@ -3677,141 +3731,87 @@
             "$ref": "VariantSetMetadata"
           }
         },
-        "name": {
-          "description": "User-specified, mutable name.",
+        "referenceBounds": {
+          "description": "A list of all references used by the variants in a variant set\nwith associated coordinate upper bounds for each one.",
+          "type": "array",
+          "items": {
+            "$ref": "ReferenceBound"
+          }
+        },
+        "id": {
+          "description": "The server-generated variant set ID, unique across all variant sets.",
           "type": "string"
         },
-        "referenceSetId": {
-          "description": "The reference set to which the variant set is mapped. The reference set\ndescribes the alignment provenance of the variant set, while the\n`referenceBounds` describe the shape of the actual variant data. The\nreference set's reference names are a superset of those found in the\n`referenceBounds`.\n\nFor example, given a variant set that is mapped to the GRCh38 reference set\nand contains a single variant on reference 'X', `referenceBounds` would\ncontain only an entry for 'X', while the associated reference set\nenumerates all possible references: '1', '2', 'X', 'Y', 'MT', etc.",
+        "description": {
+          "description": "A textual description of this variant set.",
+          "type": "string"
+        },
+        "datasetId": {
+          "description": "The dataset to which this variant set belongs.",
           "type": "string"
         }
       },
       "id": "VariantSet"
     },
-    "Position": {
-      "description": "An abstraction for referring to a genomic position, in relation to some\nalready known reference. For now, represents a genomic position as a\nreference name, a base number on that reference (0-based), and a\ndetermination of forward or reverse strand.",
-      "type": "object",
+    "BatchCreateAnnotationsResponse": {
       "properties": {
-        "referenceName": {
-          "description": "The name of the reference in whatever reference set is being used.",
-          "type": "string"
-        },
-        "position": {
-          "description": "The 0-based offset from the start of the forward strand for that reference.",
-          "type": "string",
-          "format": "int64"
-        },
-        "reverseStrand": {
-          "description": "Whether this position is on the reverse strand, as opposed to the forward\nstrand.",
-          "type": "boolean"
+        "entries": {
+          "description": "The resulting per-annotation entries, ordered consistently with the\noriginal request.",
+          "type": "array",
+          "items": {
+            "$ref": "Entry"
+          }
         }
       },
-      "id": "Position"
+      "id": "BatchCreateAnnotationsResponse",
+      "type": "object"
+    },
+    "ReferenceBound": {
+      "description": "ReferenceBound records an upper bound for the starting coordinate of\nvariants in a particular reference.",
+      "type": "object",
+      "properties": {
+        "upperBound": {
+          "description": "An upper bound (inclusive) on the starting coordinate of any\nvariant in the reference sequence.",
+          "format": "int64",
+          "type": "string"
+        },
+        "referenceName": {
+          "description": "The name of the reference associated with this reference bound.",
+          "type": "string"
+        }
+      },
+      "id": "ReferenceBound"
     }
   },
-  "revision": "20170125",
-  "basePath": "",
+  "protocol": "rest",
   "icons": {
     "x32": "http://www.google.com/images/icons/product/search-32.gif",
     "x16": "http://www.google.com/images/icons/product/search-16.gif"
   },
-  "discoveryVersion": "v1",
+  "version": "v1",
   "baseUrl": "https://genomics.googleapis.com/",
-  "name": "genomics",
-  "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/bigquery": {
+          "description": "View and manage your data in Google BigQuery"
+        },
+        "https://www.googleapis.com/auth/devstorage.read_write": {
+          "description": "Manage your data in Google Cloud Storage"
+        },
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        },
+        "https://www.googleapis.com/auth/genomics.readonly": {
+          "description": "View Genomics data"
+        },
+        "https://www.googleapis.com/auth/genomics": {
+          "description": "View and manage Genomics data"
+        }
+      }
     }
   },
-  "documentationLink": "https://cloud.google.com/genomics",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
   "servicePath": "",
-  "ownerName": "Google",
-  "version": "v1",
-  "rootUrl": "https://genomics.googleapis.com/",
+  "description": "Upload, process, query, and search Genomics data in the cloud.",
   "kind": "discovery#restDescription"
 }
diff --git a/genomics/v1/genomics-gen.go b/genomics/v1/genomics-gen.go
index 35780f1..e85c53d 100644
--- a/genomics/v1/genomics-gen.go
+++ b/genomics/v1/genomics-gen.go
@@ -83,9 +83,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Annotations *AnnotationsService
 
@@ -117,6 +118,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAnnotationsService(s *Service) *AnnotationsService {
 	rs := &AnnotationsService{s: s}
 	return rs
@@ -4477,6 +4482,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.batchcreateannotationsrequest)
 	if err != nil {
@@ -4623,6 +4629,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.annotation)
 	if err != nil {
@@ -4746,6 +4753,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/annotations/{annotationId}")
@@ -4883,6 +4891,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5024,6 +5033,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchannotationsrequest)
 	if err != nil {
@@ -5183,6 +5193,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.annotation)
 	if err != nil {
@@ -5333,6 +5344,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.annotationset)
 	if err != nil {
@@ -5456,6 +5468,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/annotationsets/{annotationSetId}")
@@ -5593,6 +5606,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5730,6 +5744,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchannotationsetsrequest)
 	if err != nil {
@@ -5891,6 +5906,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.annotationset)
 	if err != nil {
@@ -6037,6 +6053,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.callset)
 	if err != nil {
@@ -6165,6 +6182,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/callsets/{callSetId}")
@@ -6308,6 +6326,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6459,6 +6478,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.callset)
 	if err != nil {
@@ -6610,6 +6630,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchcallsetsrequest)
 	if err != nil {
@@ -6760,6 +6781,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dataset)
 	if err != nil {
@@ -6895,6 +6917,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/datasets/{datasetId}")
@@ -7038,6 +7061,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7182,6 +7206,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.getiampolicyrequest)
 	if err != nil {
@@ -7357,6 +7382,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7534,6 +7560,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.dataset)
 	if err != nil {
@@ -7688,6 +7715,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -7836,6 +7864,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -7983,6 +8012,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.undeletedatasetrequest)
 	if err != nil {
@@ -8122,6 +8152,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.canceloperationrequest)
 	if err != nil {
@@ -8271,6 +8302,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8454,6 +8486,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8627,6 +8660,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/readgroupsets/{readGroupSetId}")
@@ -8769,6 +8803,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.exportreadgroupsetrequest)
 	if err != nil {
@@ -8921,6 +8956,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9075,6 +9111,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.importreadgroupsetsrequest)
 	if err != nil {
@@ -9222,6 +9259,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.readgroupset)
 	if err != nil {
@@ -9373,6 +9411,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchreadgroupsetsrequest)
 	if err != nil {
@@ -9610,6 +9649,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9833,6 +9873,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchreadsrequest)
 	if err != nil {
@@ -9999,6 +10040,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10140,6 +10182,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchreferencesrequest)
 	if err != nil {
@@ -10342,6 +10385,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10538,6 +10582,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10680,6 +10725,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchreferencesetsrequest)
 	if err != nil {
@@ -10830,6 +10876,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.variant)
 	if err != nil {
@@ -10958,6 +11005,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/variants/{variantId}")
@@ -11101,6 +11149,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11259,6 +11308,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.importvariantsrequest)
 	if err != nil {
@@ -11484,6 +11534,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.mergevariantsrequest)
 	if err != nil {
@@ -11628,6 +11679,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.variant)
 	if err != nil {
@@ -11779,6 +11831,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchvariantsrequest)
 	if err != nil {
@@ -11935,6 +11988,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.variantset)
 	if err != nil {
@@ -12065,6 +12119,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/variantsets/{variantSetId}")
@@ -12199,6 +12254,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.exportvariantsetrequest)
 	if err != nil {
@@ -12351,6 +12407,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12504,6 +12561,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.variantset)
 	if err != nil {
@@ -12656,6 +12714,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchvariantsetsrequest)
 	if err != nil {
diff --git a/genomics/v1alpha2/genomics-api.json b/genomics/v1alpha2/genomics-api.json
index e151afc..5f62b15 100644
--- a/genomics/v1alpha2/genomics-api.json
+++ b/genomics/v1alpha2/genomics-api.json
@@ -1,442 +1,67 @@
 {
-  "id": "genomics:v1alpha2",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        },
-        "https://www.googleapis.com/auth/genomics": {
-          "description": "View and manage Genomics data"
-        },
-        "https://www.googleapis.com/auth/compute": {
-          "description": "View and manage your Google Compute Engine resources"
-        }
-      }
-    }
-  },
-  "description": "Upload, process, query, and search Genomics data in the cloud.",
-  "protocol": "rest",
-  "title": "Genomics API",
-  "resources": {
-    "pipelines": {
-      "methods": {
-        "getControllerConfig": {
-          "id": "genomics.pipelines.getControllerConfig",
-          "response": {
-            "$ref": "ControllerConfig"
-          },
-          "parameterOrder": [],
-          "description": "Gets controller configuration information. Should only be called\nby VMs created by the Pipelines Service and not by end users.",
-          "flatPath": "v1alpha2/pipelines:getControllerConfig",
-          "httpMethod": "GET",
-          "parameters": {
-            "operationId": {
-              "description": "The operation to retrieve controller configuration for.",
-              "location": "query",
-              "type": "string"
-            },
-            "validationToken": {
-              "location": "query",
-              "type": "string",
-              "format": "uint64"
-            }
-          },
-          "path": "v1alpha2/pipelines:getControllerConfig",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "run": {
-          "id": "genomics.pipelines.run",
-          "response": {
-            "$ref": "Operation"
-          },
-          "parameterOrder": [],
-          "description": "Runs a pipeline. If `pipelineId` is specified in the request, then\nrun a saved pipeline. If `ephemeralPipeline` is specified, then run\nthat pipeline once without saving a copy.\n\nThe caller must have READ permission to the project where the pipeline\nis stored and WRITE permission to the project where the pipeline will be\nrun, as VMs will be created and storage will be used.\n\nIf a pipeline operation is still running after 6 days, it will be canceled.",
-          "request": {
-            "$ref": "RunPipelineRequest"
-          },
-          "flatPath": "v1alpha2/pipelines:run",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1alpha2/pipelines:run",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/compute",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "setOperationStatus": {
-          "id": "genomics.pipelines.setOperationStatus",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [],
-          "description": "Sets status of a given operation. Any new timestamps (as determined by\ndescription) are appended to TimestampEvents. Should only be called by VMs\ncreated by the Pipelines Service and not by end users.",
-          "request": {
-            "$ref": "SetOperationStatusRequest"
-          },
-          "flatPath": "v1alpha2/pipelines:setOperationStatus",
-          "httpMethod": "PUT",
-          "parameters": {},
-          "path": "v1alpha2/pipelines:setOperationStatus",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "list": {
-          "id": "genomics.pipelines.list",
-          "response": {
-            "$ref": "ListPipelinesResponse"
-          },
-          "parameterOrder": [],
-          "description": "Lists pipelines.\n\nCaller must have READ permission to the project.",
-          "flatPath": "v1alpha2/pipelines",
-          "httpMethod": "GET",
-          "parameters": {
-            "pageSize": {
-              "description": "Number of pipelines to return at once. Defaults to 256, and max\nis 2048.",
-              "location": "query",
-              "type": "integer",
-              "format": "int32"
-            },
-            "projectId": {
-              "description": "Required. The name of the project to search for pipelines. Caller\nmust have READ access to this project.",
-              "location": "query",
-              "type": "string"
-            },
-            "namePrefix": {
-              "description": "Pipelines with names that match this prefix should be\nreturned.  If unspecified, all pipelines in the project, up to\n`pageSize`, will be returned.",
-              "location": "query",
-              "type": "string"
-            },
-            "pageToken": {
-              "description": "Token to use to indicate where to start getting results.\nIf unspecified, returns the first page of results.",
-              "location": "query",
-              "type": "string"
-            }
-          },
-          "path": "v1alpha2/pipelines",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "get": {
-          "id": "genomics.pipelines.get",
-          "response": {
-            "$ref": "Pipeline"
-          },
-          "parameterOrder": [
-            "pipelineId"
-          ],
-          "description": "Retrieves a pipeline based on ID.\n\nCaller must have READ permission to the project.",
-          "flatPath": "v1alpha2/pipelines/{pipelineId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "pipelineId": {
-              "description": "Caller must have READ access to the project in which this pipeline\nis defined.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1alpha2/pipelines/{pipelineId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "create": {
-          "id": "genomics.pipelines.create",
-          "response": {
-            "$ref": "Pipeline"
-          },
-          "parameterOrder": [],
-          "description": "Creates a pipeline that can be run later. Create takes a Pipeline that\nhas all fields other than `pipelineId` populated, and then returns\nthe same pipeline with `pipelineId` populated. This id can be used\nto run the pipeline.\n\nCaller must have WRITE permission to the project.",
-          "request": {
-            "$ref": "Pipeline"
-          },
-          "flatPath": "v1alpha2/pipelines",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1alpha2/pipelines",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "delete": {
-          "id": "genomics.pipelines.delete",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [
-            "pipelineId"
-          ],
-          "description": "Deletes a pipeline based on ID.\n\nCaller must have WRITE permission to the project.",
-          "flatPath": "v1alpha2/pipelines/{pipelineId}",
-          "httpMethod": "DELETE",
-          "parameters": {
-            "pipelineId": {
-              "description": "Caller must have WRITE access to the project in which this pipeline\nis defined.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1alpha2/pipelines/{pipelineId}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        }
-      }
-    },
-    "operations": {
-      "methods": {
-        "get": {
-          "id": "genomics.operations.get",
-          "response": {
-            "$ref": "Operation"
-          },
-          "parameterOrder": [
-            "name"
-          ],
-          "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice.",
-          "flatPath": "v1alpha2/operations/{operationsId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "name": {
-              "description": "The name of the operation resource.",
-              "required": true,
-              "pattern": "^operations/.+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1alpha2/{+name}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "list": {
-          "id": "genomics.operations.list",
-          "response": {
-            "$ref": "ListOperationsResponse"
-          },
-          "parameterOrder": [
-            "name"
-          ],
-          "description": "Lists operations that match the specified filter in the request.",
-          "flatPath": "v1alpha2/operations",
-          "httpMethod": "GET",
-          "parameters": {
-            "pageSize": {
-              "description": "The maximum number of results to return. If unspecified, defaults to\n256. The maximum value is 2048.",
-              "location": "query",
-              "type": "integer",
-              "format": "int32"
-            },
-            "filter": {
-              "description": "A string for filtering Operations.\nThe following filter fields are supported&#58;\n\n* projectId&#58; Required. Corresponds to\n  OperationMetadata.projectId.\n* createTime&#58; The time this job was created, in seconds from the\n  [epoch](http://en.wikipedia.org/wiki/Unix_time). Can use `\u003e=` and/or `\u003c=`\n  operators.\n* status&#58; Can be `RUNNING`, `SUCCESS`, `FAILURE`, or `CANCELED`. Only\n  one status may be specified.\n* labels.key where key is a label key.\n\nExamples&#58;\n\n* `projectId = my-project AND createTime \u003e= 1432140000`\n* `projectId = my-project AND createTime \u003e= 1432140000 AND createTime \u003c= 1432150000 AND status = RUNNING`\n* `projectId = my-project AND labels.color = *`\n* `projectId = my-project AND labels.color = red`",
-              "location": "query",
-              "type": "string"
-            },
-            "name": {
-              "description": "The name of the operation collection.",
-              "required": true,
-              "pattern": "^operations$",
-              "location": "path",
-              "type": "string"
-            },
-            "pageToken": {
-              "description": "The standard list page token.",
-              "location": "query",
-              "type": "string"
-            }
-          },
-          "path": "v1alpha2/{+name}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        },
-        "cancel": {
-          "id": "genomics.operations.cancel",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [
-            "name"
-          ],
-          "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. Clients may use Operations.GetOperation or Operations.ListOperations to check whether the cancellation succeeded or the operation completed despite cancellation.",
-          "request": {
-            "$ref": "CancelOperationRequest"
-          },
-          "flatPath": "v1alpha2/operations/{operationsId}:cancel",
-          "httpMethod": "POST",
-          "parameters": {
-            "name": {
-              "description": "The name of the operation resource to be cancelled.",
-              "required": true,
-              "pattern": "^operations/.+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1alpha2/{+name}:cancel",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/genomics"
-          ]
-        }
-      }
-    }
-  },
   "schemas": {
-    "SetOperationStatusRequest": {
-      "description": "Request to set operation status. Should only be used by VMs\ncreated by the Pipelines Service and not by end users.",
+    "LoggingOptions": {
+      "id": "LoggingOptions",
+      "description": "The logging options for the pipeline run.",
       "type": "object",
       "properties": {
-        "operationId": {
-          "type": "string"
-        },
-        "validationToken": {
-          "type": "string",
-          "format": "uint64"
-        },
-        "timestampEvents": {
-          "type": "array",
-          "items": {
-            "$ref": "TimestampEvent"
-          }
-        },
-        "errorCode": {
-          "enum": [
-            "OK",
-            "CANCELLED",
-            "UNKNOWN",
-            "INVALID_ARGUMENT",
-            "DEADLINE_EXCEEDED",
-            "NOT_FOUND",
-            "ALREADY_EXISTS",
-            "PERMISSION_DENIED",
-            "UNAUTHENTICATED",
-            "RESOURCE_EXHAUSTED",
-            "FAILED_PRECONDITION",
-            "ABORTED",
-            "OUT_OF_RANGE",
-            "UNIMPLEMENTED",
-            "INTERNAL",
-            "UNAVAILABLE",
-            "DATA_LOSS"
-          ],
-          "enumDescriptions": [
-            "Not an error; returned on success\n\nHTTP Mapping: 200 OK",
-            "The operation was cancelled, typically by the caller.\n\nHTTP Mapping: 499 Client Closed Request",
-            "Unknown error.  For example, this error may be returned when\na `Status` value received from another address space belongs to\nan error space that is not known in this address space.  Also\nerrors raised by APIs that do not return enough error information\nmay be converted to this error.\n\nHTTP Mapping: 500 Internal Server Error",
-            "The client specified an invalid argument.  Note that this differs\nfrom `FAILED_PRECONDITION`.  `INVALID_ARGUMENT` indicates arguments\nthat are problematic regardless of the state of the system\n(e.g., a malformed file name).\n\nHTTP Mapping: 400 Bad Request",
-            "The deadline expired before the operation could complete. For operations\nthat change the state of the system, this error may be returned\neven if the operation has completed successfully.  For example, a\nsuccessful response from a server could have been delayed long\nenough for the deadline to expire.\n\nHTTP Mapping: 504 Gateway Timeout",
-            "Some requested entity (e.g., file or directory) was not found.\n\nNote to server developers: if a request is denied for an entire class\nof users, such as gradual feature rollout or undocumented whitelist,\n`NOT_FOUND` may be used. If a request is denied for some users within\na class of users, such as user-based access control, `PERMISSION_DENIED`\nmust be used.\n\nHTTP Mapping: 404 Not Found",
-            "The entity that a client attempted to create (e.g., file or directory)\nalready exists.\n\nHTTP Mapping: 409 Conflict",
-            "The caller does not have permission to execute the specified\noperation. `PERMISSION_DENIED` must not be used for rejections\ncaused by exhausting some resource (use `RESOURCE_EXHAUSTED`\ninstead for those errors). `PERMISSION_DENIED` must not be\nused if the caller can not be identified (use `UNAUTHENTICATED`\ninstead for those errors). This error code does not imply the\nrequest is valid or the requested entity exists or satisfies\nother pre-conditions.\n\nHTTP Mapping: 403 Forbidden",
-            "The request does not have valid authentication credentials for the\noperation.\n\nHTTP Mapping: 401 Unauthorized",
-            "Some resource has been exhausted, perhaps a per-user quota, or\nperhaps the entire file system is out of space.\n\nHTTP Mapping: 429 Too Many Requests",
-            "The operation was rejected because the system is not in a state\nrequired for the operation's execution.  For example, the directory\nto be deleted is non-empty, an rmdir operation is applied to\na non-directory, etc.\n\nService implementors can use the following guidelines to decide\nbetween `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`:\n (a) Use `UNAVAILABLE` if the client can retry just the failing call.\n (b) Use `ABORTED` if the client should retry at a higher level\n     (e.g., restarting a read-modify-write sequence).\n (c) Use `FAILED_PRECONDITION` if the client should not retry until\n     the system state has been explicitly fixed.  E.g., if an \"rmdir\"\n     fails because the directory is non-empty, `FAILED_PRECONDITION`\n     should be returned since the client should not retry unless\n     the files are deleted from the directory.\n\nHTTP Mapping: 400 Bad Request",
-            "The operation was aborted, typically due to a concurrency issue such as\na sequencer check failure or transaction abort.\n\nSee the guidelines above for deciding between `FAILED_PRECONDITION`,\n`ABORTED`, and `UNAVAILABLE`.\n\nHTTP Mapping: 409 Conflict",
-            "The operation was attempted past the valid range.  E.g., seeking or\nreading past end-of-file.\n\nUnlike `INVALID_ARGUMENT`, this error indicates a problem that may\nbe fixed if the system state changes. For example, a 32-bit file\nsystem will generate `INVALID_ARGUMENT` if asked to read at an\noffset that is not in the range [0,2^32-1], but it will generate\n`OUT_OF_RANGE` if asked to read from an offset past the current\nfile size.\n\nThere is a fair bit of overlap between `FAILED_PRECONDITION` and\n`OUT_OF_RANGE`.  We recommend using `OUT_OF_RANGE` (the more specific\nerror) when it applies so that callers who are iterating through\na space can easily look for an `OUT_OF_RANGE` error to detect when\nthey are done.\n\nHTTP Mapping: 400 Bad Request",
-            "The operation is not implemented or is not supported/enabled in this\nservice.\n\nHTTP Mapping: 501 Not Implemented",
-            "Internal errors.  This means that some invariants expected by the\nunderlying system have been broken.  This error code is reserved\nfor serious errors.\n\nHTTP Mapping: 500 Internal Server Error",
-            "The service is currently unavailable.  This is most likely a\ntransient condition, which can be corrected by retrying with\na backoff.\n\nSee the guidelines above for deciding between `FAILED_PRECONDITION`,\n`ABORTED`, and `UNAVAILABLE`.\n\nHTTP Mapping: 503 Service Unavailable",
-            "Unrecoverable data loss or corruption.\n\nHTTP Mapping: 500 Internal Server Error"
-          ],
-          "type": "string"
-        },
-        "errorMessage": {
+        "gcsPath": {
+          "description": "The location in Google Cloud Storage to which the pipeline logs\nwill be copied. Can be specified as a fully qualified directory\npath, in which case logs will be output with a unique identifier\nas the filename in that directory, or as a fully specified path,\nwhich must end in `.log`, in which case that path will be\nused, and the user must ensure that logs are not\noverwritten. Stdout and stderr logs from the run are also\ngenerated and output as `-stdout.log` and `-stderr.log`.",
           "type": "string"
         }
-      },
-      "id": "SetOperationStatusRequest"
+      }
     },
-    "Status": {
-      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
+    "RunPipelineRequest": {
+      "description": "The request to run a pipeline. If `pipelineId` is specified, it\nrefers to a saved pipeline created with CreatePipeline and set as\nthe `pipelineId` of the returned Pipeline object. If\n`ephemeralPipeline` is specified, that pipeline is run once\nwith the given args and not saved. It is an error to specify both\n`pipelineId` and `ephemeralPipeline`. `pipelineArgs`\nmust be specified.",
       "type": "object",
       "properties": {
-        "code": {
-          "description": "The status code, which should be an enum value of google.rpc.Code.",
-          "type": "integer",
-          "format": "int32"
+        "pipelineArgs": {
+          "description": "The arguments to use when running this pipeline.",
+          "$ref": "RunPipelineArgs"
         },
-        "details": {
-          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
-          "type": "array",
-          "items": {
-            "additionalProperties": {
-              "description": "Properties of the object. Contains field @type with type URL.",
-              "type": "any"
-            },
-            "type": "object"
-          }
-        },
-        "message": {
-          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
+        "pipelineId": {
+          "description": "The already created pipeline to run.",
           "type": "string"
+        },
+        "ephemeralPipeline": {
+          "$ref": "Pipeline",
+          "description": "A new pipeline object to run once and then delete."
         }
       },
-      "id": "Status"
+      "id": "RunPipelineRequest"
     },
-    "OperationEvent": {
-      "description": "An event that occurred during an Operation.",
+    "CancelOperationRequest": {
+      "description": "The request message for Operations.CancelOperation.",
       "type": "object",
-      "properties": {
-        "description": {
-          "description": "Required description of event.",
-          "type": "string"
-        },
-        "startTime": {
-          "description": "Optional time of when event started.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "endTime": {
-          "description": "Optional time of when event finished. An event can have a start time and no\nfinish time. If an event has a finish time, there must be a start time.",
-          "type": "string",
-          "format": "google-datetime"
-        }
-      },
-      "id": "OperationEvent"
+      "properties": {},
+      "id": "CancelOperationRequest"
     },
     "Operation": {
       "description": "This resource represents a long-running operation that is the result of a\nnetwork API call.",
       "type": "object",
       "properties": {
         "error": {
-          "description": "The error result of the operation in case of failure or cancellation.",
-          "$ref": "Status"
-        },
-        "done": {
-          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
-          "type": "boolean"
+          "$ref": "Status",
+          "description": "The error result of the operation in case of failure or cancellation."
         },
         "metadata": {
-          "description": "An OperationMetadata object. This will always be returned with the Operation.",
           "additionalProperties": {
             "description": "Properties of the object. Contains field @type with type URL.",
             "type": "any"
           },
+          "description": "An OperationMetadata object. This will always be returned with the Operation.",
           "type": "object"
         },
+        "done": {
+          "type": "boolean",
+          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable."
+        },
         "response": {
-          "description": "If importing ReadGroupSets, an ImportReadGroupSetsResponse is returned. If importing Variants, an ImportVariantsResponse is returned. For pipelines and exports, an empty response is returned.",
           "additionalProperties": {
             "description": "Properties of the object. Contains field @type with type URL.",
             "type": "any"
           },
+          "description": "If importing ReadGroupSets, an ImportReadGroupSetsResponse is returned. If importing Variants, an ImportVariantsResponse is returned. For pipelines and exports, an empty response is returned.",
           "type": "object"
         },
         "name": {
@@ -446,224 +71,16 @@
       },
       "id": "Operation"
     },
-    "DockerExecutor": {
-      "description": "The Docker execuctor specification.",
+    "RuntimeMetadata": {
+      "description": "Runtime metadata that will be populated in the\nruntimeMetadata\nfield of the Operation associated with a RunPipeline execution.",
       "type": "object",
       "properties": {
-        "imageName": {
-          "description": "Required. Image name from either Docker Hub or Google Container Registry.\nUsers that run pipelines must have READ access to the image.",
-          "type": "string"
-        },
-        "cmd": {
-          "description": "Required. The command or newline delimited script to run. The command\nstring will be executed within a bash shell.\n\nIf the command exits with a non-zero exit code, output parameter\nde-localization will be skipped and the pipeline operation's\n`error` field will be populated.\n\nMaximum command string length is 16384.",
-          "type": "string"
+        "computeEngine": {
+          "$ref": "ComputeEngine",
+          "description": "Execution information specific to Google Compute Engine."
         }
       },
-      "id": "DockerExecutor"
-    },
-    "ComputeEngine": {
-      "description": "Describes a Compute Engine resource that is being managed by a running\npipeline.",
-      "type": "object",
-      "properties": {
-        "instanceName": {
-          "description": "The instance on which the operation is running.",
-          "type": "string"
-        },
-        "machineType": {
-          "description": "The machine type of the instance.",
-          "type": "string"
-        },
-        "zone": {
-          "description": "The availability zone in which the instance resides.",
-          "type": "string"
-        },
-        "diskNames": {
-          "description": "The names of the disks that were created for this pipeline.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "ComputeEngine"
-    },
-    "PipelineResources": {
-      "description": "The system resources for the pipeline run.",
-      "type": "object",
-      "properties": {
-        "minimumCpuCores": {
-          "description": "The minimum number of cores to use. Defaults to 1.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "disks": {
-          "description": "Disks to attach.",
-          "type": "array",
-          "items": {
-            "$ref": "Disk"
-          }
-        },
-        "preemptible": {
-          "description": "Whether to use preemptible VMs. Defaults to `false`. In order to use this,\nmust be true for both create time and run time. Cannot be true at run time\nif false at create time.",
-          "type": "boolean"
-        },
-        "minimumRamGb": {
-          "description": "The minimum amount of RAM to use. Defaults to 3.75 (GB)",
-          "type": "number",
-          "format": "double"
-        },
-        "zones": {
-          "description": "List of Google Compute Engine availability zones to which resource\ncreation will restricted. If empty, any zone may be chosen.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "noAddress": {
-          "description": "Whether to assign an external IP to the instance. This is an experimental\nfeature that may go away. Defaults to false.\nCorresponds to `--no_address` flag for [gcloud compute instances create]\n(https://cloud.google.com/sdk/gcloud/reference/compute/instances/create).\nIn order to use this, must be true for both create time and run time.\nCannot be true at run time if false at create time. If you need to ssh into\na private IP VM for debugging, you can ssh to a public VM and then ssh into\nthe private VM's Internal IP.  If noAddress is set, this pipeline run may\nonly load docker images from Google Container Registry and not Docker Hub.\n** Note: To use this option, your project must be in Google Access for\nPrivate IPs Early Access Program.**",
-          "type": "boolean"
-        },
-        "bootDiskSizeGb": {
-          "description": "The size of the boot disk. Defaults to 10 (GB).",
-          "type": "integer",
-          "format": "int32"
-        }
-      },
-      "id": "PipelineResources"
-    },
-    "RepeatedString": {
-      "type": "object",
-      "properties": {
-        "values": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "RepeatedString"
-    },
-    "LoggingOptions": {
-      "description": "The logging options for the pipeline run.",
-      "type": "object",
-      "properties": {
-        "gcsPath": {
-          "description": "The location in Google Cloud Storage to which the pipeline logs\nwill be copied. Can be specified as a fully qualified directory\npath, in which case logs will be output with a unique identifier\nas the filename in that directory, or as a fully specified path,\nwhich must end in `.log`, in which case that path will be\nused, and the user must ensure that logs are not\noverwritten. Stdout and stderr logs from the run are also\ngenerated and output as `-stdout.log` and `-stderr.log`.",
-          "type": "string"
-        }
-      },
-      "id": "LoggingOptions"
-    },
-    "ListPipelinesResponse": {
-      "description": "The response of ListPipelines. Contains at most `pageSize`\npipelines. If it contains `pageSize` pipelines, and more pipelines\nexist, then `nextPageToken` will be populated and should be\nused as the `pageToken` argument to a subsequent ListPipelines\nrequest.",
-      "type": "object",
-      "properties": {
-        "pipelines": {
-          "description": "The matched pipelines.",
-          "type": "array",
-          "items": {
-            "$ref": "Pipeline"
-          }
-        },
-        "nextPageToken": {
-          "description": "The token to use to get the next page of results.",
-          "type": "string"
-        }
-      },
-      "id": "ListPipelinesResponse"
-    },
-    "RunPipelineArgs": {
-      "description": "The pipeline run arguments.",
-      "type": "object",
-      "properties": {
-        "clientId": {
-          "description": "This field is deprecated. Use `labels` instead. Client-specified pipeline\noperation identifier.",
-          "type": "string"
-        },
-        "resources": {
-          "description": "Specifies resource requirements/overrides for the pipeline run.",
-          "$ref": "PipelineResources"
-        },
-        "outputs": {
-          "description": "Pipeline output arguments; keys are defined in the pipeline\ndocumentation.  All output parameters of without default values\nmust be specified.  If parameters with defaults are specified\nhere, the defaults will be overridden.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "serviceAccount": {
-          "description": "The Google Cloud Service Account that will be used to access data and\nservices. By default, the compute service account associated with\n`projectId` is used.",
-          "$ref": "ServiceAccount"
-        },
-        "labels": {
-          "description": "Labels to apply to this pipeline run. Labels will also be applied to\ncompute resources (VM, disks) created by this pipeline run. When listing\noperations, operations can filtered by labels.\nLabel keys may not be empty; label values may be empty. Non-empty labels\nmust be 1-63 characters long, and comply with [RFC1035]\n(https://www.ietf.org/rfc/rfc1035.txt).\nSpecifically, the name must be 1-63 characters long and match the regular\nexpression `[a-z]([-a-z0-9]*[a-z0-9])?` which means the first\ncharacter must be a lowercase letter, and all following characters must be\na dash, lowercase letter, or digit, except the last character, which cannot\nbe a dash.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "logging": {
-          "description": "Required. Logging options. Used by the service to communicate results\nto the user.",
-          "$ref": "LoggingOptions"
-        },
-        "inputs": {
-          "description": "Pipeline input arguments; keys are defined in the pipeline documentation.\nAll input parameters that do not have default values  must be specified.\nIf parameters with defaults are specified here, the defaults will be\noverridden.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "keepVmAliveOnFailureDuration": {
-          "description": "How long to keep the VM up after a failure (for example docker command\nfailed, copying input or output files failed, etc). While the VM is up, one\ncan ssh into the VM to debug. Default is 0; maximum allowed value is 1 day.",
-          "type": "string",
-          "format": "google-duration"
-        },
-        "projectId": {
-          "description": "Required. The project in which to run the pipeline. The caller must have\nWRITER access to all Google Cloud services and resources (e.g. Google\nCompute Engine) will be used.",
-          "type": "string"
-        }
-      },
-      "id": "RunPipelineArgs"
-    },
-    "TimestampEvent": {
-      "description": "Stores the list of events and times they occured for major events in job\nexecution.",
-      "type": "object",
-      "properties": {
-        "description": {
-          "description": "String indicating the type of event",
-          "type": "string"
-        },
-        "timestamp": {
-          "description": "The time this event occured.",
-          "type": "string",
-          "format": "google-datetime"
-        }
-      },
-      "id": "TimestampEvent"
-    },
-    "CancelOperationRequest": {
-      "description": "The request message for Operations.CancelOperation.",
-      "type": "object",
-      "properties": {},
-      "id": "CancelOperationRequest"
-    },
-    "ListOperationsResponse": {
-      "description": "The response message for Operations.ListOperations.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "The standard List next-page token.",
-          "type": "string"
-        },
-        "operations": {
-          "description": "A list of operations that matches the specified filter in the request.",
-          "type": "array",
-          "items": {
-            "$ref": "Operation"
-          }
-        }
-      },
-      "id": "ListOperationsResponse"
+      "id": "RuntimeMetadata"
     },
     "ImportReadGroupSetsResponse": {
       "description": "The read group set import response.",
@@ -679,271 +96,32 @@
       },
       "id": "ImportReadGroupSetsResponse"
     },
-    "OperationMetadata": {
-      "description": "Metadata describing an Operation.",
+    "Status": {
+      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
       "type": "object",
       "properties": {
-        "clientId": {
-          "description": "This field is deprecated. Use `labels` instead. Optionally provided by the\ncaller when submitting the request that creates the operation.",
+        "message": {
+          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
           "type": "string"
         },
-        "request": {
-          "description": "The original request that started the operation. Note that this will be in\ncurrent version of the API. If the operation was started with v1beta2 API\nand a GetOperation is performed on v1 API, a v1 request will be returned.",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        },
-        "events": {
-          "description": "Optional event messages that were generated during the job's execution.\nThis also contains any warnings that were generated during import\nor export.",
+        "details": {
+          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
           "type": "array",
           "items": {
-            "$ref": "OperationEvent"
+            "type": "object",
+            "additionalProperties": {
+              "description": "Properties of the object. Contains field @type with type URL.",
+              "type": "any"
+            }
           }
         },
-        "endTime": {
-          "description": "The time at which the job stopped running.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "labels": {
-          "description": "Optionally provided by the caller when submitting the request that creates\nthe operation.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "createTime": {
-          "description": "The time at which the job was submitted to the Genomics service.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "runtimeMetadata": {
-          "description": "Runtime metadata on this Operation.",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        },
-        "startTime": {
-          "description": "The time at which the job began to run.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "projectId": {
-          "description": "The Google Cloud Project in which the job is scoped.",
-          "type": "string"
+        "code": {
+          "description": "The status code, which should be an enum value of google.rpc.Code.",
+          "format": "int32",
+          "type": "integer"
         }
       },
-      "id": "OperationMetadata"
-    },
-    "Empty": {
-      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
-      "type": "object",
-      "properties": {},
-      "id": "Empty"
-    },
-    "RunPipelineRequest": {
-      "description": "The request to run a pipeline. If `pipelineId` is specified, it\nrefers to a saved pipeline created with CreatePipeline and set as\nthe `pipelineId` of the returned Pipeline object. If\n`ephemeralPipeline` is specified, that pipeline is run once\nwith the given args and not saved. It is an error to specify both\n`pipelineId` and `ephemeralPipeline`. `pipelineArgs`\nmust be specified.",
-      "type": "object",
-      "properties": {
-        "pipelineId": {
-          "description": "The already created pipeline to run.",
-          "type": "string"
-        },
-        "ephemeralPipeline": {
-          "description": "A new pipeline object to run once and then delete.",
-          "$ref": "Pipeline"
-        },
-        "pipelineArgs": {
-          "description": "The arguments to use when running this pipeline.",
-          "$ref": "RunPipelineArgs"
-        }
-      },
-      "id": "RunPipelineRequest"
-    },
-    "PipelineParameter": {
-      "description": "Parameters facilitate setting and delivering data into the\npipeline's execution environment. They are defined at create time,\nwith optional defaults, and can be overridden at run time.\n\nIf `localCopy` is unset, then the parameter specifies a string that\nis passed as-is into the pipeline, as the value of the environment\nvariable with the given name.  A default value can be optionally\nspecified at create time. The default can be overridden at run time\nusing the inputs map. If no default is given, a value must be\nsupplied at runtime.\n\nIf `localCopy` is defined, then the parameter specifies a data\nsource or sink, both in Google Cloud Storage and on the Docker container\nwhere the pipeline computation is run. The service account associated with\nthe Pipeline (by\ndefault the project's Compute Engine service account) must have access to the\nGoogle Cloud Storage paths.\n\nAt run time, the Google Cloud Storage paths can be overridden if a default\nwas provided at create time, or must be set otherwise. The pipeline runner\nshould add a key/value pair to either the inputs or outputs map. The\nindicated data copies will be carried out before/after pipeline execution,\njust as if the corresponding arguments were provided to `gsutil cp`.\n\nFor example: Given the following `PipelineParameter`, specified\nin the `inputParameters` list:\n\n```\n{name: \"input_file\", localCopy: {path: \"file.txt\", disk: \"pd1\"}}\n```\n\nwhere `disk` is defined in the `PipelineResources` object as:\n\n```\n{name: \"pd1\", mountPoint: \"/mnt/disk/\"}\n```\n\nWe create a disk named `pd1`, mount it on the host VM, and map\n`/mnt/pd1` to `/mnt/disk` in the docker container.  At\nruntime, an entry for `input_file` would be required in the inputs\nmap, such as:\n\n```\n  inputs[\"input_file\"] = \"gs://my-bucket/bar.txt\"\n```\n\nThis would generate the following gsutil call:\n\n```\n  gsutil cp gs://my-bucket/bar.txt /mnt/pd1/file.txt\n```\n\nThe file `/mnt/pd1/file.txt` maps to `/mnt/disk/file.txt` in the\nDocker container. Acceptable paths are:\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\u003cth\u003eGoogle Cloud storage path\u003c/th\u003e\u003cth\u003eLocal path\u003c/th\u003e\u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\u003ctd\u003efile\u003c/td\u003e\u003ctd\u003efile\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003eglob\u003c/td\u003e\u003ctd\u003edirectory\u003c/td\u003e\u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\nFor outputs, the direction of the copy is reversed:\n\n```\n  gsutil cp /mnt/disk/file.txt gs://my-bucket/bar.txt\n```\n\nAcceptable paths are:\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\u003cth\u003eLocal path\u003c/th\u003e\u003cth\u003eGoogle Cloud Storage path\u003c/th\u003e\u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\u003ctd\u003efile\u003c/td\u003e\u003ctd\u003efile\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003efile\u003c/td\u003e\n      \u003ctd\u003edirectory - directory must already exist\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eglob\u003c/td\u003e\n      \u003ctd\u003edirectory - directory will be created if it doesn't exist\u003c/td\u003e\u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\nOne restriction due to docker limitations, is that for outputs that are found\non the boot disk, the local path cannot be a glob and must be a file.",
-      "type": "object",
-      "properties": {
-        "description": {
-          "description": "Human-readable description.",
-          "type": "string"
-        },
-        "defaultValue": {
-          "description": "The default value for this parameter. Can be overridden at runtime.\nIf `localCopy` is present, then this must be a Google Cloud Storage path\nbeginning with `gs://`.",
-          "type": "string"
-        },
-        "localCopy": {
-          "description": "If present, this parameter is marked for copying to and from the VM.\n`LocalCopy` indicates where on the VM the file should be. The value\ngiven to this parameter (either at runtime or using `defaultValue`)\nmust be the remote path where the file should be.",
-          "$ref": "LocalCopy"
-        },
-        "name": {
-          "description": "Required. Name of the parameter - the pipeline runner uses this string\nas the key to the input and output maps in RunPipeline.",
-          "type": "string"
-        }
-      },
-      "id": "PipelineParameter"
-    },
-    "Disk": {
-      "description": "A Google Compute Engine disk resource specification.",
-      "type": "object",
-      "properties": {
-        "mountPoint": {
-          "description": "Required at create time and cannot be overridden at run time.\nSpecifies the path in the docker container where files on\nthis disk should be located. For example, if `mountPoint`\nis `/mnt/disk`, and the parameter has `localPath`\n`inputs/file.txt`, the docker container can access the data at\n`/mnt/disk/inputs/file.txt`.",
-          "type": "string"
-        },
-        "source": {
-          "description": "The full or partial URL of the persistent disk to attach. See\nhttps://cloud.google.com/compute/docs/reference/latest/instances#resource\nand\nhttps://cloud.google.com/compute/docs/disks/persistent-disks#snapshots\nfor more details.",
-          "type": "string"
-        },
-        "autoDelete": {
-          "description": "Deprecated. Disks created by the Pipelines API will be deleted at the end\nof the pipeline run, regardless of what this field is set to.",
-          "type": "boolean"
-        },
-        "sizeGb": {
-          "description": "The size of the disk. Defaults to 500 (GB).\nThis field is not applicable for local SSD.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "name": {
-          "description": "Required. The name of the disk that can be used in the pipeline\nparameters. Must be 1 - 63 characters.\nThe name \"boot\" is reserved for system use.",
-          "type": "string"
-        },
-        "type": {
-          "description": "Required. The type of the disk to create.",
-          "enum": [
-            "TYPE_UNSPECIFIED",
-            "PERSISTENT_HDD",
-            "PERSISTENT_SSD",
-            "LOCAL_SSD"
-          ],
-          "enumDescriptions": [
-            "Default disk type. Use one of the other options below.",
-            "Specifies a Google Compute Engine persistent hard disk. See\nhttps://cloud.google.com/compute/docs/disks/#pdspecs for details.",
-            "Specifies a Google Compute Engine persistent solid-state disk. See\nhttps://cloud.google.com/compute/docs/disks/#pdspecs for details.",
-            "Specifies a Google Compute Engine local SSD.\nSee https://cloud.google.com/compute/docs/disks/local-ssd for details."
-          ],
-          "type": "string"
-        }
-      },
-      "id": "Disk"
-    },
-    "LocalCopy": {
-      "description": "LocalCopy defines how a remote file should be copied to and from the VM.",
-      "type": "object",
-      "properties": {
-        "path": {
-          "description": "Required. The path within the user's docker container where\nthis input should be localized to and from, relative to the specified\ndisk's mount point. For example: file.txt,",
-          "type": "string"
-        },
-        "disk": {
-          "description": "Required. The name of the disk where this parameter is\nlocated. Can be the name of one of the disks specified in the\nResources field, or \"boot\", which represents the Docker\ninstance's boot disk and has a mount point of `/`.",
-          "type": "string"
-        }
-      },
-      "id": "LocalCopy"
-    },
-    "RuntimeMetadata": {
-      "description": "Runtime metadata that will be populated in the\nruntimeMetadata\nfield of the Operation associated with a RunPipeline execution.",
-      "type": "object",
-      "properties": {
-        "computeEngine": {
-          "description": "Execution information specific to Google Compute Engine.",
-          "$ref": "ComputeEngine"
-        }
-      },
-      "id": "RuntimeMetadata"
-    },
-    "Pipeline": {
-      "description": "The pipeline object. Represents a transformation from a set of input\nparameters to a set of output parameters. The transformation is defined\nas a docker image and command to run within that image. Each pipeline\nis run on a Google Compute Engine VM. A pipeline can be created with the\n`create` method and then later run with the `run` method, or a pipeline can\nbe defined and run all at once with the `run` method.",
-      "type": "object",
-      "properties": {
-        "description": {
-          "description": "User-specified description.",
-          "type": "string"
-        },
-        "inputParameters": {
-          "description": "Input parameters of the pipeline.",
-          "type": "array",
-          "items": {
-            "$ref": "PipelineParameter"
-          }
-        },
-        "resources": {
-          "description": "Required. Specifies resource requirements for the pipeline run.\nRequired fields:\n\n*\nminimumCpuCores\n\n*\nminimumRamGb",
-          "$ref": "PipelineResources"
-        },
-        "pipelineId": {
-          "description": "Unique pipeline id that is generated by the service when CreatePipeline\nis called. Cannot be specified in the Pipeline used in the\nCreatePipelineRequest, and will be populated in the response to\nCreatePipeline and all subsequent Get and List calls. Indicates that the\nservice has registered this pipeline.",
-          "type": "string"
-        },
-        "outputParameters": {
-          "description": "Output parameters of the pipeline.",
-          "type": "array",
-          "items": {
-            "$ref": "PipelineParameter"
-          }
-        },
-        "docker": {
-          "description": "Specifies the docker run information.",
-          "$ref": "DockerExecutor"
-        },
-        "name": {
-          "description": "Required. A user specified pipeline name that does not have to be unique.\nThis name can be used for filtering Pipelines in ListPipelines.",
-          "type": "string"
-        },
-        "projectId": {
-          "description": "Required. The project in which to create the pipeline. The caller must have\nWRITE access.",
-          "type": "string"
-        }
-      },
-      "id": "Pipeline"
-    },
-    "ControllerConfig": {
-      "description": "Stores the information that the controller will fetch from the\nserver in order to run. Should only be used by VMs created by the\nPipelines Service and not by end users.",
-      "type": "object",
-      "properties": {
-        "disks": {
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "vars": {
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "cmd": {
-          "type": "string"
-        },
-        "gcsSinks": {
-          "additionalProperties": {
-            "$ref": "RepeatedString"
-          },
-          "type": "object"
-        },
-        "machineType": {
-          "type": "string"
-        },
-        "gcsSources": {
-          "additionalProperties": {
-            "$ref": "RepeatedString"
-          },
-          "type": "object"
-        },
-        "image": {
-          "type": "string"
-        },
-        "gcsLogPath": {
-          "type": "string"
-        }
-      },
-      "id": "ControllerConfig"
+      "id": "Status"
     },
     "ServiceAccount": {
       "description": "A Google Cloud Service Account.",
@@ -963,7 +141,412 @@
       },
       "id": "ServiceAccount"
     },
+    "PipelineResources": {
+      "properties": {
+        "bootDiskSizeGb": {
+          "description": "The size of the boot disk. Defaults to 10 (GB).",
+          "format": "int32",
+          "type": "integer"
+        },
+        "preemptible": {
+          "description": "Whether to use preemptible VMs. Defaults to `false`. In order to use this,\nmust be true for both create time and run time. Cannot be true at run time\nif false at create time.",
+          "type": "boolean"
+        },
+        "minimumRamGb": {
+          "description": "The minimum amount of RAM to use. Defaults to 3.75 (GB)",
+          "format": "double",
+          "type": "number"
+        },
+        "zones": {
+          "description": "List of Google Compute Engine availability zones to which resource\ncreation will restricted. If empty, any zone may be chosen.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "minimumCpuCores": {
+          "description": "The minimum number of cores to use. Defaults to 1.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "noAddress": {
+          "description": "Whether to assign an external IP to the instance. This is an experimental\nfeature that may go away. Defaults to false.\nCorresponds to `--no_address` flag for [gcloud compute instances create]\n(https://cloud.google.com/sdk/gcloud/reference/compute/instances/create).\nIn order to use this, must be true for both create time and run time.\nCannot be true at run time if false at create time. If you need to ssh into\na private IP VM for debugging, you can ssh to a public VM and then ssh into\nthe private VM's Internal IP.  If noAddress is set, this pipeline run may\nonly load docker images from Google Container Registry and not Docker Hub.\n** Note: To use this option, your project must be in Google Access for\nPrivate IPs Early Access Program.**",
+          "type": "boolean"
+        },
+        "disks": {
+          "description": "Disks to attach.",
+          "type": "array",
+          "items": {
+            "$ref": "Disk"
+          }
+        }
+      },
+      "id": "PipelineResources",
+      "description": "The system resources for the pipeline run.",
+      "type": "object"
+    },
+    "Pipeline": {
+      "description": "The pipeline object. Represents a transformation from a set of input\nparameters to a set of output parameters. The transformation is defined\nas a docker image and command to run within that image. Each pipeline\nis run on a Google Compute Engine VM. A pipeline can be created with the\n`create` method and then later run with the `run` method, or a pipeline can\nbe defined and run all at once with the `run` method.",
+      "type": "object",
+      "properties": {
+        "outputParameters": {
+          "description": "Output parameters of the pipeline.",
+          "type": "array",
+          "items": {
+            "$ref": "PipelineParameter"
+          }
+        },
+        "docker": {
+          "description": "Specifies the docker run information.",
+          "$ref": "DockerExecutor"
+        },
+        "description": {
+          "description": "User-specified description.",
+          "type": "string"
+        },
+        "inputParameters": {
+          "description": "Input parameters of the pipeline.",
+          "type": "array",
+          "items": {
+            "$ref": "PipelineParameter"
+          }
+        },
+        "resources": {
+          "$ref": "PipelineResources",
+          "description": "Required. Specifies resource requirements for the pipeline run.\nRequired fields:\n\n*\nminimumCpuCores\n\n*\nminimumRamGb"
+        },
+        "name": {
+          "description": "Required. A user specified pipeline name that does not have to be unique.\nThis name can be used for filtering Pipelines in ListPipelines.",
+          "type": "string"
+        },
+        "projectId": {
+          "description": "Required. The project in which to create the pipeline. The caller must have\nWRITE access.",
+          "type": "string"
+        },
+        "pipelineId": {
+          "description": "Unique pipeline id that is generated by the service when CreatePipeline\nis called. Cannot be specified in the Pipeline used in the\nCreatePipelineRequest, and will be populated in the response to\nCreatePipeline and all subsequent Get and List calls. Indicates that the\nservice has registered this pipeline.",
+          "type": "string"
+        }
+      },
+      "id": "Pipeline"
+    },
+    "ControllerConfig": {
+      "id": "ControllerConfig",
+      "description": "Stores the information that the controller will fetch from the\nserver in order to run. Should only be used by VMs created by the\nPipelines Service and not by end users.",
+      "type": "object",
+      "properties": {
+        "gcsSources": {
+          "additionalProperties": {
+            "$ref": "RepeatedString"
+          },
+          "type": "object"
+        },
+        "gcsSinks": {
+          "additionalProperties": {
+            "$ref": "RepeatedString"
+          },
+          "type": "object"
+        },
+        "disks": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "type": "object"
+        },
+        "machineType": {
+          "type": "string"
+        },
+        "cmd": {
+          "type": "string"
+        },
+        "vars": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "type": "object"
+        },
+        "image": {
+          "type": "string"
+        },
+        "gcsLogPath": {
+          "type": "string"
+        }
+      }
+    },
+    "OperationEvent": {
+      "type": "object",
+      "properties": {
+        "endTime": {
+          "description": "Optional time of when event finished. An event can have a start time and no\nfinish time. If an event has a finish time, there must be a start time.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "startTime": {
+          "description": "Optional time of when event started.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "description": {
+          "description": "Required description of event.",
+          "type": "string"
+        }
+      },
+      "id": "OperationEvent",
+      "description": "An event that occurred during an Operation."
+    },
+    "ListOperationsResponse": {
+      "description": "The response message for Operations.ListOperations.",
+      "type": "object",
+      "properties": {
+        "operations": {
+          "type": "array",
+          "items": {
+            "$ref": "Operation"
+          },
+          "description": "A list of operations that matches the specified filter in the request."
+        },
+        "nextPageToken": {
+          "description": "The standard List next-page token.",
+          "type": "string"
+        }
+      },
+      "id": "ListOperationsResponse"
+    },
+    "RepeatedString": {
+      "id": "RepeatedString",
+      "type": "object",
+      "properties": {
+        "values": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      }
+    },
+    "OperationMetadata": {
+      "description": "Metadata describing an Operation.",
+      "type": "object",
+      "properties": {
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optionally provided by the caller when submitting the request that creates\nthe operation.",
+          "type": "object"
+        },
+        "createTime": {
+          "description": "The time at which the job was submitted to the Genomics service.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "projectId": {
+          "description": "The Google Cloud Project in which the job is scoped.",
+          "type": "string"
+        },
+        "clientId": {
+          "description": "This field is deprecated. Use `labels` instead. Optionally provided by the\ncaller when submitting the request that creates the operation.",
+          "type": "string"
+        },
+        "endTime": {
+          "description": "The time at which the job stopped running.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "events": {
+          "description": "Optional event messages that were generated during the job's execution.\nThis also contains any warnings that were generated during import\nor export.",
+          "type": "array",
+          "items": {
+            "$ref": "OperationEvent"
+          }
+        },
+        "startTime": {
+          "description": "The time at which the job began to run.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "request": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "The original request that started the operation. Note that this will be in\ncurrent version of the API. If the operation was started with v1beta2 API\nand a GetOperation is performed on v1 API, a v1 request will be returned.",
+          "type": "object"
+        },
+        "runtimeMetadata": {
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "Runtime metadata on this Operation."
+        }
+      },
+      "id": "OperationMetadata"
+    },
+    "RunPipelineArgs": {
+      "description": "The pipeline run arguments.",
+      "type": "object",
+      "properties": {
+        "serviceAccount": {
+          "$ref": "ServiceAccount",
+          "description": "The Google Cloud Service Account that will be used to access data and\nservices. By default, the compute service account associated with\n`projectId` is used."
+        },
+        "inputs": {
+          "description": "Pipeline input arguments; keys are defined in the pipeline documentation.\nAll input parameters that do not have default values  must be specified.\nIf parameters with defaults are specified here, the defaults will be\noverridden.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Labels to apply to this pipeline run. Labels will also be applied to\ncompute resources (VM, disks) created by this pipeline run. When listing\noperations, operations can filtered by labels.\nLabel keys may not be empty; label values may be empty. Non-empty labels\nmust be 1-63 characters long, and comply with [RFC1035]\n(https://www.ietf.org/rfc/rfc1035.txt).\nSpecifically, the name must be 1-63 characters long and match the regular\nexpression `[a-z]([-a-z0-9]*[a-z0-9])?` which means the first\ncharacter must be a lowercase letter, and all following characters must be\na dash, lowercase letter, or digit, except the last character, which cannot\nbe a dash.",
+          "type": "object"
+        },
+        "logging": {
+          "$ref": "LoggingOptions",
+          "description": "Required. Logging options. Used by the service to communicate results\nto the user."
+        },
+        "keepVmAliveOnFailureDuration": {
+          "description": "How long to keep the VM up after a failure (for example docker command\nfailed, copying input or output files failed, etc). While the VM is up, one\ncan ssh into the VM to debug. Default is 0; maximum allowed value is 1 day.",
+          "format": "google-duration",
+          "type": "string"
+        },
+        "resources": {
+          "description": "Specifies resource requirements/overrides for the pipeline run.",
+          "$ref": "PipelineResources"
+        },
+        "outputs": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Pipeline output arguments; keys are defined in the pipeline\ndocumentation.  All output parameters of without default values\nmust be specified.  If parameters with defaults are specified\nhere, the defaults will be overridden.",
+          "type": "object"
+        },
+        "projectId": {
+          "description": "Required. The project in which to run the pipeline. The caller must have\nWRITER access to all Google Cloud services and resources (e.g. Google\nCompute Engine) will be used.",
+          "type": "string"
+        },
+        "clientId": {
+          "description": "This field is deprecated. Use `labels` instead. Client-specified pipeline\noperation identifier.",
+          "type": "string"
+        }
+      },
+      "id": "RunPipelineArgs"
+    },
+    "ListPipelinesResponse": {
+      "type": "object",
+      "properties": {
+        "nextPageToken": {
+          "description": "The token to use to get the next page of results.",
+          "type": "string"
+        },
+        "pipelines": {
+          "description": "The matched pipelines.",
+          "type": "array",
+          "items": {
+            "$ref": "Pipeline"
+          }
+        }
+      },
+      "id": "ListPipelinesResponse",
+      "description": "The response of ListPipelines. Contains at most `pageSize`\npipelines. If it contains `pageSize` pipelines, and more pipelines\nexist, then `nextPageToken` will be populated and should be\nused as the `pageToken` argument to a subsequent ListPipelines\nrequest."
+    },
+    "SetOperationStatusRequest": {
+      "type": "object",
+      "properties": {
+        "errorCode": {
+          "type": "string",
+          "enumDescriptions": [
+            "Not an error; returned on success\n\nHTTP Mapping: 200 OK",
+            "The operation was cancelled, typically by the caller.\n\nHTTP Mapping: 499 Client Closed Request",
+            "Unknown error.  For example, this error may be returned when\na `Status` value received from another address space belongs to\nan error space that is not known in this address space.  Also\nerrors raised by APIs that do not return enough error information\nmay be converted to this error.\n\nHTTP Mapping: 500 Internal Server Error",
+            "The client specified an invalid argument.  Note that this differs\nfrom `FAILED_PRECONDITION`.  `INVALID_ARGUMENT` indicates arguments\nthat are problematic regardless of the state of the system\n(e.g., a malformed file name).\n\nHTTP Mapping: 400 Bad Request",
+            "The deadline expired before the operation could complete. For operations\nthat change the state of the system, this error may be returned\neven if the operation has completed successfully.  For example, a\nsuccessful response from a server could have been delayed long\nenough for the deadline to expire.\n\nHTTP Mapping: 504 Gateway Timeout",
+            "Some requested entity (e.g., file or directory) was not found.\n\nNote to server developers: if a request is denied for an entire class\nof users, such as gradual feature rollout or undocumented whitelist,\n`NOT_FOUND` may be used. If a request is denied for some users within\na class of users, such as user-based access control, `PERMISSION_DENIED`\nmust be used.\n\nHTTP Mapping: 404 Not Found",
+            "The entity that a client attempted to create (e.g., file or directory)\nalready exists.\n\nHTTP Mapping: 409 Conflict",
+            "The caller does not have permission to execute the specified\noperation. `PERMISSION_DENIED` must not be used for rejections\ncaused by exhausting some resource (use `RESOURCE_EXHAUSTED`\ninstead for those errors). `PERMISSION_DENIED` must not be\nused if the caller can not be identified (use `UNAUTHENTICATED`\ninstead for those errors). This error code does not imply the\nrequest is valid or the requested entity exists or satisfies\nother pre-conditions.\n\nHTTP Mapping: 403 Forbidden",
+            "The request does not have valid authentication credentials for the\noperation.\n\nHTTP Mapping: 401 Unauthorized",
+            "Some resource has been exhausted, perhaps a per-user quota, or\nperhaps the entire file system is out of space.\n\nHTTP Mapping: 429 Too Many Requests",
+            "The operation was rejected because the system is not in a state\nrequired for the operation's execution.  For example, the directory\nto be deleted is non-empty, an rmdir operation is applied to\na non-directory, etc.\n\nService implementors can use the following guidelines to decide\nbetween `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`:\n (a) Use `UNAVAILABLE` if the client can retry just the failing call.\n (b) Use `ABORTED` if the client should retry at a higher level\n     (e.g., restarting a read-modify-write sequence).\n (c) Use `FAILED_PRECONDITION` if the client should not retry until\n     the system state has been explicitly fixed.  E.g., if an \"rmdir\"\n     fails because the directory is non-empty, `FAILED_PRECONDITION`\n     should be returned since the client should not retry unless\n     the files are deleted from the directory.\n\nHTTP Mapping: 400 Bad Request",
+            "The operation was aborted, typically due to a concurrency issue such as\na sequencer check failure or transaction abort.\n\nSee the guidelines above for deciding between `FAILED_PRECONDITION`,\n`ABORTED`, and `UNAVAILABLE`.\n\nHTTP Mapping: 409 Conflict",
+            "The operation was attempted past the valid range.  E.g., seeking or\nreading past end-of-file.\n\nUnlike `INVALID_ARGUMENT`, this error indicates a problem that may\nbe fixed if the system state changes. For example, a 32-bit file\nsystem will generate `INVALID_ARGUMENT` if asked to read at an\noffset that is not in the range [0,2^32-1], but it will generate\n`OUT_OF_RANGE` if asked to read from an offset past the current\nfile size.\n\nThere is a fair bit of overlap between `FAILED_PRECONDITION` and\n`OUT_OF_RANGE`.  We recommend using `OUT_OF_RANGE` (the more specific\nerror) when it applies so that callers who are iterating through\na space can easily look for an `OUT_OF_RANGE` error to detect when\nthey are done.\n\nHTTP Mapping: 400 Bad Request",
+            "The operation is not implemented or is not supported/enabled in this\nservice.\n\nHTTP Mapping: 501 Not Implemented",
+            "Internal errors.  This means that some invariants expected by the\nunderlying system have been broken.  This error code is reserved\nfor serious errors.\n\nHTTP Mapping: 500 Internal Server Error",
+            "The service is currently unavailable.  This is most likely a\ntransient condition, which can be corrected by retrying with\na backoff.\n\nSee the guidelines above for deciding between `FAILED_PRECONDITION`,\n`ABORTED`, and `UNAVAILABLE`.\n\nHTTP Mapping: 503 Service Unavailable",
+            "Unrecoverable data loss or corruption.\n\nHTTP Mapping: 500 Internal Server Error"
+          ],
+          "enum": [
+            "OK",
+            "CANCELLED",
+            "UNKNOWN",
+            "INVALID_ARGUMENT",
+            "DEADLINE_EXCEEDED",
+            "NOT_FOUND",
+            "ALREADY_EXISTS",
+            "PERMISSION_DENIED",
+            "UNAUTHENTICATED",
+            "RESOURCE_EXHAUSTED",
+            "FAILED_PRECONDITION",
+            "ABORTED",
+            "OUT_OF_RANGE",
+            "UNIMPLEMENTED",
+            "INTERNAL",
+            "UNAVAILABLE",
+            "DATA_LOSS"
+          ]
+        },
+        "timestampEvents": {
+          "type": "array",
+          "items": {
+            "$ref": "TimestampEvent"
+          }
+        },
+        "operationId": {
+          "type": "string"
+        },
+        "errorMessage": {
+          "type": "string"
+        },
+        "validationToken": {
+          "format": "uint64",
+          "type": "string"
+        }
+      },
+      "id": "SetOperationStatusRequest",
+      "description": "Request to set operation status. Should only be used by VMs\ncreated by the Pipelines Service and not by end users."
+    },
+    "ComputeEngine": {
+      "description": "Describes a Compute Engine resource that is being managed by a running\npipeline.",
+      "type": "object",
+      "properties": {
+        "machineType": {
+          "description": "The machine type of the instance.",
+          "type": "string"
+        },
+        "diskNames": {
+          "description": "The names of the disks that were created for this pipeline.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "instanceName": {
+          "description": "The instance on which the operation is running.",
+          "type": "string"
+        },
+        "zone": {
+          "description": "The availability zone in which the instance resides.",
+          "type": "string"
+        }
+      },
+      "id": "ComputeEngine"
+    },
     "ImportVariantsResponse": {
+      "id": "ImportVariantsResponse",
       "description": "The variant data import response.",
       "type": "object",
       "properties": {
@@ -974,113 +557,530 @@
             "type": "string"
           }
         }
+      }
+    },
+    "TimestampEvent": {
+      "description": "Stores the list of events and times they occured for major events in job\nexecution.",
+      "type": "object",
+      "properties": {
+        "timestamp": {
+          "description": "The time this event occured.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "description": {
+          "description": "String indicating the type of event",
+          "type": "string"
+        }
       },
-      "id": "ImportVariantsResponse"
+      "id": "TimestampEvent"
+    },
+    "LocalCopy": {
+      "id": "LocalCopy",
+      "description": "LocalCopy defines how a remote file should be copied to and from the VM.",
+      "type": "object",
+      "properties": {
+        "disk": {
+          "description": "Required. The name of the disk where this parameter is\nlocated. Can be the name of one of the disks specified in the\nResources field, or \"boot\", which represents the Docker\ninstance's boot disk and has a mount point of `/`.",
+          "type": "string"
+        },
+        "path": {
+          "description": "Required. The path within the user's docker container where\nthis input should be localized to and from, relative to the specified\ndisk's mount point. For example: file.txt,",
+          "type": "string"
+        }
+      }
+    },
+    "DockerExecutor": {
+      "description": "The Docker execuctor specification.",
+      "type": "object",
+      "properties": {
+        "imageName": {
+          "description": "Required. Image name from either Docker Hub or Google Container Registry.\nUsers that run pipelines must have READ access to the image.",
+          "type": "string"
+        },
+        "cmd": {
+          "description": "Required. The command or newline delimited script to run. The command\nstring will be executed within a bash shell.\n\nIf the command exits with a non-zero exit code, output parameter\nde-localization will be skipped and the pipeline operation's\n`error` field will be populated.\n\nMaximum command string length is 16384.",
+          "type": "string"
+        }
+      },
+      "id": "DockerExecutor"
+    },
+    "Disk": {
+      "properties": {
+        "autoDelete": {
+          "description": "Deprecated. Disks created by the Pipelines API will be deleted at the end\nof the pipeline run, regardless of what this field is set to.",
+          "type": "boolean"
+        },
+        "sizeGb": {
+          "description": "The size of the disk. Defaults to 500 (GB).\nThis field is not applicable for local SSD.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "mountPoint": {
+          "description": "Required at create time and cannot be overridden at run time.\nSpecifies the path in the docker container where files on\nthis disk should be located. For example, if `mountPoint`\nis `/mnt/disk`, and the parameter has `localPath`\n`inputs/file.txt`, the docker container can access the data at\n`/mnt/disk/inputs/file.txt`.",
+          "type": "string"
+        },
+        "source": {
+          "description": "The full or partial URL of the persistent disk to attach. See\nhttps://cloud.google.com/compute/docs/reference/latest/instances#resource\nand\nhttps://cloud.google.com/compute/docs/disks/persistent-disks#snapshots\nfor more details.",
+          "type": "string"
+        },
+        "name": {
+          "description": "Required. The name of the disk that can be used in the pipeline\nparameters. Must be 1 - 63 characters.\nThe name \"boot\" is reserved for system use.",
+          "type": "string"
+        },
+        "type": {
+          "enumDescriptions": [
+            "Default disk type. Use one of the other options below.",
+            "Specifies a Google Compute Engine persistent hard disk. See\nhttps://cloud.google.com/compute/docs/disks/#pdspecs for details.",
+            "Specifies a Google Compute Engine persistent solid-state disk. See\nhttps://cloud.google.com/compute/docs/disks/#pdspecs for details.",
+            "Specifies a Google Compute Engine local SSD.\nSee https://cloud.google.com/compute/docs/disks/local-ssd for details."
+          ],
+          "enum": [
+            "TYPE_UNSPECIFIED",
+            "PERSISTENT_HDD",
+            "PERSISTENT_SSD",
+            "LOCAL_SSD"
+          ],
+          "description": "Required. The type of the disk to create.",
+          "type": "string"
+        }
+      },
+      "id": "Disk",
+      "description": "A Google Compute Engine disk resource specification.",
+      "type": "object"
+    },
+    "Empty": {
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
+      "type": "object",
+      "properties": {},
+      "id": "Empty"
+    },
+    "PipelineParameter": {
+      "description": "Parameters facilitate setting and delivering data into the\npipeline's execution environment. They are defined at create time,\nwith optional defaults, and can be overridden at run time.\n\nIf `localCopy` is unset, then the parameter specifies a string that\nis passed as-is into the pipeline, as the value of the environment\nvariable with the given name.  A default value can be optionally\nspecified at create time. The default can be overridden at run time\nusing the inputs map. If no default is given, a value must be\nsupplied at runtime.\n\nIf `localCopy` is defined, then the parameter specifies a data\nsource or sink, both in Google Cloud Storage and on the Docker container\nwhere the pipeline computation is run. The service account associated with\nthe Pipeline (by\ndefault the project's Compute Engine service account) must have access to the\nGoogle Cloud Storage paths.\n\nAt run time, the Google Cloud Storage paths can be overridden if a default\nwas provided at create time, or must be set otherwise. The pipeline runner\nshould add a key/value pair to either the inputs or outputs map. The\nindicated data copies will be carried out before/after pipeline execution,\njust as if the corresponding arguments were provided to `gsutil cp`.\n\nFor example: Given the following `PipelineParameter`, specified\nin the `inputParameters` list:\n\n```\n{name: \"input_file\", localCopy: {path: \"file.txt\", disk: \"pd1\"}}\n```\n\nwhere `disk` is defined in the `PipelineResources` object as:\n\n```\n{name: \"pd1\", mountPoint: \"/mnt/disk/\"}\n```\n\nWe create a disk named `pd1`, mount it on the host VM, and map\n`/mnt/pd1` to `/mnt/disk` in the docker container.  At\nruntime, an entry for `input_file` would be required in the inputs\nmap, such as:\n\n```\n  inputs[\"input_file\"] = \"gs://my-bucket/bar.txt\"\n```\n\nThis would generate the following gsutil call:\n\n```\n  gsutil cp gs://my-bucket/bar.txt /mnt/pd1/file.txt\n```\n\nThe file `/mnt/pd1/file.txt` maps to `/mnt/disk/file.txt` in the\nDocker container. Acceptable paths are:\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\u003cth\u003eGoogle Cloud storage path\u003c/th\u003e\u003cth\u003eLocal path\u003c/th\u003e\u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\u003ctd\u003efile\u003c/td\u003e\u003ctd\u003efile\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd\u003eglob\u003c/td\u003e\u003ctd\u003edirectory\u003c/td\u003e\u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\nFor outputs, the direction of the copy is reversed:\n\n```\n  gsutil cp /mnt/disk/file.txt gs://my-bucket/bar.txt\n```\n\nAcceptable paths are:\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\u003cth\u003eLocal path\u003c/th\u003e\u003cth\u003eGoogle Cloud Storage path\u003c/th\u003e\u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\u003ctd\u003efile\u003c/td\u003e\u003ctd\u003efile\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003efile\u003c/td\u003e\n      \u003ctd\u003edirectory - directory must already exist\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eglob\u003c/td\u003e\n      \u003ctd\u003edirectory - directory will be created if it doesn't exist\u003c/td\u003e\u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\nOne restriction due to docker limitations, is that for outputs that are found\non the boot disk, the local path cannot be a glob and must be a file.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "Required. Name of the parameter - the pipeline runner uses this string\nas the key to the input and output maps in RunPipeline.",
+          "type": "string"
+        },
+        "description": {
+          "description": "Human-readable description.",
+          "type": "string"
+        },
+        "localCopy": {
+          "$ref": "LocalCopy",
+          "description": "If present, this parameter is marked for copying to and from the VM.\n`LocalCopy` indicates where on the VM the file should be. The value\ngiven to this parameter (either at runtime or using `defaultValue`)\nmust be the remote path where the file should be."
+        },
+        "defaultValue": {
+          "description": "The default value for this parameter. Can be overridden at runtime.\nIf `localCopy` is present, then this must be a Google Cloud Storage path\nbeginning with `gs://`.",
+          "type": "string"
+        }
+      },
+      "id": "PipelineParameter"
     }
   },
-  "revision": "20170125",
-  "basePath": "",
   "icons": {
-    "x32": "http://www.google.com/images/icons/product/search-32.gif",
-    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
   },
-  "discoveryVersion": "v1",
+  "protocol": "rest",
+  "version": "v1alpha2",
   "baseUrl": "https://genomics.googleapis.com/",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        },
+        "https://www.googleapis.com/auth/genomics": {
+          "description": "View and manage Genomics data"
+        },
+        "https://www.googleapis.com/auth/compute": {
+          "description": "View and manage your Google Compute Engine resources"
+        }
+      }
+    }
+  },
+  "kind": "discovery#restDescription",
+  "description": "Upload, process, query, and search Genomics data in the cloud.",
+  "servicePath": "",
+  "rootUrl": "https://genomics.googleapis.com/",
+  "basePath": "",
+  "ownerDomain": "google.com",
   "name": "genomics",
+  "batchPath": "batch",
+  "revision": "20170209",
+  "id": "genomics:v1alpha2",
+  "documentationLink": "https://cloud.google.com/genomics",
+  "title": "Genomics API",
+  "ownerName": "Google",
+  "discoveryVersion": "v1",
+  "resources": {
+    "pipelines": {
+      "methods": {
+        "get": {
+          "path": "v1alpha2/pipelines/{pipelineId}",
+          "id": "genomics.pipelines.get",
+          "description": "Retrieves a pipeline based on ID.\n\nCaller must have READ permission to the project.",
+          "parameterOrder": [
+            "pipelineId"
+          ],
+          "response": {
+            "$ref": "Pipeline"
+          },
+          "httpMethod": "GET",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {
+            "pipelineId": {
+              "required": true,
+              "type": "string",
+              "location": "path",
+              "description": "Caller must have READ access to the project in which this pipeline\nis defined."
+            }
+          },
+          "flatPath": "v1alpha2/pipelines/{pipelineId}"
+        },
+        "setOperationStatus": {
+          "description": "Sets status of a given operation. Any new timestamps (as determined by\ndescription) are appended to TimestampEvents. Should only be called by VMs\ncreated by the Pipelines Service and not by end users.",
+          "request": {
+            "$ref": "SetOperationStatusRequest"
+          },
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameterOrder": [],
+          "httpMethod": "PUT",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {},
+          "flatPath": "v1alpha2/pipelines:setOperationStatus",
+          "path": "v1alpha2/pipelines:setOperationStatus",
+          "id": "genomics.pipelines.setOperationStatus"
+        },
+        "delete": {
+          "flatPath": "v1alpha2/pipelines/{pipelineId}",
+          "path": "v1alpha2/pipelines/{pipelineId}",
+          "id": "genomics.pipelines.delete",
+          "description": "Deletes a pipeline based on ID.\n\nCaller must have WRITE permission to the project.",
+          "parameterOrder": [
+            "pipelineId"
+          ],
+          "response": {
+            "$ref": "Empty"
+          },
+          "httpMethod": "DELETE",
+          "parameters": {
+            "pipelineId": {
+              "description": "Caller must have WRITE access to the project in which this pipeline\nis defined.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ]
+        },
+        "getControllerConfig": {
+          "response": {
+            "$ref": "ControllerConfig"
+          },
+          "parameterOrder": [],
+          "httpMethod": "GET",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {
+            "operationId": {
+              "description": "The operation to retrieve controller configuration for.",
+              "type": "string",
+              "location": "query"
+            },
+            "validationToken": {
+              "location": "query",
+              "format": "uint64",
+              "type": "string"
+            }
+          },
+          "flatPath": "v1alpha2/pipelines:getControllerConfig",
+          "path": "v1alpha2/pipelines:getControllerConfig",
+          "id": "genomics.pipelines.getControllerConfig",
+          "description": "Gets controller configuration information. Should only be called\nby VMs created by the Pipelines Service and not by end users."
+        },
+        "list": {
+          "path": "v1alpha2/pipelines",
+          "id": "genomics.pipelines.list",
+          "description": "Lists pipelines.\n\nCaller must have READ permission to the project.",
+          "response": {
+            "$ref": "ListPipelinesResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "GET",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {
+            "pageSize": {
+              "location": "query",
+              "description": "Number of pipelines to return at once. Defaults to 256, and max\nis 2048.",
+              "format": "int32",
+              "type": "integer"
+            },
+            "projectId": {
+              "location": "query",
+              "description": "Required. The name of the project to search for pipelines. Caller\nmust have READ access to this project.",
+              "type": "string"
+            },
+            "namePrefix": {
+              "description": "Pipelines with names that match this prefix should be\nreturned.  If unspecified, all pipelines in the project, up to\n`pageSize`, will be returned.",
+              "type": "string",
+              "location": "query"
+            },
+            "pageToken": {
+              "description": "Token to use to indicate where to start getting results.\nIf unspecified, returns the first page of results.",
+              "type": "string",
+              "location": "query"
+            }
+          },
+          "flatPath": "v1alpha2/pipelines"
+        },
+        "create": {
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "Pipeline"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {},
+          "flatPath": "v1alpha2/pipelines",
+          "id": "genomics.pipelines.create",
+          "path": "v1alpha2/pipelines",
+          "description": "Creates a pipeline that can be run later. Create takes a Pipeline that\nhas all fields other than `pipelineId` populated, and then returns\nthe same pipeline with `pipelineId` populated. This id can be used\nto run the pipeline.\n\nCaller must have WRITE permission to the project.",
+          "request": {
+            "$ref": "Pipeline"
+          }
+        },
+        "run": {
+          "request": {
+            "$ref": "RunPipelineRequest"
+          },
+          "description": "Runs a pipeline. If `pipelineId` is specified in the request, then\nrun a saved pipeline. If `ephemeralPipeline` is specified, then run\nthat pipeline once without saving a copy.\n\nThe caller must have READ permission to the project where the pipeline\nis stored and WRITE permission to the project where the pipeline will be\nrun, as VMs will be created and storage will be used.\n\nIf a pipeline operation is still running after 6 days, it will be canceled.",
+          "response": {
+            "$ref": "Operation"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/compute",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "flatPath": "v1alpha2/pipelines:run",
+          "path": "v1alpha2/pipelines:run",
+          "id": "genomics.pipelines.run"
+        }
+      }
+    },
+    "operations": {
+      "methods": {
+        "cancel": {
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameterOrder": [
+            "name"
+          ],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {
+            "name": {
+              "pattern": "^operations/.+$",
+              "location": "path",
+              "description": "The name of the operation resource to be cancelled.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1alpha2/operations/{operationsId}:cancel",
+          "path": "v1alpha2/{+name}:cancel",
+          "id": "genomics.operations.cancel",
+          "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed. Clients may use Operations.GetOperation or Operations.ListOperations to check whether the cancellation succeeded or the operation completed despite cancellation.",
+          "request": {
+            "$ref": "CancelOperationRequest"
+          }
+        },
+        "list": {
+          "httpMethod": "GET",
+          "parameterOrder": [
+            "name"
+          ],
+          "response": {
+            "$ref": "ListOperationsResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "parameters": {
+            "filter": {
+              "description": "A string for filtering Operations.\nThe following filter fields are supported&#58;\n\n* projectId&#58; Required. Corresponds to\n  OperationMetadata.projectId.\n* createTime&#58; The time this job was created, in seconds from the\n  [epoch](http://en.wikipedia.org/wiki/Unix_time). Can use `\u003e=` and/or `\u003c=`\n  operators.\n* status&#58; Can be `RUNNING`, `SUCCESS`, `FAILURE`, or `CANCELED`. Only\n  one status may be specified.\n* labels.key where key is a label key.\n\nExamples&#58;\n\n* `projectId = my-project AND createTime \u003e= 1432140000`\n* `projectId = my-project AND createTime \u003e= 1432140000 AND createTime \u003c= 1432150000 AND status = RUNNING`\n* `projectId = my-project AND labels.color = *`\n* `projectId = my-project AND labels.color = red`",
+              "type": "string",
+              "location": "query"
+            },
+            "name": {
+              "required": true,
+              "type": "string",
+              "pattern": "^operations$",
+              "location": "path",
+              "description": "The name of the operation collection."
+            },
+            "pageToken": {
+              "location": "query",
+              "description": "The standard list page token.",
+              "type": "string"
+            },
+            "pageSize": {
+              "location": "query",
+              "description": "The maximum number of results to return. If unspecified, defaults to\n256. The maximum value is 2048.",
+              "format": "int32",
+              "type": "integer"
+            }
+          },
+          "flatPath": "v1alpha2/operations",
+          "id": "genomics.operations.list",
+          "path": "v1alpha2/{+name}",
+          "description": "Lists operations that match the specified filter in the request."
+        },
+        "get": {
+          "path": "v1alpha2/{+name}",
+          "id": "genomics.operations.get",
+          "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice.",
+          "response": {
+            "$ref": "Operation"
+          },
+          "parameterOrder": [
+            "name"
+          ],
+          "httpMethod": "GET",
+          "parameters": {
+            "name": {
+              "pattern": "^operations/.+$",
+              "location": "path",
+              "description": "The name of the operation resource.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/genomics"
+          ],
+          "flatPath": "v1alpha2/operations/{operationsId}"
+        }
+      }
+    }
+  },
   "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
+    "uploadType": {
       "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\")."
     },
     "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
       "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
+      "description": "Selector specifying which fields to include in a partial response.",
       "type": "string"
     },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
     "callback": {
       "description": "JSONP",
       "type": "string",
       "location": "query"
     },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
     },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+    "alt": {
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
       "type": "string",
-      "location": "query"
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response."
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
     },
     "bearer_token": {
       "description": "OAuth bearer token.",
       "type": "string",
       "location": "query"
     },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+    "oauth_token": {
       "type": "string",
-      "location": "query"
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user."
+    },
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
     }
-  },
-  "documentationLink": "https://cloud.google.com/genomics",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
-  "servicePath": "",
-  "ownerName": "Google",
-  "version": "v1alpha2",
-  "rootUrl": "https://genomics.googleapis.com/",
-  "kind": "discovery#restDescription"
+  }
 }
diff --git a/genomics/v1alpha2/genomics-gen.go b/genomics/v1alpha2/genomics-gen.go
index ada8f3f..5a178a7 100644
--- a/genomics/v1alpha2/genomics-gen.go
+++ b/genomics/v1alpha2/genomics-gen.go
@@ -68,9 +68,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Operations *OperationsService
 
@@ -84,6 +85,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewOperationsService(s *Service) *OperationsService {
 	rs := &OperationsService{s: s}
 	return rs
@@ -1670,6 +1675,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.canceloperationrequest)
 	if err != nil {
@@ -1819,6 +1825,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2002,6 +2009,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2175,6 +2183,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pipeline)
 	if err != nil {
@@ -2298,6 +2307,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1alpha2/pipelines/{pipelineId}")
@@ -2436,6 +2446,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2588,6 +2599,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2760,6 +2772,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2932,6 +2945,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.runpipelinerequest)
 	if err != nil {
@@ -3058,6 +3072,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setoperationstatusrequest)
 	if err != nil {
diff --git a/gmail/v1/gmail-api.json b/gmail/v1/gmail-api.json
index db0a330..a2e8d7d 100644
--- a/gmail/v1/gmail-api.json
+++ b/gmail/v1/gmail-api.json
@@ -1,11 +1,11 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/8k2U6SLZqLD09rqAHvstdGUpdIg\"",
+ "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/bv4LA8S_yqDUVUFrxfui1vcVGzk\"",
  "discoveryVersion": "v1",
  "id": "gmail:v1",
  "name": "gmail",
  "version": "v1",
- "revision": "20170110",
+ "revision": "20170206",
  "title": "Gmail API",
  "description": "Access Gmail mailboxes including sending user email.",
  "ownerDomain": "google.com",
@@ -669,6 +669,19 @@
     }
    }
   },
+  "ListSmimeInfoResponse": {
+   "id": "ListSmimeInfoResponse",
+   "type": "object",
+   "properties": {
+    "smimeInfo": {
+     "type": "array",
+     "description": "List of SmimeInfo.",
+     "items": {
+      "$ref": "SmimeInfo"
+     }
+    }
+   }
+  },
   "ListThreadsResponse": {
    "id": "ListThreadsResponse",
    "type": "object",
@@ -981,6 +994,43 @@
     }
    }
   },
+  "SmimeInfo": {
+   "id": "SmimeInfo",
+   "type": "object",
+   "description": "An S/MIME email config.",
+   "properties": {
+    "encryptedKeyPassword": {
+     "type": "string",
+     "description": "Encrypted key password, when key is encrypted."
+    },
+    "expiration": {
+     "type": "string",
+     "description": "When the certificate expires (in milliseconds since epoch).",
+     "format": "int64"
+    },
+    "id": {
+     "type": "string",
+     "description": "The immutable ID for the SmimeInfo."
+    },
+    "isDefault": {
+     "type": "boolean",
+     "description": "Whether this SmimeInfo is the default one for this user's send-as address."
+    },
+    "issuerCn": {
+     "type": "string",
+     "description": "The S/MIME certificate issuer's common name."
+    },
+    "pem": {
+     "type": "string",
+     "description": "PEM formatted X509 concatenated certificate string (standard base64 encoding). Format used for returning key, which includes public key as well as certificate chain (not private key)."
+    },
+    "pkcs12": {
+     "type": "string",
+     "description": "PKCS#12 format containing a single private/public key pair and certificate chain. This format is only accepted from client for creating a new SmimeInfo and is never returned, because the private key is not intended to be exported. PKCS#12 may be encrypted, in which case encryptedKeyPassword should be set appropriately.",
+     "format": "byte"
+    }
+   }
+  },
   "SmtpMsa": {
    "id": "SmtpMsa",
    "type": "object",
@@ -1080,7 +1130,7 @@
     },
     "restrictToDomain": {
      "type": "boolean",
-     "description": "Flag that determines whether responses are sent to recipients who are outside of the user's domain. This feature is only available for Google Apps users."
+     "description": "Flag that determines whether responses are sent to recipients who are outside of the user's domain. This feature is only available for G Suite users."
     },
     "startTime": {
      "type": "string",
@@ -1513,6 +1563,24 @@
        "httpMethod": "GET",
        "description": "Lists the history of all changes to the given mailbox. History results are returned in chronological order (increasing historyId).",
        "parameters": {
+        "historyTypes": {
+         "type": "string",
+         "description": "History types to be returned by the function",
+         "enum": [
+          "labelAdded",
+          "labelRemoved",
+          "messageAdded",
+          "messageDeleted"
+         ],
+         "enumDescriptions": [
+          "",
+          "",
+          "",
+          ""
+         ],
+         "repeated": true,
+         "location": "query"
+        },
         "labelId": {
          "type": "string",
          "description": "Only return messages with a label matching the ID.",
@@ -1902,7 +1970,7 @@
        "parameters": {
         "deleted": {
          "type": "boolean",
-         "description": "Mark the email as permanently deleted (not TRASH) and only visible in Google Apps Vault to a Vault administrator. Only used for Google Apps for Work accounts.",
+         "description": "Mark the email as permanently deleted (not TRASH) and only visible in Google Vault to a Vault administrator. Only used for G Suite accounts.",
          "default": "false",
          "location": "query"
         },
@@ -1980,7 +2048,7 @@
        "parameters": {
         "deleted": {
          "type": "boolean",
-         "description": "Mark the email as permanently deleted (not TRASH) and only visible in Google Apps Vault to a Vault administrator. Only used for Google Apps for Work accounts.",
+         "description": "Mark the email as permanently deleted (not TRASH) and only visible in Google Vault to a Vault administrator. Only used for G Suite accounts.",
          "default": "false",
          "location": "query"
         },
@@ -2964,6 +3032,196 @@
           "https://www.googleapis.com/auth/gmail.settings.sharing"
          ]
         }
+       },
+       "resources": {
+        "smimeInfo": {
+         "methods": {
+          "delete": {
+           "id": "gmail.users.settings.sendAs.smimeInfo.delete",
+           "path": "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}",
+           "httpMethod": "DELETE",
+           "description": "Deletes the specified S/MIME config for the specified send-as alias.",
+           "parameters": {
+            "id": {
+             "type": "string",
+             "description": "The immutable ID for the SmimeInfo.",
+             "required": true,
+             "location": "path"
+            },
+            "sendAsEmail": {
+             "type": "string",
+             "description": "The email address that appears in the \"From:\" header for mail sent using this alias.",
+             "required": true,
+             "location": "path"
+            },
+            "userId": {
+             "type": "string",
+             "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
+             "default": "me",
+             "required": true,
+             "location": "path"
+            }
+           },
+           "parameterOrder": [
+            "userId",
+            "sendAsEmail",
+            "id"
+           ],
+           "scopes": [
+            "https://www.googleapis.com/auth/gmail.settings.basic",
+            "https://www.googleapis.com/auth/gmail.settings.sharing"
+           ]
+          },
+          "get": {
+           "id": "gmail.users.settings.sendAs.smimeInfo.get",
+           "path": "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}",
+           "httpMethod": "GET",
+           "description": "Gets the specified S/MIME config for the specified send-as alias.",
+           "parameters": {
+            "id": {
+             "type": "string",
+             "description": "The immutable ID for the SmimeInfo.",
+             "required": true,
+             "location": "path"
+            },
+            "sendAsEmail": {
+             "type": "string",
+             "description": "The email address that appears in the \"From:\" header for mail sent using this alias.",
+             "required": true,
+             "location": "path"
+            },
+            "userId": {
+             "type": "string",
+             "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
+             "default": "me",
+             "required": true,
+             "location": "path"
+            }
+           },
+           "parameterOrder": [
+            "userId",
+            "sendAsEmail",
+            "id"
+           ],
+           "response": {
+            "$ref": "SmimeInfo"
+           },
+           "scopes": [
+            "https://mail.google.com/",
+            "https://www.googleapis.com/auth/gmail.modify",
+            "https://www.googleapis.com/auth/gmail.readonly",
+            "https://www.googleapis.com/auth/gmail.settings.basic",
+            "https://www.googleapis.com/auth/gmail.settings.sharing"
+           ]
+          },
+          "insert": {
+           "id": "gmail.users.settings.sendAs.smimeInfo.insert",
+           "path": "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo",
+           "httpMethod": "POST",
+           "description": "Insert (upload) the given S/MIME config for the specified send-as alias. Note that pkcs12 format is required for the key.",
+           "parameters": {
+            "sendAsEmail": {
+             "type": "string",
+             "description": "The email address that appears in the \"From:\" header for mail sent using this alias.",
+             "required": true,
+             "location": "path"
+            },
+            "userId": {
+             "type": "string",
+             "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
+             "default": "me",
+             "required": true,
+             "location": "path"
+            }
+           },
+           "parameterOrder": [
+            "userId",
+            "sendAsEmail"
+           ],
+           "request": {
+            "$ref": "SmimeInfo"
+           },
+           "response": {
+            "$ref": "SmimeInfo"
+           },
+           "scopes": [
+            "https://www.googleapis.com/auth/gmail.settings.basic",
+            "https://www.googleapis.com/auth/gmail.settings.sharing"
+           ]
+          },
+          "list": {
+           "id": "gmail.users.settings.sendAs.smimeInfo.list",
+           "path": "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo",
+           "httpMethod": "GET",
+           "description": "Lists S/MIME configs for the specified send-as alias.",
+           "parameters": {
+            "sendAsEmail": {
+             "type": "string",
+             "description": "The email address that appears in the \"From:\" header for mail sent using this alias.",
+             "required": true,
+             "location": "path"
+            },
+            "userId": {
+             "type": "string",
+             "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
+             "default": "me",
+             "required": true,
+             "location": "path"
+            }
+           },
+           "parameterOrder": [
+            "userId",
+            "sendAsEmail"
+           ],
+           "response": {
+            "$ref": "ListSmimeInfoResponse"
+           },
+           "scopes": [
+            "https://mail.google.com/",
+            "https://www.googleapis.com/auth/gmail.modify",
+            "https://www.googleapis.com/auth/gmail.readonly",
+            "https://www.googleapis.com/auth/gmail.settings.basic",
+            "https://www.googleapis.com/auth/gmail.settings.sharing"
+           ]
+          },
+          "setDefault": {
+           "id": "gmail.users.settings.sendAs.smimeInfo.setDefault",
+           "path": "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}/setDefault",
+           "httpMethod": "POST",
+           "description": "Sets the default S/MIME config for the specified send-as alias.",
+           "parameters": {
+            "id": {
+             "type": "string",
+             "description": "The immutable ID for the SmimeInfo.",
+             "required": true,
+             "location": "path"
+            },
+            "sendAsEmail": {
+             "type": "string",
+             "description": "The email address that appears in the \"From:\" header for mail sent using this alias.",
+             "required": true,
+             "location": "path"
+            },
+            "userId": {
+             "type": "string",
+             "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
+             "default": "me",
+             "required": true,
+             "location": "path"
+            }
+           },
+           "parameterOrder": [
+            "userId",
+            "sendAsEmail",
+            "id"
+           ],
+           "scopes": [
+            "https://www.googleapis.com/auth/gmail.settings.basic",
+            "https://www.googleapis.com/auth/gmail.settings.sharing"
+           ]
+          }
+         }
+        }
        }
       }
      }
diff --git a/gmail/v1/gmail-gen.go b/gmail/v1/gmail-gen.go
index 395e616..8402718 100644
--- a/gmail/v1/gmail-gen.go
+++ b/gmail/v1/gmail-gen.go
@@ -90,9 +90,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Users *UsersService
 }
@@ -104,6 +105,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewUsersService(s *Service) *UsersService {
 	rs := &UsersService{s: s}
 	rs.Drafts = NewUsersDraftsService(s)
@@ -217,11 +222,23 @@
 
 func NewUsersSettingsSendAsService(s *Service) *UsersSettingsSendAsService {
 	rs := &UsersSettingsSendAsService{s: s}
+	rs.SmimeInfo = NewUsersSettingsSendAsSmimeInfoService(s)
 	return rs
 }
 
 type UsersSettingsSendAsService struct {
 	s *Service
+
+	SmimeInfo *UsersSettingsSendAsSmimeInfoService
+}
+
+func NewUsersSettingsSendAsSmimeInfoService(s *Service) *UsersSettingsSendAsSmimeInfoService {
+	rs := &UsersSettingsSendAsSmimeInfoService{s: s}
+	return rs
+}
+
+type UsersSettingsSendAsSmimeInfoService struct {
+	s *Service
 }
 
 func NewUsersThreadsService(s *Service) *UsersThreadsService {
@@ -1099,6 +1116,37 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type ListSmimeInfoResponse struct {
+	// SmimeInfo: List of SmimeInfo.
+	SmimeInfo []*SmimeInfo `json:"smimeInfo,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "SmimeInfo") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "SmimeInfo") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ListSmimeInfoResponse) MarshalJSON() ([]byte, error) {
+	type noMethod ListSmimeInfoResponse
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 type ListThreadsResponse struct {
 	// NextPageToken: Page token to retrieve the next page of results in the
 	// list.
@@ -1573,6 +1621,66 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// SmimeInfo: An S/MIME email config.
+type SmimeInfo struct {
+	// EncryptedKeyPassword: Encrypted key password, when key is encrypted.
+	EncryptedKeyPassword string `json:"encryptedKeyPassword,omitempty"`
+
+	// Expiration: When the certificate expires (in milliseconds since
+	// epoch).
+	Expiration int64 `json:"expiration,omitempty,string"`
+
+	// Id: The immutable ID for the SmimeInfo.
+	Id string `json:"id,omitempty"`
+
+	// IsDefault: Whether this SmimeInfo is the default one for this user's
+	// send-as address.
+	IsDefault bool `json:"isDefault,omitempty"`
+
+	// IssuerCn: The S/MIME certificate issuer's common name.
+	IssuerCn string `json:"issuerCn,omitempty"`
+
+	// Pem: PEM formatted X509 concatenated certificate string (standard
+	// base64 encoding). Format used for returning key, which includes
+	// public key as well as certificate chain (not private key).
+	Pem string `json:"pem,omitempty"`
+
+	// Pkcs12: PKCS#12 format containing a single private/public key pair
+	// and certificate chain. This format is only accepted from client for
+	// creating a new SmimeInfo and is never returned, because the private
+	// key is not intended to be exported. PKCS#12 may be encrypted, in
+	// which case encryptedKeyPassword should be set appropriately.
+	Pkcs12 string `json:"pkcs12,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g.
+	// "EncryptedKeyPassword") to unconditionally include in API requests.
+	// By default, fields with empty values are omitted from API requests.
+	// However, any non-pointer, non-interface field appearing in
+	// ForceSendFields will be sent to the server regardless of whether the
+	// field is empty or not. This may be used to include empty fields in
+	// Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "EncryptedKeyPassword") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *SmimeInfo) MarshalJSON() ([]byte, error) {
+	type noMethod SmimeInfo
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // SmtpMsa: Configuration for communication with an SMTP service.
 type SmtpMsa struct {
 	// Host: The hostname of the SMTP service. Required.
@@ -1700,7 +1808,7 @@
 
 	// RestrictToDomain: Flag that determines whether responses are sent to
 	// recipients who are outside of the user's domain. This feature is only
-	// available for Google Apps users.
+	// available for G Suite users.
 	RestrictToDomain bool `json:"restrictToDomain,omitempty"`
 
 	// StartTime: An optional start time for sending auto-replies (epoch
@@ -1884,6 +1992,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2015,6 +2124,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/stop")
@@ -2117,6 +2227,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.watchrequest)
 	if err != nil {
@@ -2307,6 +2418,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.draft)
 	if err != nil {
@@ -2509,6 +2621,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/drafts/{id}")
@@ -2641,6 +2754,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2838,6 +2952,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3068,6 +3183,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.draft)
 	if err != nil {
@@ -3324,6 +3440,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.draft)
 	if err != nil {
@@ -3502,6 +3619,19 @@
 	return c
 }
 
+// HistoryTypes sets the optional parameter "historyTypes": History
+// types to be returned by the function
+//
+// Possible values:
+//   "labelAdded"
+//   "labelRemoved"
+//   "messageAdded"
+//   "messageDeleted"
+func (c *UsersHistoryListCall) HistoryTypes(historyTypes ...string) *UsersHistoryListCall {
+	c.urlParams_.SetMulti("historyTypes", append([]string{}, historyTypes...))
+	return c
+}
+
 // LabelId sets the optional parameter "labelId": Only return messages
 // with a label matching the ID.
 func (c *UsersHistoryListCall) LabelId(labelId string) *UsersHistoryListCall {
@@ -3581,6 +3711,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3641,6 +3772,24 @@
 	//     "userId"
 	//   ],
 	//   "parameters": {
+	//     "historyTypes": {
+	//       "description": "History types to be returned by the function",
+	//       "enum": [
+	//         "labelAdded",
+	//         "labelRemoved",
+	//         "messageAdded",
+	//         "messageDeleted"
+	//       ],
+	//       "enumDescriptions": [
+	//         "",
+	//         "",
+	//         "",
+	//         ""
+	//       ],
+	//       "location": "query",
+	//       "repeated": true,
+	//       "type": "string"
+	//     },
 	//     "labelId": {
 	//       "description": "Only return messages with a label matching the ID.",
 	//       "location": "query",
@@ -3757,6 +3906,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.label)
 	if err != nil {
@@ -3894,6 +4044,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/labels/{id}")
@@ -4013,6 +4164,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4163,6 +4315,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4299,6 +4452,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.label)
 	if err != nil {
@@ -4445,6 +4599,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.label)
 	if err != nil {
@@ -4591,6 +4746,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.batchdeletemessagesrequest)
 	if err != nil {
@@ -4697,6 +4853,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.batchmodifymessagesrequest)
 	if err != nil {
@@ -4805,6 +4962,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/messages/{id}")
@@ -4942,6 +5100,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5083,9 +5242,8 @@
 }
 
 // Deleted sets the optional parameter "deleted": Mark the email as
-// permanently deleted (not TRASH) and only visible in Google Apps Vault
-// to a Vault administrator. Only used for Google Apps for Work
-// accounts.
+// permanently deleted (not TRASH) and only visible in Google Vault to a
+// Vault administrator. Only used for G Suite accounts.
 func (c *UsersMessagesImportCall) Deleted(deleted bool) *UsersMessagesImportCall {
 	c.urlParams_.Set("deleted", fmt.Sprint(deleted))
 	return c
@@ -5197,6 +5355,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.message)
 	if err != nil {
@@ -5325,7 +5484,7 @@
 	//   "parameters": {
 	//     "deleted": {
 	//       "default": "false",
-	//       "description": "Mark the email as permanently deleted (not TRASH) and only visible in Google Apps Vault to a Vault administrator. Only used for Google Apps for Work accounts.",
+	//       "description": "Mark the email as permanently deleted (not TRASH) and only visible in Google Vault to a Vault administrator. Only used for G Suite accounts.",
 	//       "location": "query",
 	//       "type": "boolean"
 	//     },
@@ -5407,9 +5566,8 @@
 }
 
 // Deleted sets the optional parameter "deleted": Mark the email as
-// permanently deleted (not TRASH) and only visible in Google Apps Vault
-// to a Vault administrator. Only used for Google Apps for Work
-// accounts.
+// permanently deleted (not TRASH) and only visible in Google Vault to a
+// Vault administrator. Only used for G Suite accounts.
 func (c *UsersMessagesInsertCall) Deleted(deleted bool) *UsersMessagesInsertCall {
 	c.urlParams_.Set("deleted", fmt.Sprint(deleted))
 	return c
@@ -5505,6 +5663,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.message)
 	if err != nil {
@@ -5633,7 +5792,7 @@
 	//   "parameters": {
 	//     "deleted": {
 	//       "default": "false",
-	//       "description": "Mark the email as permanently deleted (not TRASH) and only visible in Google Apps Vault to a Vault administrator. Only used for Google Apps for Work accounts.",
+	//       "description": "Mark the email as permanently deleted (not TRASH) and only visible in Google Vault to a Vault administrator. Only used for G Suite accounts.",
 	//       "location": "query",
 	//       "type": "boolean"
 	//     },
@@ -5773,6 +5932,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5957,6 +6117,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.modifymessagerequest)
 	if err != nil {
@@ -6154,6 +6315,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.message)
 	if err != nil {
@@ -6356,6 +6518,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/messages/{id}/trash")
@@ -6491,6 +6654,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/messages/{id}/untrash")
@@ -6639,6 +6803,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6796,6 +6961,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6937,6 +7103,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7078,6 +7245,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7219,6 +7387,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7353,6 +7522,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.autoforwarding)
 	if err != nil {
@@ -7487,6 +7657,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.imapsettings)
 	if err != nil {
@@ -7621,6 +7792,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.popsettings)
 	if err != nil {
@@ -7755,6 +7927,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.vacationsettings)
 	if err != nil {
@@ -7889,6 +8062,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.filter)
 	if err != nil {
@@ -8023,6 +8197,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/settings/filters/{id}")
@@ -8140,6 +8315,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8289,6 +8465,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8424,6 +8601,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.forwardingaddress)
 	if err != nil {
@@ -8559,6 +8737,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/settings/forwardingAddresses/{forwardingEmail}")
@@ -8676,6 +8855,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8825,6 +9005,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8964,6 +9145,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.sendas)
 	if err != nil {
@@ -9099,6 +9281,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/settings/sendAs/{sendAsEmail}")
@@ -9217,6 +9400,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9368,6 +9552,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -9504,6 +9689,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.sendas)
 	if err != nil {
@@ -9650,6 +9836,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.sendas)
 	if err != nil {
@@ -9794,6 +9981,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/settings/sendAs/{sendAsEmail}/verify")
@@ -9850,6 +10038,708 @@
 
 }
 
+// method id "gmail.users.settings.sendAs.smimeInfo.delete":
+
+type UsersSettingsSendAsSmimeInfoDeleteCall struct {
+	s           *Service
+	userId      string
+	sendAsEmail string
+	id          string
+	urlParams_  gensupport.URLParams
+	ctx_        context.Context
+	header_     http.Header
+}
+
+// Delete: Deletes the specified S/MIME config for the specified send-as
+// alias.
+func (r *UsersSettingsSendAsSmimeInfoService) Delete(userId string, sendAsEmail string, id string) *UsersSettingsSendAsSmimeInfoDeleteCall {
+	c := &UsersSettingsSendAsSmimeInfoDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.userId = userId
+	c.sendAsEmail = sendAsEmail
+	c.id = id
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *UsersSettingsSendAsSmimeInfoDeleteCall) Fields(s ...googleapi.Field) *UsersSettingsSendAsSmimeInfoDeleteCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *UsersSettingsSendAsSmimeInfoDeleteCall) Context(ctx context.Context) *UsersSettingsSendAsSmimeInfoDeleteCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *UsersSettingsSendAsSmimeInfoDeleteCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *UsersSettingsSendAsSmimeInfoDeleteCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("DELETE", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"userId":      c.userId,
+		"sendAsEmail": c.sendAsEmail,
+		"id":          c.id,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "gmail.users.settings.sendAs.smimeInfo.delete" call.
+func (c *UsersSettingsSendAsSmimeInfoDeleteCall) Do(opts ...googleapi.CallOption) error {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Deletes the specified S/MIME config for the specified send-as alias.",
+	//   "httpMethod": "DELETE",
+	//   "id": "gmail.users.settings.sendAs.smimeInfo.delete",
+	//   "parameterOrder": [
+	//     "userId",
+	//     "sendAsEmail",
+	//     "id"
+	//   ],
+	//   "parameters": {
+	//     "id": {
+	//       "description": "The immutable ID for the SmimeInfo.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "sendAsEmail": {
+	//       "description": "The email address that appears in the \"From:\" header for mail sent using this alias.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "default": "me",
+	//       "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/gmail.settings.basic",
+	//     "https://www.googleapis.com/auth/gmail.settings.sharing"
+	//   ]
+	// }
+
+}
+
+// method id "gmail.users.settings.sendAs.smimeInfo.get":
+
+type UsersSettingsSendAsSmimeInfoGetCall struct {
+	s            *Service
+	userId       string
+	sendAsEmail  string
+	id           string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// Get: Gets the specified S/MIME config for the specified send-as
+// alias.
+func (r *UsersSettingsSendAsSmimeInfoService) Get(userId string, sendAsEmail string, id string) *UsersSettingsSendAsSmimeInfoGetCall {
+	c := &UsersSettingsSendAsSmimeInfoGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.userId = userId
+	c.sendAsEmail = sendAsEmail
+	c.id = id
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *UsersSettingsSendAsSmimeInfoGetCall) Fields(s ...googleapi.Field) *UsersSettingsSendAsSmimeInfoGetCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *UsersSettingsSendAsSmimeInfoGetCall) IfNoneMatch(entityTag string) *UsersSettingsSendAsSmimeInfoGetCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *UsersSettingsSendAsSmimeInfoGetCall) Context(ctx context.Context) *UsersSettingsSendAsSmimeInfoGetCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *UsersSettingsSendAsSmimeInfoGetCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *UsersSettingsSendAsSmimeInfoGetCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"userId":      c.userId,
+		"sendAsEmail": c.sendAsEmail,
+		"id":          c.id,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "gmail.users.settings.sendAs.smimeInfo.get" call.
+// Exactly one of *SmimeInfo or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *SmimeInfo.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *UsersSettingsSendAsSmimeInfoGetCall) Do(opts ...googleapi.CallOption) (*SmimeInfo, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &SmimeInfo{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Gets the specified S/MIME config for the specified send-as alias.",
+	//   "httpMethod": "GET",
+	//   "id": "gmail.users.settings.sendAs.smimeInfo.get",
+	//   "parameterOrder": [
+	//     "userId",
+	//     "sendAsEmail",
+	//     "id"
+	//   ],
+	//   "parameters": {
+	//     "id": {
+	//       "description": "The immutable ID for the SmimeInfo.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "sendAsEmail": {
+	//       "description": "The email address that appears in the \"From:\" header for mail sent using this alias.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "default": "me",
+	//       "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}",
+	//   "response": {
+	//     "$ref": "SmimeInfo"
+	//   },
+	//   "scopes": [
+	//     "https://mail.google.com/",
+	//     "https://www.googleapis.com/auth/gmail.modify",
+	//     "https://www.googleapis.com/auth/gmail.readonly",
+	//     "https://www.googleapis.com/auth/gmail.settings.basic",
+	//     "https://www.googleapis.com/auth/gmail.settings.sharing"
+	//   ]
+	// }
+
+}
+
+// method id "gmail.users.settings.sendAs.smimeInfo.insert":
+
+type UsersSettingsSendAsSmimeInfoInsertCall struct {
+	s           *Service
+	userId      string
+	sendAsEmail string
+	smimeinfo   *SmimeInfo
+	urlParams_  gensupport.URLParams
+	ctx_        context.Context
+	header_     http.Header
+}
+
+// Insert: Insert (upload) the given S/MIME config for the specified
+// send-as alias. Note that pkcs12 format is required for the key.
+func (r *UsersSettingsSendAsSmimeInfoService) Insert(userId string, sendAsEmail string, smimeinfo *SmimeInfo) *UsersSettingsSendAsSmimeInfoInsertCall {
+	c := &UsersSettingsSendAsSmimeInfoInsertCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.userId = userId
+	c.sendAsEmail = sendAsEmail
+	c.smimeinfo = smimeinfo
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *UsersSettingsSendAsSmimeInfoInsertCall) Fields(s ...googleapi.Field) *UsersSettingsSendAsSmimeInfoInsertCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *UsersSettingsSendAsSmimeInfoInsertCall) Context(ctx context.Context) *UsersSettingsSendAsSmimeInfoInsertCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *UsersSettingsSendAsSmimeInfoInsertCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *UsersSettingsSendAsSmimeInfoInsertCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.smimeinfo)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"userId":      c.userId,
+		"sendAsEmail": c.sendAsEmail,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "gmail.users.settings.sendAs.smimeInfo.insert" call.
+// Exactly one of *SmimeInfo or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *SmimeInfo.ServerResponse.Header or (if a response was returned at
+// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
+// to check whether the returned error was because
+// http.StatusNotModified was returned.
+func (c *UsersSettingsSendAsSmimeInfoInsertCall) Do(opts ...googleapi.CallOption) (*SmimeInfo, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &SmimeInfo{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Insert (upload) the given S/MIME config for the specified send-as alias. Note that pkcs12 format is required for the key.",
+	//   "httpMethod": "POST",
+	//   "id": "gmail.users.settings.sendAs.smimeInfo.insert",
+	//   "parameterOrder": [
+	//     "userId",
+	//     "sendAsEmail"
+	//   ],
+	//   "parameters": {
+	//     "sendAsEmail": {
+	//       "description": "The email address that appears in the \"From:\" header for mail sent using this alias.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "default": "me",
+	//       "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo",
+	//   "request": {
+	//     "$ref": "SmimeInfo"
+	//   },
+	//   "response": {
+	//     "$ref": "SmimeInfo"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/gmail.settings.basic",
+	//     "https://www.googleapis.com/auth/gmail.settings.sharing"
+	//   ]
+	// }
+
+}
+
+// method id "gmail.users.settings.sendAs.smimeInfo.list":
+
+type UsersSettingsSendAsSmimeInfoListCall struct {
+	s            *Service
+	userId       string
+	sendAsEmail  string
+	urlParams_   gensupport.URLParams
+	ifNoneMatch_ string
+	ctx_         context.Context
+	header_      http.Header
+}
+
+// List: Lists S/MIME configs for the specified send-as alias.
+func (r *UsersSettingsSendAsSmimeInfoService) List(userId string, sendAsEmail string) *UsersSettingsSendAsSmimeInfoListCall {
+	c := &UsersSettingsSendAsSmimeInfoListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.userId = userId
+	c.sendAsEmail = sendAsEmail
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *UsersSettingsSendAsSmimeInfoListCall) Fields(s ...googleapi.Field) *UsersSettingsSendAsSmimeInfoListCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// IfNoneMatch sets the optional parameter which makes the operation
+// fail if the object's ETag matches the given value. This is useful for
+// getting updates only after the object has changed since the last
+// request. Use googleapi.IsNotModified to check whether the response
+// error from Do is the result of In-None-Match.
+func (c *UsersSettingsSendAsSmimeInfoListCall) IfNoneMatch(entityTag string) *UsersSettingsSendAsSmimeInfoListCall {
+	c.ifNoneMatch_ = entityTag
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *UsersSettingsSendAsSmimeInfoListCall) Context(ctx context.Context) *UsersSettingsSendAsSmimeInfoListCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *UsersSettingsSendAsSmimeInfoListCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *UsersSettingsSendAsSmimeInfoListCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	if c.ifNoneMatch_ != "" {
+		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
+	}
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("GET", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"userId":      c.userId,
+		"sendAsEmail": c.sendAsEmail,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "gmail.users.settings.sendAs.smimeInfo.list" call.
+// Exactly one of *ListSmimeInfoResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *ListSmimeInfoResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *UsersSettingsSendAsSmimeInfoListCall) Do(opts ...googleapi.CallOption) (*ListSmimeInfoResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ListSmimeInfoResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Lists S/MIME configs for the specified send-as alias.",
+	//   "httpMethod": "GET",
+	//   "id": "gmail.users.settings.sendAs.smimeInfo.list",
+	//   "parameterOrder": [
+	//     "userId",
+	//     "sendAsEmail"
+	//   ],
+	//   "parameters": {
+	//     "sendAsEmail": {
+	//       "description": "The email address that appears in the \"From:\" header for mail sent using this alias.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "default": "me",
+	//       "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo",
+	//   "response": {
+	//     "$ref": "ListSmimeInfoResponse"
+	//   },
+	//   "scopes": [
+	//     "https://mail.google.com/",
+	//     "https://www.googleapis.com/auth/gmail.modify",
+	//     "https://www.googleapis.com/auth/gmail.readonly",
+	//     "https://www.googleapis.com/auth/gmail.settings.basic",
+	//     "https://www.googleapis.com/auth/gmail.settings.sharing"
+	//   ]
+	// }
+
+}
+
+// method id "gmail.users.settings.sendAs.smimeInfo.setDefault":
+
+type UsersSettingsSendAsSmimeInfoSetDefaultCall struct {
+	s           *Service
+	userId      string
+	sendAsEmail string
+	id          string
+	urlParams_  gensupport.URLParams
+	ctx_        context.Context
+	header_     http.Header
+}
+
+// SetDefault: Sets the default S/MIME config for the specified send-as
+// alias.
+func (r *UsersSettingsSendAsSmimeInfoService) SetDefault(userId string, sendAsEmail string, id string) *UsersSettingsSendAsSmimeInfoSetDefaultCall {
+	c := &UsersSettingsSendAsSmimeInfoSetDefaultCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.userId = userId
+	c.sendAsEmail = sendAsEmail
+	c.id = id
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *UsersSettingsSendAsSmimeInfoSetDefaultCall) Fields(s ...googleapi.Field) *UsersSettingsSendAsSmimeInfoSetDefaultCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *UsersSettingsSendAsSmimeInfoSetDefaultCall) Context(ctx context.Context) *UsersSettingsSendAsSmimeInfoSetDefaultCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *UsersSettingsSendAsSmimeInfoSetDefaultCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *UsersSettingsSendAsSmimeInfoSetDefaultCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}/setDefault")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"userId":      c.userId,
+		"sendAsEmail": c.sendAsEmail,
+		"id":          c.id,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "gmail.users.settings.sendAs.smimeInfo.setDefault" call.
+func (c *UsersSettingsSendAsSmimeInfoSetDefaultCall) Do(opts ...googleapi.CallOption) error {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if err != nil {
+		return err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return err
+	}
+	return nil
+	// {
+	//   "description": "Sets the default S/MIME config for the specified send-as alias.",
+	//   "httpMethod": "POST",
+	//   "id": "gmail.users.settings.sendAs.smimeInfo.setDefault",
+	//   "parameterOrder": [
+	//     "userId",
+	//     "sendAsEmail",
+	//     "id"
+	//   ],
+	//   "parameters": {
+	//     "id": {
+	//       "description": "The immutable ID for the SmimeInfo.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "sendAsEmail": {
+	//       "description": "The email address that appears in the \"From:\" header for mail sent using this alias.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     },
+	//     "userId": {
+	//       "default": "me",
+	//       "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}/setDefault",
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/gmail.settings.basic",
+	//     "https://www.googleapis.com/auth/gmail.settings.sharing"
+	//   ]
+	// }
+
+}
+
 // method id "gmail.users.threads.delete":
 
 type UsersThreadsDeleteCall struct {
@@ -9901,6 +10791,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/threads/{id}")
@@ -10037,6 +10928,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10246,6 +11138,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10431,6 +11324,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.modifythreadrequest)
 	if err != nil {
@@ -10574,6 +11468,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/threads/{id}/trash")
@@ -10709,6 +11604,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{userId}/threads/{id}/untrash")
diff --git a/groupsmigration/v1/groupsmigration-gen.go b/groupsmigration/v1/groupsmigration-gen.go
index 127ef02..766de80 100644
--- a/groupsmigration/v1/groupsmigration-gen.go
+++ b/groupsmigration/v1/groupsmigration-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Archive *ArchiveService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewArchiveService(s *Service) *ArchiveService {
 	rs := &ArchiveService{s: s}
 	return rs
@@ -220,6 +225,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{groupId}/archive")
diff --git a/groupssettings/v1/groupssettings-gen.go b/groupssettings/v1/groupssettings-gen.go
index 0ea0f6b..174c448 100644
--- a/groupssettings/v1/groupssettings-gen.go
+++ b/groupssettings/v1/groupssettings-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Groups *GroupsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewGroupsService(s *Service) *GroupsService {
 	rs := &GroupsService{s: s}
 	return rs
@@ -290,6 +295,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -419,6 +425,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.groups)
 	if err != nil {
@@ -552,6 +559,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.groups)
 	if err != nil {
diff --git a/iam/v1/iam-api.json b/iam/v1/iam-api.json
index c7bac1e..2a2c387 100644
--- a/iam/v1/iam-api.json
+++ b/iam/v1/iam-api.json
@@ -1,875 +1,981 @@
 {
- "kind": "discovery#restDescription",
- "etag": "\"C5oy1hgQsABtYOYIOXWcR3BgYqU/bQX0iw41CX8vYvVm7WSKLdyxMvI\"",
- "discoveryVersion": "v1",
- "id": "iam:v1",
- "name": "iam",
- "canonicalName": "iam",
- "version": "v1",
- "revision": "20160915",
- "title": "Google Identity and Access Management (IAM) API",
- "description": "Manages identity and access control for Google Cloud Platform resources, including the creation of service accounts, which you can use to authenticate to Google and make API calls.",
- "ownerDomain": "google.com",
- "ownerName": "Google",
- "icons": {
-  "x16": "http://www.google.com/images/icons/product/search-16.gif",
-  "x32": "http://www.google.com/images/icons/product/search-32.gif"
- },
- "documentationLink": "https://cloud.google.com/iam/",
- "protocol": "rest",
- "baseUrl": "https://iam.googleapis.com/",
- "basePath": "",
- "rootUrl": "https://iam.googleapis.com/",
- "servicePath": "",
- "batchPath": "batch",
- "version_module": true,
- "parameters": {
-  "access_token": {
-   "type": "string",
-   "description": "OAuth access token.",
-   "location": "query"
-  },
-  "alt": {
-   "type": "string",
-   "description": "Data format for response.",
-   "default": "json",
-   "enumDescriptions": [
-    "Responses with Content-Type of application/json",
-    "Media download with context-dependent Content-Type",
-    "Responses with Content-Type of application/x-protobuf"
-   ],
-   "location": "query"
-  },
-  "bearer_token": {
-   "type": "string",
-   "description": "OAuth bearer token.",
-   "location": "query"
-  },
-  "callback": {
-   "type": "string",
-   "description": "JSONP",
-   "location": "query"
-  },
-  "fields": {
-   "type": "string",
-   "description": "Selector specifying which fields to include in a partial response.",
-   "location": "query"
-  },
-  "key": {
-   "type": "string",
-   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-   "location": "query"
-  },
-  "oauth_token": {
-   "type": "string",
-   "description": "OAuth 2.0 token for the current user.",
-   "location": "query"
-  },
-  "pp": {
-   "type": "boolean",
-   "description": "Pretty-print response.",
-   "default": "true",
-   "location": "query"
-  },
-  "prettyPrint": {
-   "type": "boolean",
-   "description": "Returns response with indentations and line breaks.",
-   "default": "true",
-   "location": "query"
-  },
-  "quotaUser": {
-   "type": "string",
-   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-   "location": "query"
-  },
-  "upload_protocol": {
-   "type": "string",
-   "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-   "location": "query"
-  },
-  "uploadType": {
-   "type": "string",
-   "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-   "location": "query"
-  },
-  "$.xgafv": {
-   "type": "string",
-   "description": "V1 error format.",
-   "enumDescriptions": [
-    "v1 error format",
-    "v2 error format"
-   ],
-   "location": "query"
-  }
- },
- "auth": {
-  "oauth2": {
-   "scopes": {
-    "https://www.googleapis.com/auth/cloud-platform": {
-     "description": "View and manage your data across Google Cloud Platform services"
+  "discoveryVersion": "v1",
+  "version_module": "True",
+  "schemas": {
+    "ListServiceAccountKeysResponse": {
+      "description": "The service account keys list response.",
+      "type": "object",
+      "properties": {
+        "keys": {
+          "description": "The public keys for the service account.",
+          "type": "array",
+          "items": {
+            "$ref": "ServiceAccountKey"
+          }
+        }
+      },
+      "id": "ListServiceAccountKeysResponse"
+    },
+    "TestIamPermissionsResponse": {
+      "description": "Response message for `TestIamPermissions` method.",
+      "type": "object",
+      "properties": {
+        "permissions": {
+          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "TestIamPermissionsResponse"
+    },
+    "ServiceAccountKey": {
+      "description": "Represents a service account key.\n\nA service account has two sets of key-pairs: user-managed, and\nsystem-managed.\n\nUser-managed key-pairs can be created and deleted by users.  Users are\nresponsible for rotating these keys periodically to ensure security of\ntheir service accounts.  Users retain the private key of these key-pairs,\nand Google retains ONLY the public key.\n\nSystem-managed key-pairs are managed automatically by Google, and rotated\ndaily without user intervention.  The private key never leaves Google's\nservers to maximize security.\n\nPublic keys for all service accounts are also published at the OAuth2\nService Account API.",
+      "type": "object",
+      "properties": {
+        "privateKeyData": {
+          "description": "The private key data. Only provided in `CreateServiceAccountKey`\nresponses.",
+          "format": "byte",
+          "type": "string"
+        },
+        "publicKeyData": {
+          "description": "The public key data. Only provided in `GetServiceAccountKey` responses.",
+          "format": "byte",
+          "type": "string"
+        },
+        "name": {
+          "description": "The resource name of the service account key in the following format\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}/keys/{key}`.",
+          "type": "string"
+        },
+        "validBeforeTime": {
+          "description": "The key can be used before this timestamp.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "keyAlgorithm": {
+          "description": "Specifies the algorithm (and possibly key size) for the key.",
+          "type": "string",
+          "enumDescriptions": [
+            "An unspecified key algorithm.",
+            "1k RSA Key.",
+            "2k RSA Key."
+          ],
+          "enum": [
+            "KEY_ALG_UNSPECIFIED",
+            "KEY_ALG_RSA_1024",
+            "KEY_ALG_RSA_2048"
+          ]
+        },
+        "privateKeyType": {
+          "enumDescriptions": [
+            "Unspecified. Equivalent to `TYPE_GOOGLE_CREDENTIALS_FILE`.",
+            "PKCS12 format.\nThe password for the PKCS12 file is `notasecret`.\nFor more information, see https://tools.ietf.org/html/rfc7292.",
+            "Google Credentials File format."
+          ],
+          "enum": [
+            "TYPE_UNSPECIFIED",
+            "TYPE_PKCS12_FILE",
+            "TYPE_GOOGLE_CREDENTIALS_FILE"
+          ],
+          "description": "The output format for the private key.\nOnly provided in `CreateServiceAccountKey` responses, not\nin `GetServiceAccountKey` or `ListServiceAccountKey` responses.\n\nGoogle never exposes system-managed private keys, and never retains\nuser-managed private keys.",
+          "type": "string"
+        },
+        "validAfterTime": {
+          "description": "The key can be used after this timestamp.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "ServiceAccountKey"
+    },
+    "CreateServiceAccountKeyRequest": {
+      "description": "The service account key create request.",
+      "type": "object",
+      "properties": {
+        "keyAlgorithm": {
+          "description": "Which type of key and algorithm to use for the key.\nThe default is currently a 4K RSA key.  However this may change in the\nfuture.",
+          "type": "string",
+          "enumDescriptions": [
+            "An unspecified key algorithm.",
+            "1k RSA Key.",
+            "2k RSA Key."
+          ],
+          "enum": [
+            "KEY_ALG_UNSPECIFIED",
+            "KEY_ALG_RSA_1024",
+            "KEY_ALG_RSA_2048"
+          ]
+        },
+        "privateKeyType": {
+          "description": "The output format of the private key. `GOOGLE_CREDENTIALS_FILE` is the\ndefault output format.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified. Equivalent to `TYPE_GOOGLE_CREDENTIALS_FILE`.",
+            "PKCS12 format.\nThe password for the PKCS12 file is `notasecret`.\nFor more information, see https://tools.ietf.org/html/rfc7292.",
+            "Google Credentials File format."
+          ],
+          "enum": [
+            "TYPE_UNSPECIFIED",
+            "TYPE_PKCS12_FILE",
+            "TYPE_GOOGLE_CREDENTIALS_FILE"
+          ]
+        }
+      },
+      "id": "CreateServiceAccountKeyRequest"
+    },
+    "TestIamPermissionsRequest": {
+      "description": "Request message for `TestIamPermissions` method.",
+      "type": "object",
+      "properties": {
+        "permissions": {
+          "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "TestIamPermissionsRequest"
+    },
+    "SignBlobResponse": {
+      "description": "The service account sign blob response.",
+      "type": "object",
+      "properties": {
+        "signature": {
+          "description": "The signed blob.",
+          "format": "byte",
+          "type": "string"
+        },
+        "keyId": {
+          "description": "The id of the key used to sign the blob.",
+          "type": "string"
+        }
+      },
+      "id": "SignBlobResponse"
+    },
+    "SignJwtResponse": {
+      "description": "The service account sign JWT response.",
+      "type": "object",
+      "properties": {
+        "keyId": {
+          "description": "The id of the key used to sign the JWT.",
+          "type": "string"
+        },
+        "signedJwt": {
+          "description": "The signed JWT.",
+          "type": "string"
+        }
+      },
+      "id": "SignJwtResponse"
+    },
+    "Policy": {
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
+      "type": "object",
+      "properties": {
+        "etag": {
+          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
+          "format": "byte",
+          "type": "string"
+        },
+        "version": {
+          "description": "Version of the `Policy`. The default version is 0.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "bindings": {
+          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
+          "type": "array",
+          "items": {
+            "$ref": "Binding"
+          }
+        }
+      },
+      "id": "Policy"
+    },
+    "SignJwtRequest": {
+      "description": "The service account sign JWT request.",
+      "type": "object",
+      "properties": {
+        "payload": {
+          "description": "The JWT payload to sign, a JSON JWT Claim set.",
+          "type": "string"
+        }
+      },
+      "id": "SignJwtRequest"
+    },
+    "AuditData": {
+      "description": "Audit log information specific to Cloud IAM. This message is serialized\nas an `Any` type in the `ServiceData` message of an\n`AuditLog` message.",
+      "type": "object",
+      "properties": {
+        "policyDelta": {
+          "description": "Policy delta between the original policy and the newly set policy.",
+          "$ref": "PolicyDelta"
+        }
+      },
+      "id": "AuditData"
+    },
+    "BindingDelta": {
+      "description": "One delta entry for Binding. Each individual change (only one member in each\nentry) to a binding will be a separate entry.",
+      "type": "object",
+      "properties": {
+        "role": {
+          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
+          "type": "string"
+        },
+        "action": {
+          "description": "The action that was performed on a Binding.\nRequired",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified.",
+            "Addition of a Binding.",
+            "Removal of a Binding."
+          ],
+          "enum": [
+            "ACTION_UNSPECIFIED",
+            "ADD",
+            "REMOVE"
+          ]
+        },
+        "member": {
+          "description": "A single identity requesting access for a Cloud Platform resource.\nFollows the same format of Binding.members.\nRequired",
+          "type": "string"
+        }
+      },
+      "id": "BindingDelta"
+    },
+    "PolicyDelta": {
+      "description": "The difference delta between two policies.",
+      "type": "object",
+      "properties": {
+        "bindingDeltas": {
+          "description": "The delta for Bindings between two policies.",
+          "type": "array",
+          "items": {
+            "$ref": "BindingDelta"
+          }
+        }
+      },
+      "id": "PolicyDelta"
+    },
+    "ListServiceAccountsResponse": {
+      "description": "The service account list response.",
+      "type": "object",
+      "properties": {
+        "nextPageToken": {
+          "description": "To retrieve the next page of results, set\nListServiceAccountsRequest.page_token\nto this value.",
+          "type": "string"
+        },
+        "accounts": {
+          "description": "The list of matching service accounts.",
+          "type": "array",
+          "items": {
+            "$ref": "ServiceAccount"
+          }
+        }
+      },
+      "id": "ListServiceAccountsResponse"
+    },
+    "CreateServiceAccountRequest": {
+      "description": "The service account create request.",
+      "type": "object",
+      "properties": {
+        "accountId": {
+          "description": "Required. The account id that is used to generate the service account\nemail address and a stable unique id. It is unique within a project,\nmust be 6-30 characters long, and match the regular expression\n`[a-z]([-a-z0-9]*[a-z0-9])` to comply with RFC1035.",
+          "type": "string"
+        },
+        "serviceAccount": {
+          "description": "The ServiceAccount resource to create.\nCurrently, only the following values are user assignable:\n`display_name` .",
+          "$ref": "ServiceAccount"
+        }
+      },
+      "id": "CreateServiceAccountRequest"
+    },
+    "QueryGrantableRolesResponse": {
+      "description": "The grantable role query response.",
+      "type": "object",
+      "properties": {
+        "roles": {
+          "description": "The list of matching roles.",
+          "type": "array",
+          "items": {
+            "$ref": "Role"
+          }
+        }
+      },
+      "id": "QueryGrantableRolesResponse"
+    },
+    "SignBlobRequest": {
+      "description": "The service account sign blob request.",
+      "type": "object",
+      "properties": {
+        "bytesToSign": {
+          "description": "The bytes to sign.",
+          "format": "byte",
+          "type": "string"
+        }
+      },
+      "id": "SignBlobRequest"
+    },
+    "Role": {
+      "description": "A role in the Identity and Access Management API.",
+      "type": "object",
+      "properties": {
+        "description": {
+          "description": "Optional.  A human-readable description for the role.",
+          "type": "string"
+        },
+        "title": {
+          "description": "Optional.  A human-readable title for the role.  Typically this\nis limited to 100 UTF-8 bytes.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The name of the role.\n\nWhen Role is used in CreateRole, the role name must not be set.\n\nWhen Role is used in output and other input such as UpdateRole, the role\nname is the complete path, e.g., roles/logging.viewer for curated roles\nand organizations/{ORGANIZATION_ID}/roles/logging.viewer for custom roles.",
+          "type": "string"
+        }
+      },
+      "id": "Role"
+    },
+    "SetIamPolicyRequest": {
+      "description": "Request message for `SetIamPolicy` method.",
+      "type": "object",
+      "properties": {
+        "policy": {
+          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them.",
+          "$ref": "Policy"
+        }
+      },
+      "id": "SetIamPolicyRequest"
+    },
+    "Binding": {
+      "description": "Associates `members` with a `role`.",
+      "type": "object",
+      "properties": {
+        "members": {
+          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "role": {
+          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
+          "type": "string"
+        }
+      },
+      "id": "Binding"
+    },
+    "ServiceAccount": {
+      "description": "A service account in the Identity and Access Management API.\n\nTo create a service account, specify the `project_id` and the `account_id`\nfor the account.  The `account_id` is unique within the project, and is used\nto generate the service account email address and a stable\n`unique_id`.\n\nIf the account already exists, the account's resource name is returned\nin util::Status's ResourceInfo.resource_name in the format of\nprojects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}. The caller can\nuse the name in other methods to access the account.\n\nAll other methods can identify the service account using the format\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
+      "type": "object",
+      "properties": {
+        "oauth2ClientId": {
+          "description": "@OutputOnly. The OAuth2 client id for the service account.\nThis is used in conjunction with the OAuth2 clientconfig API to make\nthree legged OAuth2 (3LO) flows to access the data of Google users.",
+          "type": "string"
+        },
+        "uniqueId": {
+          "description": "@OutputOnly The unique and stable id of the service account.",
+          "type": "string"
+        },
+        "displayName": {
+          "description": "Optional. A user-specified description of the service account.  Must be\nfewer than 100 UTF-8 bytes.",
+          "type": "string"
+        },
+        "etag": {
+          "description": "Used to perform a consistent read-modify-write.",
+          "format": "byte",
+          "type": "string"
+        },
+        "email": {
+          "description": "@OutputOnly The email address of the service account.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\n\nRequests using `-` as a wildcard for the project will infer the project\nfrom the `account` and the `account` value can be the `email` address or\nthe `unique_id` of the service account.\n\nIn responses the resource name will always be in the format\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.",
+          "type": "string"
+        },
+        "projectId": {
+          "description": "@OutputOnly The id of the project that owns the service account.",
+          "type": "string"
+        }
+      },
+      "id": "ServiceAccount"
+    },
+    "Empty": {
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
+      "type": "object",
+      "properties": {},
+      "id": "Empty"
+    },
+    "QueryGrantableRolesRequest": {
+      "description": "The grantable role query request.",
+      "type": "object",
+      "properties": {
+        "fullResourceName": {
+          "description": "Required. The full resource name to query from the list of grantable roles.\n\nThe name follows the Google Cloud Platform resource format.\nFor example, a Cloud Platform project with id `my-project` will be named\n`//cloudresourcemanager.googleapis.com/projects/my-project`.",
+          "type": "string"
+        }
+      },
+      "id": "QueryGrantableRolesRequest"
     }
-   }
-  }
- },
- "schemas": {
-  "ListServiceAccountsResponse": {
-   "id": "ListServiceAccountsResponse",
-   "type": "object",
-   "description": "The service account list response.",
-   "properties": {
-    "accounts": {
-     "type": "array",
-     "description": "The list of matching service accounts.",
-     "items": {
-      "$ref": "ServiceAccount"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "To retrieve the next page of results, set ListServiceAccountsRequest.page_token to this value."
+  },
+  "protocol": "rest",
+  "icons": {
+    "x32": "http://www.google.com/images/icons/product/search-32.gif",
+    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+  },
+  "canonicalName": "iam",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
     }
-   }
   },
-  "ServiceAccount": {
-   "id": "ServiceAccount",
-   "type": "object",
-   "description": "A service account in the Identity and Access Management API. To create a service account, specify the `project_id` and the `account_id` for the account. The `account_id` is unique within the project, and is used to generate the service account email address and a stable `unique_id`. If the account already exists, the account's resource name is returned in util::Status's ResourceInfo.resource_name in the format of projects/{project}/serviceAccounts/{email}. The caller can use the name in other methods to access the account. All other methods can identify the service account using the format `projects/{project}/serviceAccounts/{account}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Requests using `-` as a wildcard for the project will infer the project from the `account` and the `account` value can be the `email` address or the `unique_id` of the service account. In responses the resource name will always be in the format `projects/{project}/serviceAccounts/{email}`."
+  "rootUrl": "https://iam.googleapis.com/",
+  "ownerDomain": "google.com",
+  "name": "iam",
+  "batchPath": "batch",
+  "title": "Google Identity and Access Management (IAM) API",
+  "ownerName": "Google",
+  "resources": {
+    "projects": {
+      "resources": {
+        "serviceAccounts": {
+          "methods": {
+            "testIamPermissions": {
+              "response": {
+                "$ref": "TestIamPermissionsResponse"
+              },
+              "parameterOrder": [
+                "resource"
+              ],
+              "httpMethod": "POST",
+              "parameters": {
+                "resource": {
+                  "location": "path",
+                  "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:testIamPermissions",
+              "path": "v1/{+resource}:testIamPermissions",
+              "id": "iam.projects.serviceAccounts.testIamPermissions",
+              "request": {
+                "$ref": "TestIamPermissionsRequest"
+              },
+              "description": "Tests the specified permissions against the IAM access control policy\nfor a ServiceAccount."
+            },
+            "delete": {
+              "description": "Deletes a ServiceAccount.",
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "DELETE",
+              "parameters": {
+                "name": {
+                  "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}",
+              "path": "v1/{+name}",
+              "id": "iam.projects.serviceAccounts.delete"
+            },
+            "list": {
+              "description": "Lists ServiceAccounts for a project.",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "ListServiceAccountsResponse"
+              },
+              "parameters": {
+                "name": {
+                  "location": "path",
+                  "description": "Required. The resource name of the project associated with the service\naccounts, such as `projects/my-project-123`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                },
+                "pageToken": {
+                  "location": "query",
+                  "description": "Optional pagination token returned in an earlier\nListServiceAccountsResponse.next_page_token.",
+                  "type": "string"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "Optional limit on the number of service accounts to include in the\nresponse. Further accounts can subsequently be obtained by including the\nListServiceAccountsResponse.next_page_token\nin a subsequent request.",
+                  "format": "int32",
+                  "type": "integer"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1/projects/{projectsId}/serviceAccounts",
+              "id": "iam.projects.serviceAccounts.list",
+              "path": "v1/{+name}/serviceAccounts"
+            },
+            "signBlob": {
+              "request": {
+                "$ref": "SignBlobRequest"
+              },
+              "description": "Signs a blob using a service account's system-managed private key.",
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "SignBlobResponse"
+              },
+              "parameters": {
+                "name": {
+                  "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:signBlob",
+              "id": "iam.projects.serviceAccounts.signBlob",
+              "path": "v1/{+name}:signBlob"
+            },
+            "create": {
+              "flatPath": "v1/projects/{projectsId}/serviceAccounts",
+              "path": "v1/{+name}/serviceAccounts",
+              "id": "iam.projects.serviceAccounts.create",
+              "request": {
+                "$ref": "CreateServiceAccountRequest"
+              },
+              "description": "Creates a ServiceAccount\nand returns it.",
+              "response": {
+                "$ref": "ServiceAccount"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "POST",
+              "parameters": {
+                "name": {
+                  "location": "path",
+                  "description": "Required. The resource name of the project associated with the service\naccounts, such as `projects/my-project-123`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ]
+            },
+            "signJwt": {
+              "description": "Signs a JWT using a service account's system-managed private key.\n\nIf no expiry time (`exp`) is provided in the `SignJwtRequest`, IAM sets an\nan expiry time of one hour by default. If you request an expiry time of\nmore than one hour, the request will fail.",
+              "request": {
+                "$ref": "SignJwtRequest"
+              },
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "SignJwtResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "name": {
+                  "location": "path",
+                  "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$"
+                }
+              },
+              "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:signJwt",
+              "id": "iam.projects.serviceAccounts.signJwt",
+              "path": "v1/{+name}:signJwt"
+            },
+            "setIamPolicy": {
+              "description": "Sets the IAM access control policy for a\nServiceAccount.",
+              "request": {
+                "$ref": "SetIamPolicyRequest"
+              },
+              "response": {
+                "$ref": "Policy"
+              },
+              "parameterOrder": [
+                "resource"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "resource": {
+                  "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:setIamPolicy",
+              "path": "v1/{+resource}:setIamPolicy",
+              "id": "iam.projects.serviceAccounts.setIamPolicy"
+            },
+            "getIamPolicy": {
+              "description": "Returns the IAM access control policy for a\nServiceAccount.",
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "resource"
+              ],
+              "response": {
+                "$ref": "Policy"
+              },
+              "parameters": {
+                "resource": {
+                  "location": "path",
+                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:getIamPolicy",
+              "id": "iam.projects.serviceAccounts.getIamPolicy",
+              "path": "v1/{+resource}:getIamPolicy"
+            },
+            "get": {
+              "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}",
+              "id": "iam.projects.serviceAccounts.get",
+              "path": "v1/{+name}",
+              "description": "Gets a ServiceAccount.",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "ServiceAccount"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
+                  "location": "path"
+                }
+              }
+            },
+            "update": {
+              "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}",
+              "id": "iam.projects.serviceAccounts.update",
+              "path": "v1/{+name}",
+              "description": "Updates a ServiceAccount.\n\nCurrently, only the following fields are updatable:\n`display_name` .\nThe `etag` is mandatory.",
+              "request": {
+                "$ref": "ServiceAccount"
+              },
+              "httpMethod": "PUT",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "ServiceAccount"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\n\nRequests using `-` as a wildcard for the project will infer the project\nfrom the `account` and the `account` value can be the `email` address or\nthe `unique_id` of the service account.\n\nIn responses the resource name will always be in the format\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
+                  "location": "path"
+                }
+              }
+            }
+          },
+          "resources": {
+            "keys": {
+              "methods": {
+                "delete": {
+                  "httpMethod": "DELETE",
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "response": {
+                    "$ref": "Empty"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "location": "path",
+                      "description": "The resource name of the service account key in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}/keys/{key}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/serviceAccounts/[^/]+/keys/[^/]+$"
+                    }
+                  },
+                  "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys/{keysId}",
+                  "id": "iam.projects.serviceAccounts.keys.delete",
+                  "path": "v1/{+name}",
+                  "description": "Deletes a ServiceAccountKey."
+                },
+                "list": {
+                  "description": "Lists ServiceAccountKeys.",
+                  "response": {
+                    "$ref": "ListServiceAccountKeysResponse"
+                  },
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "httpMethod": "GET",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "location": "path",
+                      "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\n\nUsing `-` as a wildcard for the project, will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$"
+                    },
+                    "keyTypes": {
+                      "description": "Filters the types of keys the user wants to include in the list\nresponse. Duplicate key types are not allowed. If no key type\nis provided, all keys are returned.",
+                      "type": "string",
+                      "repeated": true,
+                      "location": "query",
+                      "enum": [
+                        "KEY_TYPE_UNSPECIFIED",
+                        "USER_MANAGED",
+                        "SYSTEM_MANAGED"
+                      ]
+                    }
+                  },
+                  "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys",
+                  "path": "v1/{+name}/keys",
+                  "id": "iam.projects.serviceAccounts.keys.list"
+                },
+                "get": {
+                  "description": "Gets the ServiceAccountKey\nby key id.",
+                  "httpMethod": "GET",
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "response": {
+                    "$ref": "ServiceAccountKey"
+                  },
+                  "parameters": {
+                    "publicKeyType": {
+                      "location": "query",
+                      "enum": [
+                        "TYPE_NONE",
+                        "TYPE_X509_PEM_FILE",
+                        "TYPE_RAW_PUBLIC_KEY"
+                      ],
+                      "description": "The output format of the public key requested.\nX509_PEM is the default output format.",
+                      "type": "string"
+                    },
+                    "name": {
+                      "location": "path",
+                      "description": "The resource name of the service account key in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}/keys/{key}`.\n\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/serviceAccounts/[^/]+/keys/[^/]+$"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys/{keysId}",
+                  "id": "iam.projects.serviceAccounts.keys.get",
+                  "path": "v1/{+name}"
+                },
+                "create": {
+                  "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys",
+                  "path": "v1/{+name}/keys",
+                  "id": "iam.projects.serviceAccounts.keys.create",
+                  "request": {
+                    "$ref": "CreateServiceAccountKeyRequest"
+                  },
+                  "description": "Creates a ServiceAccountKey\nand returns it.",
+                  "response": {
+                    "$ref": "ServiceAccountKey"
+                  },
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "httpMethod": "POST",
+                  "parameters": {
+                    "name": {
+                      "location": "path",
+                      "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ]
+                }
+              }
+            }
+          }
+        }
+      }
     },
-    "projectId": {
-     "type": "string",
-     "description": "@OutputOnly The id of the project that owns the service account."
-    },
-    "uniqueId": {
-     "type": "string",
-     "description": "@OutputOnly The unique and stable id of the service account."
-    },
-    "email": {
-     "type": "string",
-     "description": "@OutputOnly The email address of the service account."
-    },
-    "displayName": {
-     "type": "string",
-     "description": "Optional. A user-specified description of the service account. Must be fewer than 100 UTF-8 bytes."
-    },
-    "etag": {
-     "type": "string",
-     "description": "Used to perform a consistent read-modify-write.",
-     "format": "byte"
-    },
-    "oauth2ClientId": {
-     "type": "string",
-     "description": "@OutputOnly. The OAuth2 client id for the service account. This is used in conjunction with the OAuth2 clientconfig API to make three legged OAuth2 (3LO) flows to access the data of Google users."
-    }
-   }
-  },
-  "CreateServiceAccountRequest": {
-   "id": "CreateServiceAccountRequest",
-   "type": "object",
-   "description": "The service account create request.",
-   "properties": {
-    "accountId": {
-     "type": "string",
-     "description": "Required. The account id that is used to generate the service account email address and a stable unique id. It is unique within a project, must be 6-30 characters long, and match the regular expression `[a-z]([-a-z0-9]*[a-z0-9])` to comply with RFC1035."
-    },
-    "serviceAccount": {
-     "$ref": "ServiceAccount",
-     "description": "The ServiceAccount resource to create. Currently, only the following values are user assignable: `display_name` ."
-    }
-   }
-  },
-  "Empty": {
-   "id": "Empty",
-   "type": "object",
-   "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance: service Foo { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); } The JSON representation for `Empty` is empty JSON object `{}`."
-  },
-  "ListServiceAccountKeysResponse": {
-   "id": "ListServiceAccountKeysResponse",
-   "type": "object",
-   "description": "The service account keys list response.",
-   "properties": {
-    "keys": {
-     "type": "array",
-     "description": "The public keys for the service account.",
-     "items": {
-      "$ref": "ServiceAccountKey"
-     }
-    }
-   }
-  },
-  "ServiceAccountKey": {
-   "id": "ServiceAccountKey",
-   "type": "object",
-   "description": "Represents a service account key. A service account has two sets of key-pairs: user-managed, and system-managed. User-managed key-pairs can be created and deleted by users. Users are responsible for rotating these keys periodically to ensure security of their service accounts. Users retain the private key of these key-pairs, and Google retains ONLY the public key. System-managed key-pairs are managed automatically by Google, and rotated daily without user intervention. The private key never leaves Google's servers to maximize security. Public keys for all service accounts are also published at the OAuth2 Service Account API.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "The resource name of the service account key in the following format `projects/{project}/serviceAccounts/{account}/keys/{key}`."
-    },
-    "privateKeyType": {
-     "type": "string",
-     "description": "The output format for the private key. Only provided in `CreateServiceAccountKey` responses, not in `GetServiceAccountKey` or `ListServiceAccountKey` responses. Google never exposes system-managed private keys, and never retains user-managed private keys.",
-     "enum": [
-      "TYPE_UNSPECIFIED",
-      "TYPE_PKCS12_FILE",
-      "TYPE_GOOGLE_CREDENTIALS_FILE"
-     ]
-    },
-    "keyAlgorithm": {
-     "type": "string",
-     "description": "Specifies the algorithm (and possibly key size) for the key.",
-     "enum": [
-      "KEY_ALG_UNSPECIFIED",
-      "KEY_ALG_RSA_1024",
-      "KEY_ALG_RSA_2048"
-     ]
-    },
-    "privateKeyData": {
-     "type": "string",
-     "description": "The private key data. Only provided in `CreateServiceAccountKey` responses.",
-     "format": "byte"
-    },
-    "publicKeyData": {
-     "type": "string",
-     "description": "The public key data. Only provided in `GetServiceAccountKey` responses.",
-     "format": "byte"
-    },
-    "validAfterTime": {
-     "type": "string",
-     "description": "The key can be used after this timestamp."
-    },
-    "validBeforeTime": {
-     "type": "string",
-     "description": "The key can be used before this timestamp."
-    }
-   }
-  },
-  "CreateServiceAccountKeyRequest": {
-   "id": "CreateServiceAccountKeyRequest",
-   "type": "object",
-   "description": "The service account key create request.",
-   "properties": {
-    "privateKeyType": {
-     "type": "string",
-     "description": "The output format of the private key. `GOOGLE_CREDENTIALS_FILE` is the default output format.",
-     "enum": [
-      "TYPE_UNSPECIFIED",
-      "TYPE_PKCS12_FILE",
-      "TYPE_GOOGLE_CREDENTIALS_FILE"
-     ]
-    },
-    "keyAlgorithm": {
-     "type": "string",
-     "description": "Which type of key and algorithm to use for the key. The default is currently a 4K RSA key. However this may change in the future.",
-     "enum": [
-      "KEY_ALG_UNSPECIFIED",
-      "KEY_ALG_RSA_1024",
-      "KEY_ALG_RSA_2048"
-     ]
-    }
-   }
-  },
-  "SignBlobRequest": {
-   "id": "SignBlobRequest",
-   "type": "object",
-   "description": "The service account sign blob request.",
-   "properties": {
-    "bytesToSign": {
-     "type": "string",
-     "description": "The bytes to sign.",
-     "format": "byte"
-    }
-   }
-  },
-  "SignBlobResponse": {
-   "id": "SignBlobResponse",
-   "type": "object",
-   "description": "The service account sign blob response.",
-   "properties": {
-    "keyId": {
-     "type": "string",
-     "description": "The id of the key used to sign the blob."
-    },
-    "signature": {
-     "type": "string",
-     "description": "The signed blob.",
-     "format": "byte"
-    }
-   }
-  },
-  "Policy": {
-   "id": "Policy",
-   "type": "object",
-   "description": "Defines an Identity and Access Management (IAM) policy. It is used to specify access control policies for Cloud Platform resources. A `Policy` consists of a list of `bindings`. A `Binding` binds a list of `members` to a `role`, where the members can be user accounts, Google groups, Google domains, and service accounts. A `role` is a named list of permissions defined by IAM. **Example** { \"bindings\": [ { \"role\": \"roles/owner\", \"members\": [ \"user:mike@example.com\", \"group:admins@example.com\", \"domain:google.com\", \"serviceAccount:my-other-app@appspot.gserviceaccount.com\", ] }, { \"role\": \"roles/viewer\", \"members\": [\"user:sean@example.com\"] } ] } For a description of IAM and its features, see the [IAM developer's guide](https://cloud.google.com/iam).",
-   "properties": {
-    "version": {
-     "type": "integer",
-     "description": "Version of the `Policy`. The default version is 0.",
-     "format": "int32"
-    },
-    "bindings": {
-     "type": "array",
-     "description": "Associates a list of `members` to a `role`. Multiple `bindings` must not be specified for the same `role`. `bindings` with no members will result in an error.",
-     "items": {
-      "$ref": "Binding"
-     }
-    },
-    "etag": {
-     "type": "string",
-     "description": "`etag` is used for optimistic concurrency control as a way to help prevent simultaneous updates of a policy from overwriting each other. It is strongly suggested that systems make use of the `etag` in the read-modify-write cycle to perform policy updates in order to avoid race conditions: An `etag` is returned in the response to `getIamPolicy`, and systems are expected to put that etag in the request to `setIamPolicy` to ensure that their change will be applied to the same version of the policy. If no `etag` is provided in the call to `setIamPolicy`, then the existing policy is overwritten blindly.",
-     "format": "byte"
-    }
-   }
-  },
-  "Binding": {
-   "id": "Binding",
-   "type": "object",
-   "description": "Associates `members` with a `role`.",
-   "properties": {
-    "role": {
-     "type": "string",
-     "description": "Role that is assigned to `members`. For example, `roles/viewer`, `roles/editor`, or `roles/owner`. Required"
-    },
-    "members": {
-     "type": "array",
-     "description": "Specifies the identities requesting access for a Cloud Platform resource. `members` can have the following values: * `allUsers`: A special identifier that represents anyone who is on the internet; with or without a Google account. * `allAuthenticatedUsers`: A special identifier that represents anyone who is authenticated with a Google account or a service account. * `user:{emailid}`: An email address that represents a specific Google account. For example, `alice@gmail.com` or `joe@example.com`. * `serviceAccount:{emailid}`: An email address that represents a service account. For example, `my-other-app@appspot.gserviceaccount.com`. * `group:{emailid}`: An email address that represents a Google group. For example, `admins@example.com`. * `domain:{domain}`: A Google Apps domain name that represents all the users of that domain. For example, `google.com` or `example.com`.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "SetIamPolicyRequest": {
-   "id": "SetIamPolicyRequest",
-   "type": "object",
-   "description": "Request message for `SetIamPolicy` method.",
-   "properties": {
-    "policy": {
-     "$ref": "Policy",
-     "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of the policy is limited to a few 10s of KB. An empty policy is a valid policy but certain Cloud Platform services (such as Projects) might reject them."
-    }
-   }
-  },
-  "TestIamPermissionsRequest": {
-   "id": "TestIamPermissionsRequest",
-   "type": "object",
-   "description": "Request message for `TestIamPermissions` method.",
-   "properties": {
-    "permissions": {
-     "type": "array",
-     "description": "The set of permissions to check for the `resource`. Permissions with wildcards (such as '*' or 'storage.*') are not allowed. For more information see [IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "TestIamPermissionsResponse": {
-   "id": "TestIamPermissionsResponse",
-   "type": "object",
-   "description": "Response message for `TestIamPermissions` method.",
-   "properties": {
-    "permissions": {
-     "type": "array",
-     "description": "A subset of `TestPermissionsRequest.permissions` that the caller is allowed.",
-     "items": {
-      "type": "string"
-     }
-    }
-   }
-  },
-  "QueryGrantableRolesRequest": {
-   "id": "QueryGrantableRolesRequest",
-   "type": "object",
-   "description": "The grantable role query request.",
-   "properties": {
-    "fullResourceName": {
-     "type": "string",
-     "description": "Required. The full resource name to query from the list of grantable roles. The name follows the Google Cloud Platform resource format. For example, a Cloud Platform project with id `my-project` will be named `//cloudresourcemanager.googleapis.com/projects/my-project`."
-    }
-   }
-  },
-  "QueryGrantableRolesResponse": {
-   "id": "QueryGrantableRolesResponse",
-   "type": "object",
-   "description": "The grantable role query response.",
-   "properties": {
     "roles": {
-     "type": "array",
-     "description": "The list of matching roles.",
-     "items": {
-      "$ref": "Role"
-     }
-    }
-   }
-  },
-  "Role": {
-   "id": "Role",
-   "type": "object",
-   "description": "A role in the Identity and Access Management API.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "The name of the role. When Role is used in CreateRole, the role name must not be set. When Role is used in output and other input such as UpdateRole, the role name is the complete path, e.g., roles/logging.viewer for curated roles and organizations/{organization-id}/roles/logging.viewer for custom roles."
-    },
-    "title": {
-     "type": "string",
-     "description": "Optional. A human-readable title for the role. Typically this is limited to 100 UTF-8 bytes."
-    },
-    "description": {
-     "type": "string",
-     "description": "Optional. A human-readable description for the role."
-    }
-   }
-  },
-  "AuditData": {
-   "id": "AuditData",
-   "type": "object",
-   "description": "Audit log information specific to Cloud IAM. This message is serialized as an `Any` type in the `ServiceData` message of an `AuditLog` message.",
-   "properties": {
-    "policyDelta": {
-     "$ref": "PolicyDelta",
-     "description": "Policy delta between the original policy and the newly set policy."
-    }
-   }
-  },
-  "PolicyDelta": {
-   "id": "PolicyDelta",
-   "type": "object",
-   "description": "The difference delta between two policies.",
-   "properties": {
-    "bindingDeltas": {
-     "type": "array",
-     "description": "The delta for Bindings between two policies.",
-     "items": {
-      "$ref": "BindingDelta"
-     }
-    }
-   }
-  },
-  "BindingDelta": {
-   "id": "BindingDelta",
-   "type": "object",
-   "description": "One delta entry for Binding. Each individual change (only one member in each entry) to a binding will be a separate entry.",
-   "properties": {
-    "action": {
-     "type": "string",
-     "description": "The action that was performed on a Binding. Required",
-     "enum": [
-      "ACTION_UNSPECIFIED",
-      "ADD",
-      "REMOVE"
-     ]
-    },
-    "role": {
-     "type": "string",
-     "description": "Role that is assigned to `members`. For example, `roles/viewer`, `roles/editor`, or `roles/owner`. Required"
-    },
-    "member": {
-     "type": "string",
-     "description": "A single identity requesting access for a Cloud Platform resource. Follows the same format of Binding.members. Required"
-    }
-   }
-  }
- },
- "resources": {
-  "projects": {
-   "resources": {
-    "serviceAccounts": {
-     "methods": {
-      "list": {
-       "id": "iam.projects.serviceAccounts.list",
-       "path": "v1/{+name}/serviceAccounts",
-       "httpMethod": "GET",
-       "description": "Lists ServiceAccounts for a project.",
-       "parameters": {
-        "name": {
-         "type": "string",
-         "description": "Required. The resource name of the project associated with the service accounts, such as `projects/my-project-123`.",
-         "required": true,
-         "pattern": "^projects/[^/]*$",
-         "location": "path"
-        },
-        "pageSize": {
-         "type": "integer",
-         "description": "Optional limit on the number of service accounts to include in the response. Further accounts can subsequently be obtained by including the ListServiceAccountsResponse.next_page_token in a subsequent request.",
-         "format": "int32",
-         "location": "query"
-        },
-        "pageToken": {
-         "type": "string",
-         "description": "Optional pagination token returned in an earlier ListServiceAccountsResponse.next_page_token.",
-         "location": "query"
-        }
-       },
-       "parameterOrder": [
-        "name"
-       ],
-       "response": {
-        "$ref": "ListServiceAccountsResponse"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "get": {
-       "id": "iam.projects.serviceAccounts.get",
-       "path": "v1/{+name}",
-       "httpMethod": "GET",
-       "description": "Gets a ServiceAccount.",
-       "parameters": {
-        "name": {
-         "type": "string",
-         "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
-         "required": true,
-         "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "name"
-       ],
-       "response": {
-        "$ref": "ServiceAccount"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "create": {
-       "id": "iam.projects.serviceAccounts.create",
-       "path": "v1/{+name}/serviceAccounts",
-       "httpMethod": "POST",
-       "description": "Creates a ServiceAccount and returns it.",
-       "parameters": {
-        "name": {
-         "type": "string",
-         "description": "Required. The resource name of the project associated with the service accounts, such as `projects/my-project-123`.",
-         "required": true,
-         "pattern": "^projects/[^/]*$",
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "name"
-       ],
-       "request": {
-        "$ref": "CreateServiceAccountRequest"
-       },
-       "response": {
-        "$ref": "ServiceAccount"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "update": {
-       "id": "iam.projects.serviceAccounts.update",
-       "path": "v1/{+name}",
-       "httpMethod": "PUT",
-       "description": "Updates a ServiceAccount. Currently, only the following fields are updatable: `display_name` . The `etag` is mandatory.",
-       "parameters": {
-        "name": {
-         "type": "string",
-         "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Requests using `-` as a wildcard for the project will infer the project from the `account` and the `account` value can be the `email` address or the `unique_id` of the service account. In responses the resource name will always be in the format `projects/{project}/serviceAccounts/{email}`.",
-         "required": true,
-         "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "name"
-       ],
-       "request": {
-        "$ref": "ServiceAccount"
-       },
-       "response": {
-        "$ref": "ServiceAccount"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "delete": {
-       "id": "iam.projects.serviceAccounts.delete",
-       "path": "v1/{+name}",
-       "httpMethod": "DELETE",
-       "description": "Deletes a ServiceAccount.",
-       "parameters": {
-        "name": {
-         "type": "string",
-         "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
-         "required": true,
-         "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "name"
-       ],
-       "response": {
-        "$ref": "Empty"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "signBlob": {
-       "id": "iam.projects.serviceAccounts.signBlob",
-       "path": "v1/{+name}:signBlob",
-       "httpMethod": "POST",
-       "description": "Signs a blob using a service account's system-managed private key.",
-       "parameters": {
-        "name": {
-         "type": "string",
-         "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
-         "required": true,
-         "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "name"
-       ],
-       "request": {
-        "$ref": "SignBlobRequest"
-       },
-       "response": {
-        "$ref": "SignBlobResponse"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "getIamPolicy": {
-       "id": "iam.projects.serviceAccounts.getIamPolicy",
-       "path": "v1/{+resource}:getIamPolicy",
-       "httpMethod": "POST",
-       "description": "Returns the IAM access control policy for a ServiceAccount.",
-       "parameters": {
-        "resource": {
-         "type": "string",
-         "description": "REQUIRED: The resource for which the policy is being requested. `resource` is usually specified as a path. For example, a Project resource is specified as `projects/{project}`.",
-         "required": true,
-         "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "resource"
-       ],
-       "response": {
-        "$ref": "Policy"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "setIamPolicy": {
-       "id": "iam.projects.serviceAccounts.setIamPolicy",
-       "path": "v1/{+resource}:setIamPolicy",
-       "httpMethod": "POST",
-       "description": "Sets the IAM access control policy for a ServiceAccount.",
-       "parameters": {
-        "resource": {
-         "type": "string",
-         "description": "REQUIRED: The resource for which the policy is being specified. `resource` is usually specified as a path. For example, a Project resource is specified as `projects/{project}`.",
-         "required": true,
-         "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "resource"
-       ],
-       "request": {
-        "$ref": "SetIamPolicyRequest"
-       },
-       "response": {
-        "$ref": "Policy"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      },
-      "testIamPermissions": {
-       "id": "iam.projects.serviceAccounts.testIamPermissions",
-       "path": "v1/{+resource}:testIamPermissions",
-       "httpMethod": "POST",
-       "description": "Tests the specified permissions against the IAM access control policy for a ServiceAccount.",
-       "parameters": {
-        "resource": {
-         "type": "string",
-         "description": "REQUIRED: The resource for which the policy detail is being requested. `resource` is usually specified as a path. For example, a Project resource is specified as `projects/{project}`.",
-         "required": true,
-         "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
-         "location": "path"
-        }
-       },
-       "parameterOrder": [
-        "resource"
-       ],
-       "request": {
-        "$ref": "TestIamPermissionsRequest"
-       },
-       "response": {
-        "$ref": "TestIamPermissionsResponse"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/cloud-platform"
-       ]
-      }
-     },
-     "resources": {
-      "keys": {
-       "methods": {
-        "list": {
-         "id": "iam.projects.serviceAccounts.keys.list",
-         "path": "v1/{+name}/keys",
-         "httpMethod": "GET",
-         "description": "Lists ServiceAccountKeys.",
-         "parameters": {
-          "name": {
-           "type": "string",
-           "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Using `-` as a wildcard for the project, will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
-           "required": true,
-           "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
-           "location": "path"
+      "methods": {
+        "queryGrantableRoles": {
+          "description": "Queries roles that can be granted on a particular resource.\nA role is grantable if it can be used as the role in a binding for a policy\nfor that resource.",
+          "request": {
+            "$ref": "QueryGrantableRolesRequest"
           },
-          "keyTypes": {
-           "type": "string",
-           "description": "Filters the types of keys the user wants to include in the list response. Duplicate key types are not allowed. If no key type is provided, all keys are returned.",
-           "enum": [
-            "KEY_TYPE_UNSPECIFIED",
-            "USER_MANAGED",
-            "SYSTEM_MANAGED"
-           ],
-           "repeated": true,
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "name"
-         ],
-         "response": {
-          "$ref": "ListServiceAccountKeysResponse"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "get": {
-         "id": "iam.projects.serviceAccounts.keys.get",
-         "path": "v1/{+name}",
-         "httpMethod": "GET",
-         "description": "Gets the ServiceAccountKey by key id.",
-         "parameters": {
-          "name": {
-           "type": "string",
-           "description": "The resource name of the service account key in the following format: `projects/{project}/serviceAccounts/{account}/keys/{key}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
-           "required": true,
-           "pattern": "^projects/[^/]*/serviceAccounts/[^/]*/keys/[^/]*$",
-           "location": "path"
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "QueryGrantableRolesResponse"
           },
-          "publicKeyType": {
-           "type": "string",
-           "description": "The output format of the public key requested. X509_PEM is the default output format.",
-           "enum": [
-            "TYPE_NONE",
-            "TYPE_X509_PEM_FILE",
-            "TYPE_RAW_PUBLIC_KEY"
-           ],
-           "location": "query"
-          }
-         },
-         "parameterOrder": [
-          "name"
-         ],
-         "response": {
-          "$ref": "ServiceAccountKey"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "create": {
-         "id": "iam.projects.serviceAccounts.keys.create",
-         "path": "v1/{+name}/keys",
-         "httpMethod": "POST",
-         "description": "Creates a ServiceAccountKey and returns it.",
-         "parameters": {
-          "name": {
-           "type": "string",
-           "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
-           "required": true,
-           "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "name"
-         ],
-         "request": {
-          "$ref": "CreateServiceAccountKeyRequest"
-         },
-         "response": {
-          "$ref": "ServiceAccountKey"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
-        },
-        "delete": {
-         "id": "iam.projects.serviceAccounts.keys.delete",
-         "path": "v1/{+name}",
-         "httpMethod": "DELETE",
-         "description": "Deletes a ServiceAccountKey.",
-         "parameters": {
-          "name": {
-           "type": "string",
-           "description": "The resource name of the service account key in the following format: `projects/{project}/serviceAccounts/{account}/keys/{key}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
-           "required": true,
-           "pattern": "^projects/[^/]*/serviceAccounts/[^/]*/keys/[^/]*$",
-           "location": "path"
-          }
-         },
-         "parameterOrder": [
-          "name"
-         ],
-         "response": {
-          "$ref": "Empty"
-         },
-         "scopes": [
-          "https://www.googleapis.com/auth/cloud-platform"
-         ]
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {},
+          "flatPath": "v1/roles:queryGrantableRoles",
+          "id": "iam.roles.queryGrantableRoles",
+          "path": "v1/roles:queryGrantableRoles"
         }
-       }
       }
-     }
     }
-   }
   },
-  "roles": {
-   "methods": {
-    "queryGrantableRoles": {
-     "id": "iam.roles.queryGrantableRoles",
-     "path": "v1/roles:queryGrantableRoles",
-     "httpMethod": "POST",
-     "description": "Queries roles that can be granted on a particular resource. A role is grantable if it can be used as the role in a binding for a policy for that resource.",
-     "request": {
-      "$ref": "QueryGrantableRolesRequest"
-     },
-     "response": {
-      "$ref": "QueryGrantableRolesResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/cloud-platform"
-     ]
+  "parameters": {
+    "$.xgafv": {
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ]
+    },
+    "callback": {
+      "description": "JSONP",
+      "type": "string",
+      "location": "query"
+    },
+    "alt": {
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string",
+      "location": "query"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string",
+      "location": "query"
+    },
+    "pp": {
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
+    },
+    "bearer_token": {
+      "location": "query",
+      "description": "OAuth bearer token.",
+      "type": "string"
+    },
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string",
+      "location": "query"
+    },
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string",
+      "location": "query"
     }
-   }
-  }
- }
+  },
+  "version": "v1",
+  "baseUrl": "https://iam.googleapis.com/",
+  "kind": "discovery#restDescription",
+  "description": "Manages identity and access control for Google Cloud Platform resources, including the creation of service accounts, which you can use to authenticate to Google and make API calls.",
+  "servicePath": "",
+  "basePath": "",
+  "revision": "20170126",
+  "id": "iam:v1",
+  "documentationLink": "https://cloud.google.com/iam/"
 }
diff --git a/iam/v1/iam-gen.go b/iam/v1/iam-gen.go
index 6bb8809..43afc3d 100644
--- a/iam/v1/iam-gen.go
+++ b/iam/v1/iam-gen.go
@@ -62,9 +62,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.ServiceAccounts = NewProjectsServiceAccountsService(s)
@@ -121,7 +126,8 @@
 }
 
 // AuditData: Audit log information specific to Cloud IAM. This message
-// is serialized as an `Any` type in the `ServiceData` message of an
+// is serialized
+// as an `Any` type in the `ServiceData` message of an
 // `AuditLog` message.
 type AuditData struct {
 	// PolicyDelta: Policy delta between the original policy and the newly
@@ -154,24 +160,43 @@
 // Binding: Associates `members` with a `role`.
 type Binding struct {
 	// Members: Specifies the identities requesting access for a Cloud
-	// Platform resource. `members` can have the following values: *
-	// `allUsers`: A special identifier that represents anyone who is on the
-	// internet; with or without a Google account. *
-	// `allAuthenticatedUsers`: A special identifier that represents anyone
-	// who is authenticated with a Google account or a service account. *
-	// `user:{emailid}`: An email address that represents a specific Google
-	// account. For example, `alice@gmail.com` or `joe@example.com`. *
-	// `serviceAccount:{emailid}`: An email address that represents a
-	// service account. For example,
-	// `my-other-app@appspot.gserviceaccount.com`. * `group:{emailid}`: An
-	// email address that represents a Google group. For example,
-	// `admins@example.com`. * `domain:{domain}`: A Google Apps domain name
-	// that represents all the users of that domain. For example,
-	// `google.com` or `example.com`.
+	// Platform resource.
+	// `members` can have the following values:
+	//
+	// * `allUsers`: A special identifier that represents anyone who is
+	//    on the internet; with or without a Google account.
+	//
+	// * `allAuthenticatedUsers`: A special identifier that represents
+	// anyone
+	//    who is authenticated with a Google account or a service
+	// account.
+	//
+	// * `user:{emailid}`: An email address that represents a specific
+	// Google
+	//    account. For example, `alice@gmail.com` or `joe@example.com`.
+	//
+	//
+	// * `serviceAccount:{emailid}`: An email address that represents a
+	// service
+	//    account. For example,
+	// `my-other-app@appspot.gserviceaccount.com`.
+	//
+	// * `group:{emailid}`: An email address that represents a Google
+	// group.
+	//    For example, `admins@example.com`.
+	//
+	// * `domain:{domain}`: A Google Apps domain name that represents all
+	// the
+	//    users of that domain. For example, `google.com` or
+	// `example.com`.
+	//
+	//
 	Members []string `json:"members,omitempty"`
 
-	// Role: Role that is assigned to `members`. For example,
-	// `roles/viewer`, `roles/editor`, or `roles/owner`. Required
+	// Role: Role that is assigned to `members`.
+	// For example, `roles/viewer`, `roles/editor`, or
+	// `roles/owner`.
+	// Required
 	Role string `json:"role,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Members") to
@@ -198,23 +223,28 @@
 }
 
 // BindingDelta: One delta entry for Binding. Each individual change
-// (only one member in each entry) to a binding will be a separate
-// entry.
+// (only one member in each
+// entry) to a binding will be a separate entry.
 type BindingDelta struct {
-	// Action: The action that was performed on a Binding. Required
+	// Action: The action that was performed on a Binding.
+	// Required
 	//
 	// Possible values:
-	//   "ACTION_UNSPECIFIED"
-	//   "ADD"
-	//   "REMOVE"
+	//   "ACTION_UNSPECIFIED" - Unspecified.
+	//   "ADD" - Addition of a Binding.
+	//   "REMOVE" - Removal of a Binding.
 	Action string `json:"action,omitempty"`
 
 	// Member: A single identity requesting access for a Cloud Platform
-	// resource. Follows the same format of Binding.members. Required
+	// resource.
+	// Follows the same format of Binding.members.
+	// Required
 	Member string `json:"member,omitempty"`
 
-	// Role: Role that is assigned to `members`. For example,
-	// `roles/viewer`, `roles/editor`, or `roles/owner`. Required
+	// Role: Role that is assigned to `members`.
+	// For example, `roles/viewer`, `roles/editor`, or
+	// `roles/owner`.
+	// Required
 	Role string `json:"role,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Action") to
@@ -243,23 +273,28 @@
 // CreateServiceAccountKeyRequest: The service account key create
 // request.
 type CreateServiceAccountKeyRequest struct {
-	// KeyAlgorithm: Which type of key and algorithm to use for the key. The
-	// default is currently a 4K RSA key. However this may change in the
+	// KeyAlgorithm: Which type of key and algorithm to use for the key.
+	// The default is currently a 4K RSA key.  However this may change in
+	// the
 	// future.
 	//
 	// Possible values:
-	//   "KEY_ALG_UNSPECIFIED"
-	//   "KEY_ALG_RSA_1024"
-	//   "KEY_ALG_RSA_2048"
+	//   "KEY_ALG_UNSPECIFIED" - An unspecified key algorithm.
+	//   "KEY_ALG_RSA_1024" - 1k RSA Key.
+	//   "KEY_ALG_RSA_2048" - 2k RSA Key.
 	KeyAlgorithm string `json:"keyAlgorithm,omitempty"`
 
 	// PrivateKeyType: The output format of the private key.
-	// `GOOGLE_CREDENTIALS_FILE` is the default output format.
+	// `GOOGLE_CREDENTIALS_FILE` is the
+	// default output format.
 	//
 	// Possible values:
-	//   "TYPE_UNSPECIFIED"
-	//   "TYPE_PKCS12_FILE"
-	//   "TYPE_GOOGLE_CREDENTIALS_FILE"
+	//   "TYPE_UNSPECIFIED" - Unspecified. Equivalent to
+	// `TYPE_GOOGLE_CREDENTIALS_FILE`.
+	//   "TYPE_PKCS12_FILE" - PKCS12 format.
+	// The password for the PKCS12 file is `notasecret`.
+	// For more information, see https://tools.ietf.org/html/rfc7292.
+	//   "TYPE_GOOGLE_CREDENTIALS_FILE" - Google Credentials File format.
 	PrivateKeyType string `json:"privateKeyType,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "KeyAlgorithm") to
@@ -288,13 +323,18 @@
 // CreateServiceAccountRequest: The service account create request.
 type CreateServiceAccountRequest struct {
 	// AccountId: Required. The account id that is used to generate the
-	// service account email address and a stable unique id. It is unique
-	// within a project, must be 6-30 characters long, and match the regular
-	// expression `[a-z]([-a-z0-9]*[a-z0-9])` to comply with RFC1035.
+	// service account
+	// email address and a stable unique id. It is unique within a
+	// project,
+	// must be 6-30 characters long, and match the regular
+	// expression
+	// `[a-z]([-a-z0-9]*[a-z0-9])` to comply with RFC1035.
 	AccountId string `json:"accountId,omitempty"`
 
-	// ServiceAccount: The ServiceAccount resource to create. Currently,
-	// only the following values are user assignable: `display_name` .
+	// ServiceAccount: The ServiceAccount resource to create.
+	// Currently, only the following values are user
+	// assignable:
+	// `display_name` .
 	ServiceAccount *ServiceAccount `json:"serviceAccount,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "AccountId") to
@@ -321,11 +361,17 @@
 }
 
 // Empty: A generic empty message that you can re-use to avoid defining
-// duplicated empty messages in your APIs. A typical example is to use
-// it as the request or the response type of an API method. For
-// instance: service Foo { rpc Bar(google.protobuf.Empty) returns
-// (google.protobuf.Empty); } The JSON representation for `Empty` is
-// empty JSON object `{}`.
+// duplicated
+// empty messages in your APIs. A typical example is to use it as the
+// request
+// or the response type of an API method. For instance:
+//
+//     service Foo {
+//       rpc Bar(google.protobuf.Empty) returns
+// (google.protobuf.Empty);
+//     }
+//
+// The JSON representation for `Empty` is empty JSON object `{}`.
 type Empty struct {
 	// ServerResponse contains the HTTP response code and headers from the
 	// server.
@@ -370,8 +416,10 @@
 	// Accounts: The list of matching service accounts.
 	Accounts []*ServiceAccount `json:"accounts,omitempty"`
 
-	// NextPageToken: To retrieve the next page of results, set
-	// ListServiceAccountsRequest.page_token to this value.
+	// NextPageToken: To retrieve the next page of results,
+	// set
+	// ListServiceAccountsRequest.page_token
+	// to this value.
 	NextPageToken string `json:"nextPageToken,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -402,33 +450,66 @@
 }
 
 // Policy: Defines an Identity and Access Management (IAM) policy. It is
-// used to specify access control policies for Cloud Platform resources.
+// used to
+// specify access control policies for Cloud Platform resources.
+//
+//
 // A `Policy` consists of a list of `bindings`. A `Binding` binds a list
-// of `members` to a `role`, where the members can be user accounts,
-// Google groups, Google domains, and service accounts. A `role` is a
-// named list of permissions defined by IAM. **Example** { "bindings": [
-// { "role": "roles/owner", "members": [ "user:mike@example.com",
-// "group:admins@example.com", "domain:google.com",
-// "serviceAccount:my-other-app@appspot.gserviceaccount.com", ] }, {
-// "role": "roles/viewer", "members": ["user:sean@example.com"] } ] }
-// For a description of IAM and its features, see the [IAM developer's
-// guide](https://cloud.google.com/iam).
+// of
+// `members` to a `role`, where the members can be user accounts, Google
+// groups,
+// Google domains, and service accounts. A `role` is a named list of
+// permissions
+// defined by IAM.
+//
+// **Example**
+//
+//     {
+//       "bindings": [
+//         {
+//           "role": "roles/owner",
+//           "members": [
+//             "user:mike@example.com",
+//             "group:admins@example.com",
+//             "domain:google.com",
+//
+// "serviceAccount:my-other-app@appspot.gserviceaccount.com",
+//           ]
+//         },
+//         {
+//           "role": "roles/viewer",
+//           "members": ["user:sean@example.com"]
+//         }
+//       ]
+//     }
+//
+// For a description of IAM and its features, see the
+// [IAM developer's guide](https://cloud.google.com/iam).
 type Policy struct {
-	// Bindings: Associates a list of `members` to a `role`. Multiple
-	// `bindings` must not be specified for the same `role`. `bindings` with
-	// no members will result in an error.
+	// Bindings: Associates a list of `members` to a `role`.
+	// Multiple `bindings` must not be specified for the same
+	// `role`.
+	// `bindings` with no members will result in an error.
 	Bindings []*Binding `json:"bindings,omitempty"`
 
 	// Etag: `etag` is used for optimistic concurrency control as a way to
-	// help prevent simultaneous updates of a policy from overwriting each
-	// other. It is strongly suggested that systems make use of the `etag`
-	// in the read-modify-write cycle to perform policy updates in order to
-	// avoid race conditions: An `etag` is returned in the response to
-	// `getIamPolicy`, and systems are expected to put that etag in the
-	// request to `setIamPolicy` to ensure that their change will be applied
-	// to the same version of the policy. If no `etag` is provided in the
-	// call to `setIamPolicy`, then the existing policy is overwritten
-	// blindly.
+	// help
+	// prevent simultaneous updates of a policy from overwriting each
+	// other.
+	// It is strongly suggested that systems make use of the `etag` in
+	// the
+	// read-modify-write cycle to perform policy updates in order to avoid
+	// race
+	// conditions: An `etag` is returned in the response to `getIamPolicy`,
+	// and
+	// systems are expected to put that etag in the request to
+	// `setIamPolicy` to
+	// ensure that their change will be applied to the same version of the
+	// policy.
+	//
+	// If no `etag` is provided in the call to `setIamPolicy`, then the
+	// existing
+	// policy is overwritten blindly.
 	Etag string `json:"etag,omitempty"`
 
 	// Version: Version of the `Policy`. The default version is 0.
@@ -492,9 +573,11 @@
 // QueryGrantableRolesRequest: The grantable role query request.
 type QueryGrantableRolesRequest struct {
 	// FullResourceName: Required. The full resource name to query from the
-	// list of grantable roles. The name follows the Google Cloud Platform
-	// resource format. For example, a Cloud Platform project with id
-	// `my-project` will be named
+	// list of grantable roles.
+	//
+	// The name follows the Google Cloud Platform resource format.
+	// For example, a Cloud Platform project with id `my-project` will be
+	// named
 	// `//cloudresourcemanager.googleapis.com/projects/my-project`.
 	FullResourceName string `json:"fullResourceName,omitempty"`
 
@@ -556,18 +639,23 @@
 
 // Role: A role in the Identity and Access Management API.
 type Role struct {
-	// Description: Optional. A human-readable description for the role.
+	// Description: Optional.  A human-readable description for the role.
 	Description string `json:"description,omitempty"`
 
-	// Name: The name of the role. When Role is used in CreateRole, the role
-	// name must not be set. When Role is used in output and other input
-	// such as UpdateRole, the role name is the complete path, e.g.,
-	// roles/logging.viewer for curated roles and
-	// organizations/{organization-id}/roles/logging.viewer for custom
+	// Name: The name of the role.
+	//
+	// When Role is used in CreateRole, the role name must not be set.
+	//
+	// When Role is used in output and other input such as UpdateRole, the
+	// role
+	// name is the complete path, e.g., roles/logging.viewer for curated
+	// roles
+	// and organizations/{ORGANIZATION_ID}/roles/logging.viewer for custom
 	// roles.
 	Name string `json:"name,omitempty"`
 
-	// Title: Optional. A human-readable title for the role. Typically this
+	// Title: Optional.  A human-readable title for the role.  Typically
+	// this
 	// is limited to 100 UTF-8 bytes.
 	Title string `json:"title,omitempty"`
 
@@ -595,22 +683,37 @@
 }
 
 // ServiceAccount: A service account in the Identity and Access
-// Management API. To create a service account, specify the `project_id`
-// and the `account_id` for the account. The `account_id` is unique
-// within the project, and is used to generate the service account email
-// address and a stable `unique_id`. If the account already exists, the
-// account's resource name is returned in util::Status's
-// ResourceInfo.resource_name in the format of
-// projects/{project}/serviceAccounts/{email}. The caller can use the
-// name in other methods to access the account. All other methods can
-// identify the service account using the format
-// `projects/{project}/serviceAccounts/{account}`. Using `-` as a
-// wildcard for the project will infer the project from the account. The
-// `account` value can be the `email` address or the `unique_id` of the
-// service account.
+// Management API.
+//
+// To create a service account, specify the `project_id` and the
+// `account_id`
+// for the account.  The `account_id` is unique within the project, and
+// is used
+// to generate the service account email address and a
+// stable
+// `unique_id`.
+//
+// If the account already exists, the account's resource name is
+// returned
+// in util::Status's ResourceInfo.resource_name in the format
+// of
+// projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}. The
+// caller can
+// use the name in other methods to access the account.
+//
+// All other methods can identify the service account using the
+// format
+// `projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`
+// .
+// Using `-` as a wildcard for the project will infer the project
+// from
+// the account. The `account` value can be the `email` address or
+// the
+// `unique_id` of the service account.
 type ServiceAccount struct {
 	// DisplayName: Optional. A user-specified description of the service
-	// account. Must be fewer than 100 UTF-8 bytes.
+	// account.  Must be
+	// fewer than 100 UTF-8 bytes.
 	DisplayName string `json:"displayName,omitempty"`
 
 	// Email: @OutputOnly The email address of the service account.
@@ -620,18 +723,27 @@
 	Etag string `json:"etag,omitempty"`
 
 	// Name: The resource name of the service account in the following
-	// format: `projects/{project}/serviceAccounts/{account}`. Requests
-	// using `-` as a wildcard for the project will infer the project from
-	// the `account` and the `account` value can be the `email` address or
-	// the `unique_id` of the service account. In responses the resource
-	// name will always be in the format
-	// `projects/{project}/serviceAccounts/{email}`.
+	// format:
+	// `projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}
+	// `.
+	//
+	// Requests using `-` as a wildcard for the project will infer the
+	// project
+	// from the `account` and the `account` value can be the `email` address
+	// or
+	// the `unique_id` of the service account.
+	//
+	// In responses the resource name will always be in the
+	// format
+	// `projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`
+	// .
 	Name string `json:"name,omitempty"`
 
 	// Oauth2ClientId: @OutputOnly. The OAuth2 client id for the service
-	// account. This is used in conjunction with the OAuth2 clientconfig API
-	// to make three legged OAuth2 (3LO) flows to access the data of Google
-	// users.
+	// account.
+	// This is used in conjunction with the OAuth2 clientconfig API to
+	// make
+	// three legged OAuth2 (3LO) flows to access the data of Google users.
 	Oauth2ClientId string `json:"oauth2ClientId,omitempty"`
 
 	// ProjectId: @OutputOnly The id of the project that owns the service
@@ -669,44 +781,66 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// ServiceAccountKey: Represents a service account key. A service
-// account has two sets of key-pairs: user-managed, and system-managed.
-// User-managed key-pairs can be created and deleted by users. Users are
+// ServiceAccountKey: Represents a service account key.
+//
+// A service account has two sets of key-pairs: user-managed,
+// and
+// system-managed.
+//
+// User-managed key-pairs can be created and deleted by users.  Users
+// are
 // responsible for rotating these keys periodically to ensure security
-// of their service accounts. Users retain the private key of these
-// key-pairs, and Google retains ONLY the public key. System-managed
-// key-pairs are managed automatically by Google, and rotated daily
-// without user intervention. The private key never leaves Google's
-// servers to maximize security. Public keys for all service accounts
-// are also published at the OAuth2 Service Account API.
+// of
+// their service accounts.  Users retain the private key of these
+// key-pairs,
+// and Google retains ONLY the public key.
+//
+// System-managed key-pairs are managed automatically by Google, and
+// rotated
+// daily without user intervention.  The private key never leaves
+// Google's
+// servers to maximize security.
+//
+// Public keys for all service accounts are also published at the
+// OAuth2
+// Service Account API.
 type ServiceAccountKey struct {
 	// KeyAlgorithm: Specifies the algorithm (and possibly key size) for the
 	// key.
 	//
 	// Possible values:
-	//   "KEY_ALG_UNSPECIFIED"
-	//   "KEY_ALG_RSA_1024"
-	//   "KEY_ALG_RSA_2048"
+	//   "KEY_ALG_UNSPECIFIED" - An unspecified key algorithm.
+	//   "KEY_ALG_RSA_1024" - 1k RSA Key.
+	//   "KEY_ALG_RSA_2048" - 2k RSA Key.
 	KeyAlgorithm string `json:"keyAlgorithm,omitempty"`
 
 	// Name: The resource name of the service account key in the following
-	// format `projects/{project}/serviceAccounts/{account}/keys/{key}`.
+	// format
+	// `projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}/
+	// keys/{key}`.
 	Name string `json:"name,omitempty"`
 
 	// PrivateKeyData: The private key data. Only provided in
-	// `CreateServiceAccountKey` responses.
+	// `CreateServiceAccountKey`
+	// responses.
 	PrivateKeyData string `json:"privateKeyData,omitempty"`
 
-	// PrivateKeyType: The output format for the private key. Only provided
-	// in `CreateServiceAccountKey` responses, not in `GetServiceAccountKey`
-	// or `ListServiceAccountKey` responses. Google never exposes
-	// system-managed private keys, and never retains user-managed private
-	// keys.
+	// PrivateKeyType: The output format for the private key.
+	// Only provided in `CreateServiceAccountKey` responses, not
+	// in `GetServiceAccountKey` or `ListServiceAccountKey`
+	// responses.
+	//
+	// Google never exposes system-managed private keys, and never
+	// retains
+	// user-managed private keys.
 	//
 	// Possible values:
-	//   "TYPE_UNSPECIFIED"
-	//   "TYPE_PKCS12_FILE"
-	//   "TYPE_GOOGLE_CREDENTIALS_FILE"
+	//   "TYPE_UNSPECIFIED" - Unspecified. Equivalent to
+	// `TYPE_GOOGLE_CREDENTIALS_FILE`.
+	//   "TYPE_PKCS12_FILE" - PKCS12 format.
+	// The password for the PKCS12 file is `notasecret`.
+	// For more information, see https://tools.ietf.org/html/rfc7292.
+	//   "TYPE_GOOGLE_CREDENTIALS_FILE" - Google Credentials File format.
 	PrivateKeyType string `json:"privateKeyType,omitempty"`
 
 	// PublicKeyData: The public key data. Only provided in
@@ -749,9 +883,11 @@
 // SetIamPolicyRequest: Request message for `SetIamPolicy` method.
 type SetIamPolicyRequest struct {
 	// Policy: REQUIRED: The complete policy to be applied to the
-	// `resource`. The size of the policy is limited to a few 10s of KB. An
-	// empty policy is a valid policy but certain Cloud Platform services
-	// (such as Projects) might reject them.
+	// `resource`. The size of
+	// the policy is limited to a few 10s of KB. An empty policy is a
+	// valid policy but certain Cloud Platform services (such as
+	// Projects)
+	// might reject them.
 	Policy *Policy `json:"policy,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Policy") to
@@ -840,12 +976,78 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// SignJwtRequest: The service account sign JWT request.
+type SignJwtRequest struct {
+	// Payload: The JWT payload to sign, a JSON JWT Claim set.
+	Payload string `json:"payload,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Payload") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Payload") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *SignJwtRequest) MarshalJSON() ([]byte, error) {
+	type noMethod SignJwtRequest
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// SignJwtResponse: The service account sign JWT response.
+type SignJwtResponse struct {
+	// KeyId: The id of the key used to sign the JWT.
+	KeyId string `json:"keyId,omitempty"`
+
+	// SignedJwt: The signed JWT.
+	SignedJwt string `json:"signedJwt,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "KeyId") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "KeyId") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *SignJwtResponse) MarshalJSON() ([]byte, error) {
+	type noMethod SignJwtResponse
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // TestIamPermissionsRequest: Request message for `TestIamPermissions`
 // method.
 type TestIamPermissionsRequest struct {
 	// Permissions: The set of permissions to check for the `resource`.
-	// Permissions with wildcards (such as '*' or 'storage.*') are not
-	// allowed. For more information see [IAM
+	// Permissions with
+	// wildcards (such as '*' or 'storage.*') are not allowed. For
+	// more
+	// information see
+	// [IAM
 	// Overview](https://cloud.google.com/iam/docs/overview#permissions).
 	Permissions []string `json:"permissions,omitempty"`
 
@@ -876,7 +1078,8 @@
 // method.
 type TestIamPermissionsResponse struct {
 	// Permissions: A subset of `TestPermissionsRequest.permissions` that
-	// the caller is allowed.
+	// the caller is
+	// allowed.
 	Permissions []string `json:"permissions,omitempty"`
 
 	// ServerResponse contains the HTTP response code and headers from the
@@ -917,7 +1120,8 @@
 	header_                     http.Header
 }
 
-// Create: Creates a ServiceAccount and returns it.
+// Create: Creates a ServiceAccount
+// and returns it.
 func (r *ProjectsServiceAccountsService) Create(name string, createserviceaccountrequest *CreateServiceAccountRequest) *ProjectsServiceAccountsCreateCall {
 	c := &ProjectsServiceAccountsCreateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.name = name
@@ -956,6 +1160,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.createserviceaccountrequest)
 	if err != nil {
@@ -1011,7 +1216,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Creates a ServiceAccount and returns it.",
+	//   "description": "Creates a ServiceAccount\nand returns it.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts",
 	//   "httpMethod": "POST",
 	//   "id": "iam.projects.serviceAccounts.create",
 	//   "parameterOrder": [
@@ -1019,9 +1225,9 @@
 	//   ],
 	//   "parameters": {
 	//     "name": {
-	//       "description": "Required. The resource name of the project associated with the service accounts, such as `projects/my-project-123`.",
+	//       "description": "Required. The resource name of the project associated with the service\naccounts, such as `projects/my-project-123`.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*$",
+	//       "pattern": "^projects/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     }
@@ -1088,6 +1294,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+name}")
@@ -1139,6 +1346,7 @@
 	return ret, nil
 	// {
 	//   "description": "Deletes a ServiceAccount.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "iam.projects.serviceAccounts.delete",
 	//   "parameterOrder": [
@@ -1146,9 +1354,9 @@
 	//   ],
 	//   "parameters": {
 	//     "name": {
-	//       "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
+	//       "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
+	//       "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     }
@@ -1223,6 +1431,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1277,6 +1486,7 @@
 	return ret, nil
 	// {
 	//   "description": "Gets a ServiceAccount.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}",
 	//   "httpMethod": "GET",
 	//   "id": "iam.projects.serviceAccounts.get",
 	//   "parameterOrder": [
@@ -1284,9 +1494,9 @@
 	//   ],
 	//   "parameters": {
 	//     "name": {
-	//       "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
+	//       "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
+	//       "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     }
@@ -1312,7 +1522,8 @@
 	header_    http.Header
 }
 
-// GetIamPolicy: Returns the IAM access control policy for a
+// GetIamPolicy: Returns the IAM access control policy for
+// a
 // ServiceAccount.
 func (r *ProjectsServiceAccountsService) GetIamPolicy(resource string) *ProjectsServiceAccountsGetIamPolicyCall {
 	c := &ProjectsServiceAccountsGetIamPolicyCall{s: r.s, urlParams_: make(gensupport.URLParams)}
@@ -1351,6 +1562,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+resource}:getIamPolicy")
@@ -1401,7 +1613,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Returns the IAM access control policy for a ServiceAccount.",
+	//   "description": "Returns the IAM access control policy for a\nServiceAccount.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:getIamPolicy",
 	//   "httpMethod": "POST",
 	//   "id": "iam.projects.serviceAccounts.getIamPolicy",
 	//   "parameterOrder": [
@@ -1409,9 +1622,9 @@
 	//   ],
 	//   "parameters": {
 	//     "resource": {
-	//       "description": "REQUIRED: The resource for which the policy is being requested. `resource` is usually specified as a path. For example, a Project resource is specified as `projects/{project}`.",
+	//       "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
+	//       "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     }
@@ -1446,16 +1659,19 @@
 }
 
 // PageSize sets the optional parameter "pageSize": Optional limit on
-// the number of service accounts to include in the response. Further
-// accounts can subsequently be obtained by including the
-// ListServiceAccountsResponse.next_page_token in a subsequent request.
+// the number of service accounts to include in the
+// response. Further accounts can subsequently be obtained by including
+// the
+// ListServiceAccountsResponse.next_page_token
+// in a subsequent request.
 func (c *ProjectsServiceAccountsListCall) PageSize(pageSize int64) *ProjectsServiceAccountsListCall {
 	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
 	return c
 }
 
 // PageToken sets the optional parameter "pageToken": Optional
-// pagination token returned in an earlier
+// pagination token returned in an
+// earlier
 // ListServiceAccountsResponse.next_page_token.
 func (c *ProjectsServiceAccountsListCall) PageToken(pageToken string) *ProjectsServiceAccountsListCall {
 	c.urlParams_.Set("pageToken", pageToken)
@@ -1503,6 +1719,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1557,6 +1774,7 @@
 	return ret, nil
 	// {
 	//   "description": "Lists ServiceAccounts for a project.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts",
 	//   "httpMethod": "GET",
 	//   "id": "iam.projects.serviceAccounts.list",
 	//   "parameterOrder": [
@@ -1564,20 +1782,20 @@
 	//   ],
 	//   "parameters": {
 	//     "name": {
-	//       "description": "Required. The resource name of the project associated with the service accounts, such as `projects/my-project-123`.",
+	//       "description": "Required. The resource name of the project associated with the service\naccounts, such as `projects/my-project-123`.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*$",
+	//       "pattern": "^projects/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "pageSize": {
-	//       "description": "Optional limit on the number of service accounts to include in the response. Further accounts can subsequently be obtained by including the ListServiceAccountsResponse.next_page_token in a subsequent request.",
+	//       "description": "Optional limit on the number of service accounts to include in the\nresponse. Further accounts can subsequently be obtained by including the\nListServiceAccountsResponse.next_page_token\nin a subsequent request.",
 	//       "format": "int32",
 	//       "location": "query",
 	//       "type": "integer"
 	//     },
 	//     "pageToken": {
-	//       "description": "Optional pagination token returned in an earlier ListServiceAccountsResponse.next_page_token.",
+	//       "description": "Optional pagination token returned in an earlier\nListServiceAccountsResponse.next_page_token.",
 	//       "location": "query",
 	//       "type": "string"
 	//     }
@@ -1625,7 +1843,8 @@
 	header_             http.Header
 }
 
-// SetIamPolicy: Sets the IAM access control policy for a
+// SetIamPolicy: Sets the IAM access control policy for
+// a
 // ServiceAccount.
 func (r *ProjectsServiceAccountsService) SetIamPolicy(resource string, setiampolicyrequest *SetIamPolicyRequest) *ProjectsServiceAccountsSetIamPolicyCall {
 	c := &ProjectsServiceAccountsSetIamPolicyCall{s: r.s, urlParams_: make(gensupport.URLParams)}
@@ -1665,6 +1884,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -1720,7 +1940,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Sets the IAM access control policy for a ServiceAccount.",
+	//   "description": "Sets the IAM access control policy for a\nServiceAccount.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:setIamPolicy",
 	//   "httpMethod": "POST",
 	//   "id": "iam.projects.serviceAccounts.setIamPolicy",
 	//   "parameterOrder": [
@@ -1728,9 +1949,9 @@
 	//   ],
 	//   "parameters": {
 	//     "resource": {
-	//       "description": "REQUIRED: The resource for which the policy is being specified. `resource` is usually specified as a path. For example, a Project resource is specified as `projects/{project}`.",
+	//       "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
+	//       "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     }
@@ -1800,6 +2021,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.signblobrequest)
 	if err != nil {
@@ -1856,6 +2078,7 @@
 	return ret, nil
 	// {
 	//   "description": "Signs a blob using a service account's system-managed private key.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:signBlob",
 	//   "httpMethod": "POST",
 	//   "id": "iam.projects.serviceAccounts.signBlob",
 	//   "parameterOrder": [
@@ -1863,9 +2086,9 @@
 	//   ],
 	//   "parameters": {
 	//     "name": {
-	//       "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
+	//       "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
+	//       "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     }
@@ -1884,6 +2107,149 @@
 
 }
 
+// method id "iam.projects.serviceAccounts.signJwt":
+
+type ProjectsServiceAccountsSignJwtCall struct {
+	s              *Service
+	name           string
+	signjwtrequest *SignJwtRequest
+	urlParams_     gensupport.URLParams
+	ctx_           context.Context
+	header_        http.Header
+}
+
+// SignJwt: Signs a JWT using a service account's system-managed private
+// key.
+//
+// If no expiry time (`exp`) is provided in the `SignJwtRequest`, IAM
+// sets an
+// an expiry time of one hour by default. If you request an expiry time
+// of
+// more than one hour, the request will fail.
+func (r *ProjectsServiceAccountsService) SignJwt(name string, signjwtrequest *SignJwtRequest) *ProjectsServiceAccountsSignJwtCall {
+	c := &ProjectsServiceAccountsSignJwtCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.name = name
+	c.signjwtrequest = signjwtrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ProjectsServiceAccountsSignJwtCall) Fields(s ...googleapi.Field) *ProjectsServiceAccountsSignJwtCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ProjectsServiceAccountsSignJwtCall) Context(ctx context.Context) *ProjectsServiceAccountsSignJwtCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ProjectsServiceAccountsSignJwtCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ProjectsServiceAccountsSignJwtCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.signjwtrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+name}:signJwt")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"name": c.name,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "iam.projects.serviceAccounts.signJwt" call.
+// Exactly one of *SignJwtResponse or error will be non-nil. Any non-2xx
+// status code is an error. Response headers are in either
+// *SignJwtResponse.ServerResponse.Header or (if a response was returned
+// at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *ProjectsServiceAccountsSignJwtCall) Do(opts ...googleapi.CallOption) (*SignJwtResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &SignJwtResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Signs a JWT using a service account's system-managed private key.\n\nIf no expiry time (`exp`) is provided in the `SignJwtRequest`, IAM sets an\nan expiry time of one hour by default. If you request an expiry time of\nmore than one hour, the request will fail.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:signJwt",
+	//   "httpMethod": "POST",
+	//   "id": "iam.projects.serviceAccounts.signJwt",
+	//   "parameterOrder": [
+	//     "name"
+	//   ],
+	//   "parameters": {
+	//     "name": {
+	//       "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
+	//       "location": "path",
+	//       "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1/{+name}:signJwt",
+	//   "request": {
+	//     "$ref": "SignJwtRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "SignJwtResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform"
+	//   ]
+	// }
+
+}
+
 // method id "iam.projects.serviceAccounts.testIamPermissions":
 
 type ProjectsServiceAccountsTestIamPermissionsCall struct {
@@ -1896,7 +2262,8 @@
 }
 
 // TestIamPermissions: Tests the specified permissions against the IAM
-// access control policy for a ServiceAccount.
+// access control policy
+// for a ServiceAccount.
 func (r *ProjectsServiceAccountsService) TestIamPermissions(resource string, testiampermissionsrequest *TestIamPermissionsRequest) *ProjectsServiceAccountsTestIamPermissionsCall {
 	c := &ProjectsServiceAccountsTestIamPermissionsCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.resource = resource
@@ -1935,6 +2302,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -1990,7 +2358,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Tests the specified permissions against the IAM access control policy for a ServiceAccount.",
+	//   "description": "Tests the specified permissions against the IAM access control policy\nfor a ServiceAccount.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:testIamPermissions",
 	//   "httpMethod": "POST",
 	//   "id": "iam.projects.serviceAccounts.testIamPermissions",
 	//   "parameterOrder": [
@@ -1998,9 +2367,9 @@
 	//   ],
 	//   "parameters": {
 	//     "resource": {
-	//       "description": "REQUIRED: The resource for which the policy detail is being requested. `resource` is usually specified as a path. For example, a Project resource is specified as `projects/{project}`.",
+	//       "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
+	//       "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     }
@@ -2030,8 +2399,11 @@
 	header_        http.Header
 }
 
-// Update: Updates a ServiceAccount. Currently, only the following
-// fields are updatable: `display_name` . The `etag` is mandatory.
+// Update: Updates a ServiceAccount.
+//
+// Currently, only the following fields are updatable:
+// `display_name` .
+// The `etag` is mandatory.
 func (r *ProjectsServiceAccountsService) Update(name string, serviceaccount *ServiceAccount) *ProjectsServiceAccountsUpdateCall {
 	c := &ProjectsServiceAccountsUpdateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.name = name
@@ -2070,6 +2442,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.serviceaccount)
 	if err != nil {
@@ -2125,7 +2498,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Updates a ServiceAccount. Currently, only the following fields are updatable: `display_name` . The `etag` is mandatory.",
+	//   "description": "Updates a ServiceAccount.\n\nCurrently, only the following fields are updatable:\n`display_name` .\nThe `etag` is mandatory.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}",
 	//   "httpMethod": "PUT",
 	//   "id": "iam.projects.serviceAccounts.update",
 	//   "parameterOrder": [
@@ -2133,9 +2507,9 @@
 	//   ],
 	//   "parameters": {
 	//     "name": {
-	//       "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Requests using `-` as a wildcard for the project will infer the project from the `account` and the `account` value can be the `email` address or the `unique_id` of the service account. In responses the resource name will always be in the format `projects/{project}/serviceAccounts/{email}`.",
+	//       "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\n\nRequests using `-` as a wildcard for the project will infer the project\nfrom the `account` and the `account` value can be the `email` address or\nthe `unique_id` of the service account.\n\nIn responses the resource name will always be in the format\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
+	//       "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     }
@@ -2165,7 +2539,8 @@
 	header_                        http.Header
 }
 
-// Create: Creates a ServiceAccountKey and returns it.
+// Create: Creates a ServiceAccountKey
+// and returns it.
 func (r *ProjectsServiceAccountsKeysService) Create(name string, createserviceaccountkeyrequest *CreateServiceAccountKeyRequest) *ProjectsServiceAccountsKeysCreateCall {
 	c := &ProjectsServiceAccountsKeysCreateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.name = name
@@ -2204,6 +2579,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.createserviceaccountkeyrequest)
 	if err != nil {
@@ -2259,7 +2635,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Creates a ServiceAccountKey and returns it.",
+	//   "description": "Creates a ServiceAccountKey\nand returns it.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys",
 	//   "httpMethod": "POST",
 	//   "id": "iam.projects.serviceAccounts.keys.create",
 	//   "parameterOrder": [
@@ -2267,9 +2644,9 @@
 	//   ],
 	//   "parameters": {
 	//     "name": {
-	//       "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
+	//       "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
+	//       "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     }
@@ -2336,6 +2713,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+name}")
@@ -2387,6 +2765,7 @@
 	return ret, nil
 	// {
 	//   "description": "Deletes a ServiceAccountKey.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys/{keysId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "iam.projects.serviceAccounts.keys.delete",
 	//   "parameterOrder": [
@@ -2394,9 +2773,9 @@
 	//   ],
 	//   "parameters": {
 	//     "name": {
-	//       "description": "The resource name of the service account key in the following format: `projects/{project}/serviceAccounts/{account}/keys/{key}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
+	//       "description": "The resource name of the service account key in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}/keys/{key}`.\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*/serviceAccounts/[^/]*/keys/[^/]*$",
+	//       "pattern": "^projects/[^/]+/serviceAccounts/[^/]+/keys/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     }
@@ -2423,7 +2802,8 @@
 	header_      http.Header
 }
 
-// Get: Gets the ServiceAccountKey by key id.
+// Get: Gets the ServiceAccountKey
+// by key id.
 func (r *ProjectsServiceAccountsKeysService) Get(name string) *ProjectsServiceAccountsKeysGetCall {
 	c := &ProjectsServiceAccountsKeysGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.name = name
@@ -2431,8 +2811,8 @@
 }
 
 // PublicKeyType sets the optional parameter "publicKeyType": The output
-// format of the public key requested. X509_PEM is the default output
-// format.
+// format of the public key requested.
+// X509_PEM is the default output format.
 //
 // Possible values:
 //   "TYPE_NONE"
@@ -2484,6 +2864,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2537,7 +2918,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Gets the ServiceAccountKey by key id.",
+	//   "description": "Gets the ServiceAccountKey\nby key id.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys/{keysId}",
 	//   "httpMethod": "GET",
 	//   "id": "iam.projects.serviceAccounts.keys.get",
 	//   "parameterOrder": [
@@ -2545,14 +2927,14 @@
 	//   ],
 	//   "parameters": {
 	//     "name": {
-	//       "description": "The resource name of the service account key in the following format: `projects/{project}/serviceAccounts/{account}/keys/{key}`. Using `-` as a wildcard for the project will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
+	//       "description": "The resource name of the service account key in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}/keys/{key}`.\n\nUsing `-` as a wildcard for the project will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*/serviceAccounts/[^/]*/keys/[^/]*$",
+	//       "pattern": "^projects/[^/]+/serviceAccounts/[^/]+/keys/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     },
 	//     "publicKeyType": {
-	//       "description": "The output format of the public key requested. X509_PEM is the default output format.",
+	//       "description": "The output format of the public key requested.\nX509_PEM is the default output format.",
 	//       "enum": [
 	//         "TYPE_NONE",
 	//         "TYPE_X509_PEM_FILE",
@@ -2592,9 +2974,9 @@
 }
 
 // KeyTypes sets the optional parameter "keyTypes": Filters the types of
-// keys the user wants to include in the list response. Duplicate key
-// types are not allowed. If no key type is provided, all keys are
-// returned.
+// keys the user wants to include in the list
+// response. Duplicate key types are not allowed. If no key type
+// is provided, all keys are returned.
 //
 // Possible values:
 //   "KEY_TYPE_UNSPECIFIED"
@@ -2646,6 +3028,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2700,6 +3083,7 @@
 	return ret, nil
 	// {
 	//   "description": "Lists ServiceAccountKeys.",
+	//   "flatPath": "v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys",
 	//   "httpMethod": "GET",
 	//   "id": "iam.projects.serviceAccounts.keys.list",
 	//   "parameterOrder": [
@@ -2707,7 +3091,7 @@
 	//   ],
 	//   "parameters": {
 	//     "keyTypes": {
-	//       "description": "Filters the types of keys the user wants to include in the list response. Duplicate key types are not allowed. If no key type is provided, all keys are returned.",
+	//       "description": "Filters the types of keys the user wants to include in the list\nresponse. Duplicate key types are not allowed. If no key type\nis provided, all keys are returned.",
 	//       "enum": [
 	//         "KEY_TYPE_UNSPECIFIED",
 	//         "USER_MANAGED",
@@ -2718,9 +3102,9 @@
 	//       "type": "string"
 	//     },
 	//     "name": {
-	//       "description": "The resource name of the service account in the following format: `projects/{project}/serviceAccounts/{account}`. Using `-` as a wildcard for the project, will infer the project from the account. The `account` value can be the `email` address or the `unique_id` of the service account.",
+	//       "description": "The resource name of the service account in the following format:\n`projects/{PROJECT_ID}/serviceAccounts/{SERVICE_ACCOUNT_EMAIL}`.\n\nUsing `-` as a wildcard for the project, will infer the project from\nthe account. The `account` value can be the `email` address or the\n`unique_id` of the service account.",
 	//       "location": "path",
-	//       "pattern": "^projects/[^/]*/serviceAccounts/[^/]*$",
+	//       "pattern": "^projects/[^/]+/serviceAccounts/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     }
@@ -2747,8 +3131,10 @@
 }
 
 // QueryGrantableRoles: Queries roles that can be granted on a
-// particular resource. A role is grantable if it can be used as the
-// role in a binding for a policy for that resource.
+// particular resource.
+// A role is grantable if it can be used as the role in a binding for a
+// policy
+// for that resource.
 func (r *RolesService) QueryGrantableRoles(querygrantablerolesrequest *QueryGrantableRolesRequest) *RolesQueryGrantableRolesCall {
 	c := &RolesQueryGrantableRolesCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.querygrantablerolesrequest = querygrantablerolesrequest
@@ -2786,6 +3172,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.querygrantablerolesrequest)
 	if err != nil {
@@ -2838,9 +3225,12 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Queries roles that can be granted on a particular resource. A role is grantable if it can be used as the role in a binding for a policy for that resource.",
+	//   "description": "Queries roles that can be granted on a particular resource.\nA role is grantable if it can be used as the role in a binding for a policy\nfor that resource.",
+	//   "flatPath": "v1/roles:queryGrantableRoles",
 	//   "httpMethod": "POST",
 	//   "id": "iam.roles.queryGrantableRoles",
+	//   "parameterOrder": [],
+	//   "parameters": {},
 	//   "path": "v1/roles:queryGrantableRoles",
 	//   "request": {
 	//     "$ref": "QueryGrantableRolesRequest"
diff --git a/identitytoolkit/v3/identitytoolkit-api.json b/identitytoolkit/v3/identitytoolkit-api.json
index dda7ad5..b296adc 100644
--- a/identitytoolkit/v3/identitytoolkit-api.json
+++ b/identitytoolkit/v3/identitytoolkit-api.json
@@ -1,12 +1,12 @@
 {
  "kind": "discovery#restDescription",
- "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/9lrbPxfnfcTzLSOgIxD2Vj83GmI\"",
+ "etag": "\"tbys6C40o18GZwyMen5GMkdK-3s/Eza5dkILxsH0BZXGL1UuGyoKbqY\"",
  "discoveryVersion": "v1",
  "id": "identitytoolkit:v3",
  "name": "identitytoolkit",
  "canonicalName": "Identity Toolkit",
  "version": "v3",
- "revision": "20161206",
+ "revision": "20170203",
  "title": "Google Identity Toolkit API",
  "description": "Help the third party sites to implement federated login.",
  "ownerDomain": "google.com",
@@ -138,7 +138,7 @@
   "DownloadAccountResponse": {
    "id": "DownloadAccountResponse",
    "type": "object",
-   "description": "Respone of downloading accounts in batch.",
+   "description": "Response of downloading accounts in batch.",
    "properties": {
     "kind": {
      "type": "string",
@@ -717,6 +717,10 @@
      "type": "string",
      "description": "Instance id token of the app."
     },
+    "localId": {
+     "type": "string",
+     "description": "Privileged caller can create user with specified user id."
+    },
     "password": {
      "type": "string",
      "description": "The new password of the user."
@@ -1010,6 +1014,10 @@
      "type": "string",
      "description": "The email of the user."
     },
+    "emailVerified": {
+     "type": "boolean",
+     "description": "If email has been verified."
+    },
     "expiresIn": {
      "type": "string",
      "description": "If idToken is STS id token, then this field will be expiration time of STS id token in seconds.",
@@ -1324,6 +1332,10 @@
      "type": "string",
      "description": "It's the identifier param in the createAuthUri request if the identifier is an email. It can be used to check whether the user input email is different from the asserted email."
     },
+    "isNewUser": {
+     "type": "boolean",
+     "description": "True if it's a new user sign-in, false if it's a returning user."
+    },
     "kind": {
      "type": "string",
      "description": "The fixed string \"identitytoolkit#VerifyAssertionResponse\".",
diff --git a/identitytoolkit/v3/identitytoolkit-gen.go b/identitytoolkit/v3/identitytoolkit-gen.go
index 40d16fa..c93cf7a 100644
--- a/identitytoolkit/v3/identitytoolkit-gen.go
+++ b/identitytoolkit/v3/identitytoolkit-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Relyingparty *RelyingpartyService
 }
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewRelyingpartyService(s *Service) *RelyingpartyService {
 	rs := &RelyingpartyService{s: s}
 	return rs
@@ -177,7 +182,7 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// DownloadAccountResponse: Respone of downloading accounts in batch.
+// DownloadAccountResponse: Response of downloading accounts in batch.
 type DownloadAccountResponse struct {
 	// Kind: The fixed string "identitytoolkit#DownloadAccountResponse".
 	Kind string `json:"kind,omitempty"`
@@ -961,6 +966,9 @@
 	// InstanceId: Instance id token of the app.
 	InstanceId string `json:"instanceId,omitempty"`
 
+	// LocalId: Privileged caller can create user with specified user id.
+	LocalId string `json:"localId,omitempty"`
+
 	// Password: The new password of the user.
 	Password string `json:"password,omitempty"`
 
@@ -1362,6 +1370,9 @@
 	// Email: The email of the user.
 	Email string `json:"email,omitempty"`
 
+	// EmailVerified: If email has been verified.
+	EmailVerified bool `json:"emailVerified,omitempty"`
+
 	// ExpiresIn: If idToken is STS id token, then this field will be
 	// expiration time of STS id token in seconds.
 	ExpiresIn int64 `json:"expiresIn,omitempty,string"`
@@ -1767,6 +1778,10 @@
 	// input email is different from the asserted email.
 	InputEmail string `json:"inputEmail,omitempty"`
 
+	// IsNewUser: True if it's a new user sign-in, false if it's a returning
+	// user.
+	IsNewUser bool `json:"isNewUser,omitempty"`
+
 	// Kind: The fixed string "identitytoolkit#VerifyAssertionResponse".
 	Kind string `json:"kind,omitempty"`
 
@@ -2034,6 +2049,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartycreateauthurirequest)
 	if err != nil {
@@ -2151,6 +2167,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartydeleteaccountrequest)
 	if err != nil {
@@ -2268,6 +2285,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartydownloadaccountrequest)
 	if err != nil {
@@ -2407,6 +2425,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartygetaccountinforequest)
 	if err != nil {
@@ -2524,6 +2543,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.relyingparty)
 	if err != nil {
@@ -2665,6 +2685,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2800,6 +2821,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2901,6 +2923,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3013,6 +3036,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartyresetpasswordrequest)
 	if err != nil {
@@ -3130,6 +3154,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartysetaccountinforequest)
 	if err != nil {
@@ -3247,6 +3272,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartysetprojectconfigrequest)
 	if err != nil {
@@ -3366,6 +3392,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartysignoutuserrequest)
 	if err != nil {
@@ -3485,6 +3512,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartysignupnewuserrequest)
 	if err != nil {
@@ -3602,6 +3630,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartyuploadaccountrequest)
 	if err != nil {
@@ -3720,6 +3749,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartyverifyassertionrequest)
 	if err != nil {
@@ -3837,6 +3867,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartyverifycustomtokenrequest)
 	if err != nil {
@@ -3954,6 +3985,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.identitytoolkitrelyingpartyverifypasswordrequest)
 	if err != nil {
diff --git a/kgsearch/v1/kgsearch-api.json b/kgsearch/v1/kgsearch-api.json
index e5cadc7..93f45e4 100644
--- a/kgsearch/v1/kgsearch-api.json
+++ b/kgsearch/v1/kgsearch-api.json
@@ -1,164 +1,74 @@
 {
-  "id": "kgsearch:v1",
-  "description": "Searches the Google Knowledge Graph for entities.",
-  "protocol": "rest",
-  "title": "Knowledge Graph Search API",
+  "discoveryVersion": "v1",
+  "ownerName": "Google",
+  "version_module": "True",
   "resources": {
     "entities": {
       "methods": {
         "search": {
           "id": "kgsearch.entities.search",
+          "path": "v1/entities:search",
+          "description": "Searches Knowledge Graph for entities that match the constraints.\nA list of matched entities will be returned in response, which will be in\nJSON-LD format and compatible with http://schema.org",
+          "httpMethod": "GET",
+          "parameterOrder": [],
           "response": {
             "$ref": "SearchResponse"
           },
-          "parameterOrder": [],
-          "description": "Searches Knowledge Graph for entities that match the constraints.\nA list of matched entities will be returned in response, which will be in\nJSON-LD format and compatible with http://schema.org",
-          "flatPath": "v1/entities:search",
-          "httpMethod": "GET",
           "parameters": {
             "limit": {
-              "description": "Limits the number of entities to be returned.",
-              "location": "query",
               "type": "integer",
-              "format": "int32"
-            },
-            "ids": {
-              "description": "The list of entity id to be used for search instead of query string.\nTo specify multiple ids in the HTTP request, repeat the parameter in the\nURL as in ...?ids=A&ids=B",
-              "repeated": true,
               "location": "query",
-              "type": "string"
+              "description": "Limits the number of entities to be returned.",
+              "format": "int32"
             },
             "prefix": {
               "description": "Enables prefix match against names and aliases of entities",
-              "location": "query",
-              "type": "boolean"
+              "type": "boolean",
+              "location": "query"
             },
             "query": {
               "description": "The literal query string for search.",
-              "location": "query",
-              "type": "string"
-            },
-            "indent": {
-              "description": "Enables indenting of json results.",
-              "location": "query",
-              "type": "boolean"
+              "type": "string",
+              "location": "query"
             },
             "types": {
               "description": "Restricts returned entities with these types, e.g. Person\n(as defined in http://schema.org/Person). If multiple types are specified,\nreturned entities will contain one or more of these types.",
+              "type": "string",
               "repeated": true,
+              "location": "query"
+            },
+            "indent": {
+              "type": "boolean",
               "location": "query",
-              "type": "string"
+              "description": "Enables indenting of json results."
             },
             "languages": {
-              "description": "The list of language codes (defined in ISO 693) to run the query with,\ne.g. 'en'.",
-              "repeated": true,
               "location": "query",
-              "type": "string"
+              "description": "The list of language codes (defined in ISO 693) to run the query with,\ne.g. 'en'.",
+              "type": "string",
+              "repeated": true
+            },
+            "ids": {
+              "description": "The list of entity id to be used for search instead of query string.\nTo specify multiple ids in the HTTP request, repeat the parameter in the\nURL as in ...?ids=A&ids=B",
+              "type": "string",
+              "repeated": true,
+              "location": "query"
             }
           },
-          "path": "v1/entities:search"
+          "flatPath": "v1/entities:search"
         }
       }
     }
   },
-  "schemas": {
-    "SearchResponse": {
-      "description": "Response message includes the context and a list of matching results\nwhich contain the detail of associated entities.",
-      "type": "object",
-      "properties": {
-        "@context": {
-          "description": "The local context applicable for the response. See more details at\nhttp://www.w3.org/TR/json-ld/#context-definitions.",
-          "type": "any"
-        },
-        "@type": {
-          "description": "The schema type of top-level JSON-LD object, e.g. ItemList.",
-          "type": "any"
-        },
-        "itemListElement": {
-          "description": "The item list of search results.",
-          "type": "array",
-          "items": {
-            "type": "any"
-          }
-        }
-      },
-      "id": "SearchResponse"
-    }
-  },
-  "revision": "20170109",
-  "basePath": "",
-  "icons": {
-    "x32": "http://www.google.com/images/icons/product/search-32.gif",
-    "x16": "http://www.google.com/images/icons/product/search-16.gif"
-  },
-  "version_module": "True",
-  "discoveryVersion": "v1",
-  "baseUrl": "https://kgsearch.googleapis.com/",
-  "name": "kgsearch",
   "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
     "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
       "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
     },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
+    "bearer_token": {
+      "description": "OAuth bearer token.",
       "type": "string",
       "location": "query"
     },
@@ -167,28 +77,118 @@
       "type": "string",
       "location": "query"
     },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
     "upload_protocol": {
+      "location": "query",
       "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "alt": {
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
       "type": "string",
-      "location": "query"
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json"
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "type": "string",
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters."
     }
   },
-  "documentationLink": "https://developers.google.com/knowledge-graph/",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
-  "servicePath": "",
-  "ownerName": "Google",
+  "schemas": {
+    "SearchResponse": {
+      "properties": {
+        "@context": {
+          "description": "The local context applicable for the response. See more details at\nhttp://www.w3.org/TR/json-ld/#context-definitions.",
+          "type": "any"
+        },
+        "itemListElement": {
+          "description": "The item list of search results.",
+          "type": "array",
+          "items": {
+            "type": "any"
+          }
+        },
+        "@type": {
+          "description": "The schema type of top-level JSON-LD object, e.g. ItemList.",
+          "type": "any"
+        }
+      },
+      "id": "SearchResponse",
+      "description": "Response message includes the context and a list of matching results\nwhich contain the detail of associated entities.",
+      "type": "object"
+    }
+  },
+  "icons": {
+    "x32": "http://www.google.com/images/icons/product/search-32.gif",
+    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+  },
+  "protocol": "rest",
   "version": "v1",
+  "baseUrl": "https://kgsearch.googleapis.com/",
+  "servicePath": "",
+  "description": "Searches the Google Knowledge Graph for entities.",
+  "kind": "discovery#restDescription",
   "rootUrl": "https://kgsearch.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "kgsearch",
+  "batchPath": "batch",
+  "id": "kgsearch:v1",
+  "documentationLink": "https://developers.google.com/knowledge-graph/",
+  "revision": "20170109",
+  "title": "Knowledge Graph Search API"
 }
diff --git a/kgsearch/v1/kgsearch-gen.go b/kgsearch/v1/kgsearch-gen.go
index 3af8e38..3dd03d6 100644
--- a/kgsearch/v1/kgsearch-gen.go
+++ b/kgsearch/v1/kgsearch-gen.go
@@ -55,9 +55,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Entities *EntitiesService
 }
@@ -69,6 +70,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewEntitiesService(s *Service) *EntitiesService {
 	rs := &EntitiesService{s: s}
 	return rs
@@ -231,6 +236,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/language/v1/language-api.json b/language/v1/language-api.json
index ec96017..153284a 100644
--- a/language/v1/language-api.json
+++ b/language/v1/language-api.json
@@ -1,390 +1,528 @@
 {
+  "basePath": "",
   "id": "language:v1",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        }
-      }
-    }
-  },
-  "description": "Google Cloud Natural Language API provides natural language understanding technologies to developers. Examples include sentiment analysis, entity recognition, and text annotations.",
-  "protocol": "rest",
-  "title": "Google Cloud Natural Language API",
-  "resources": {
-    "documents": {
-      "methods": {
-        "analyzeSentiment": {
-          "id": "language.documents.analyzeSentiment",
-          "response": {
-            "$ref": "AnalyzeSentimentResponse"
-          },
-          "parameterOrder": [],
-          "description": "Analyzes the sentiment of the provided text.",
-          "request": {
-            "$ref": "AnalyzeSentimentRequest"
-          },
-          "flatPath": "v1/documents:analyzeSentiment",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/documents:analyzeSentiment",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "analyzeSyntax": {
-          "id": "language.documents.analyzeSyntax",
-          "response": {
-            "$ref": "AnalyzeSyntaxResponse"
-          },
-          "parameterOrder": [],
-          "description": "Analyzes the syntax of the text and provides sentence boundaries and\ntokenization along with part of speech tags, dependency trees, and other\nproperties.",
-          "request": {
-            "$ref": "AnalyzeSyntaxRequest"
-          },
-          "flatPath": "v1/documents:analyzeSyntax",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/documents:analyzeSyntax",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "annotateText": {
-          "id": "language.documents.annotateText",
-          "response": {
-            "$ref": "AnnotateTextResponse"
-          },
-          "parameterOrder": [],
-          "description": "A convenience method that provides all the features that analyzeSentiment,\nanalyzeEntities, and analyzeSyntax provide in one call.",
-          "request": {
-            "$ref": "AnnotateTextRequest"
-          },
-          "flatPath": "v1/documents:annotateText",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/documents:annotateText",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "analyzeEntities": {
-          "id": "language.documents.analyzeEntities",
-          "response": {
-            "$ref": "AnalyzeEntitiesResponse"
-          },
-          "parameterOrder": [],
-          "description": "Finds named entities (currently finds proper names) in the text,\nentity types, salience, mentions for each entity, and other properties.",
-          "request": {
-            "$ref": "AnalyzeEntitiesRequest"
-          },
-          "flatPath": "v1/documents:analyzeEntities",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/documents:analyzeEntities",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        }
-      }
-    }
-  },
+  "revision": "20170206",
+  "documentationLink": "https://cloud.google.com/natural-language/",
+  "discoveryVersion": "v1",
+  "version_module": "True",
   "schemas": {
-    "Document": {
-      "description": "################################################################ #\n\nRepresents the input to API methods.",
+    "PartOfSpeech": {
+      "description": "Represents part of speech information for a token. Parts of speech\nare as defined in\nhttp://www.lrec-conf.org/proceedings/lrec2012/pdf/274_Paper.pdf",
       "type": "object",
       "properties": {
-        "language": {
-          "description": "The language of the document (if not specified, the language is\nautomatically detected). Both ISO and BCP-47 language codes are\naccepted.\u003cbr\u003e\n**Current Language Restrictions:**\n\n * Only English, Spanish, and Japanese textual content are supported.\nIf the language (either specified by the caller or automatically detected)\nis not supported by the called API method, an `INVALID_ARGUMENT` error\nis returned.",
-          "type": "string"
-        },
-        "gcsContentUri": {
-          "description": "The Google Cloud Storage URI where the file content is located.\nThis URI must be of the form: gs://bucket_name/object_name. For more\ndetails, see https://cloud.google.com/storage/docs/reference-uris.\nNOTE: Cloud Storage object versioning is not supported.",
-          "type": "string"
-        },
-        "type": {
-          "description": "Required. If the type is not set or is `TYPE_UNSPECIFIED`,\nreturns an `INVALID_ARGUMENT` error.",
-          "enum": [
-            "TYPE_UNSPECIFIED",
-            "PLAIN_TEXT",
-            "HTML"
-          ],
+        "proper": {
           "enumDescriptions": [
-            "The content type is not specified.",
-            "Plain text",
-            "HTML"
+            "Proper is not applicable in the analyzed language or is not predicted.",
+            "Proper",
+            "Not proper"
           ],
-          "type": "string"
-        },
-        "content": {
-          "description": "The content of the input in string format.",
-          "type": "string"
-        }
-      },
-      "id": "Document"
-    },
-    "TextSpan": {
-      "description": "Represents an output piece of text.",
-      "type": "object",
-      "properties": {
-        "beginOffset": {
-          "description": "The API calculates the beginning offset of the content in the original\ndocument according to the EncodingType specified in the API request.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "content": {
-          "description": "The content of the output text.",
-          "type": "string"
-        }
-      },
-      "id": "TextSpan"
-    },
-    "Status": {
-      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
-      "type": "object",
-      "properties": {
-        "code": {
-          "description": "The status code, which should be an enum value of google.rpc.Code.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "details": {
-          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
-          "type": "array",
-          "items": {
-            "additionalProperties": {
-              "description": "Properties of the object. Contains field @type with type URL.",
-              "type": "any"
-            },
-            "type": "object"
-          }
-        },
-        "message": {
-          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
-          "type": "string"
-        }
-      },
-      "id": "Status"
-    },
-    "AnalyzeEntitiesRequest": {
-      "description": "The entity analysis request message.",
-      "type": "object",
-      "properties": {
-        "document": {
-          "description": "Input document.",
-          "$ref": "Document"
-        },
-        "encodingType": {
-          "description": "The encoding type used by the API to calculate offsets.",
           "enum": [
-            "NONE",
-            "UTF8",
-            "UTF16",
-            "UTF32"
-          ],
-          "enumDescriptions": [
-            "If `EncodingType` is not specified, encoding-dependent information (such as\n`begin_offset`) will be set at `-1`.",
-            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-8 encoding of the input. C++ and Go are examples of languages\nthat use this encoding natively.",
-            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-16 encoding of the input. Java and Javascript are examples of\nlanguages that use this encoding natively.",
-            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-32 encoding of the input. Python is an example of a language\nthat uses this encoding natively."
-          ],
-          "type": "string"
-        }
-      },
-      "id": "AnalyzeEntitiesRequest"
-    },
-    "EntityMention": {
-      "description": "Represents a mention for an entity in the text. Currently, proper noun\nmentions are supported.",
-      "type": "object",
-      "properties": {
-        "text": {
-          "description": "The mention text.",
-          "$ref": "TextSpan"
-        },
-        "type": {
-          "description": "The type of the entity mention.",
-          "enum": [
-            "TYPE_UNKNOWN",
+            "PROPER_UNKNOWN",
             "PROPER",
-            "COMMON"
+            "NOT_PROPER"
           ],
+          "description": "The grammatical properness.",
+          "type": "string"
+        },
+        "case": {
+          "enumDescriptions": [
+            "Case is not applicable in the analyzed language or is not predicted.",
+            "Accusative",
+            "Adverbial",
+            "Complementive",
+            "Dative",
+            "Genitive",
+            "Instrumental",
+            "Locative",
+            "Nominative",
+            "Oblique",
+            "Partitive",
+            "Prepositional",
+            "Reflexive",
+            "Relative",
+            "Vocative"
+          ],
+          "enum": [
+            "CASE_UNKNOWN",
+            "ACCUSATIVE",
+            "ADVERBIAL",
+            "COMPLEMENTIVE",
+            "DATIVE",
+            "GENITIVE",
+            "INSTRUMENTAL",
+            "LOCATIVE",
+            "NOMINATIVE",
+            "OBLIQUE",
+            "PARTITIVE",
+            "PREPOSITIONAL",
+            "REFLEXIVE_CASE",
+            "RELATIVE_CASE",
+            "VOCATIVE"
+          ],
+          "description": "The grammatical case.",
+          "type": "string"
+        },
+        "tense": {
+          "type": "string",
+          "enumDescriptions": [
+            "Tense is not applicable in the analyzed language or is not predicted.",
+            "Conditional",
+            "Future",
+            "Past",
+            "Present",
+            "Imperfect",
+            "Pluperfect"
+          ],
+          "enum": [
+            "TENSE_UNKNOWN",
+            "CONDITIONAL_TENSE",
+            "FUTURE",
+            "PAST",
+            "PRESENT",
+            "IMPERFECT",
+            "PLUPERFECT"
+          ],
+          "description": "The grammatical tense."
+        },
+        "reciprocity": {
+          "description": "The grammatical reciprocity.",
+          "type": "string",
+          "enumDescriptions": [
+            "Reciprocity is not applicable in the analyzed language or is not\npredicted.",
+            "Reciprocal",
+            "Non-reciprocal"
+          ],
+          "enum": [
+            "RECIPROCITY_UNKNOWN",
+            "RECIPROCAL",
+            "NON_RECIPROCAL"
+          ]
+        },
+        "form": {
+          "enumDescriptions": [
+            "Form is not applicable in the analyzed language or is not predicted.",
+            "Adnomial",
+            "Auxiliary",
+            "Complementizer",
+            "Final ending",
+            "Gerund",
+            "Realis",
+            "Irrealis",
+            "Short form",
+            "Long form",
+            "Order form",
+            "Specific form"
+          ],
+          "enum": [
+            "FORM_UNKNOWN",
+            "ADNOMIAL",
+            "AUXILIARY",
+            "COMPLEMENTIZER",
+            "FINAL_ENDING",
+            "GERUND",
+            "REALIS",
+            "IRREALIS",
+            "SHORT",
+            "LONG",
+            "ORDER",
+            "SPECIFIC"
+          ],
+          "description": "The grammatical form.",
+          "type": "string"
+        },
+        "number": {
+          "enumDescriptions": [
+            "Number is not applicable in the analyzed language or is not predicted.",
+            "Singular",
+            "Plural",
+            "Dual"
+          ],
+          "enum": [
+            "NUMBER_UNKNOWN",
+            "SINGULAR",
+            "PLURAL",
+            "DUAL"
+          ],
+          "description": "The grammatical number.",
+          "type": "string"
+        },
+        "voice": {
+          "type": "string",
+          "enumDescriptions": [
+            "Voice is not applicable in the analyzed language or is not predicted.",
+            "Active",
+            "Causative",
+            "Passive"
+          ],
+          "enum": [
+            "VOICE_UNKNOWN",
+            "ACTIVE",
+            "CAUSATIVE",
+            "PASSIVE"
+          ],
+          "description": "The grammatical voice."
+        },
+        "aspect": {
+          "type": "string",
+          "enumDescriptions": [
+            "Aspect is not applicable in the analyzed language or is not predicted.",
+            "Perfective",
+            "Imperfective",
+            "Progressive"
+          ],
+          "enum": [
+            "ASPECT_UNKNOWN",
+            "PERFECTIVE",
+            "IMPERFECTIVE",
+            "PROGRESSIVE"
+          ],
+          "description": "The grammatical aspect."
+        },
+        "mood": {
+          "enumDescriptions": [
+            "Mood is not applicable in the analyzed language or is not predicted.",
+            "Conditional",
+            "Imperative",
+            "Indicative",
+            "Interrogative",
+            "Jussive",
+            "Subjunctive"
+          ],
+          "enum": [
+            "MOOD_UNKNOWN",
+            "CONDITIONAL_MOOD",
+            "IMPERATIVE",
+            "INDICATIVE",
+            "INTERROGATIVE",
+            "JUSSIVE",
+            "SUBJUNCTIVE"
+          ],
+          "description": "The grammatical mood.",
+          "type": "string"
+        },
+        "tag": {
+          "description": "The part of speech tag.",
+          "type": "string",
           "enumDescriptions": [
             "Unknown",
-            "Proper name",
-            "Common noun (or noun compound)"
+            "Adjective",
+            "Adposition (preposition and postposition)",
+            "Adverb",
+            "Conjunction",
+            "Determiner",
+            "Noun (common and proper)",
+            "Cardinal number",
+            "Pronoun",
+            "Particle or other function word",
+            "Punctuation",
+            "Verb (all tenses and modes)",
+            "Other: foreign words, typos, abbreviations",
+            "Affix"
           ],
+          "enum": [
+            "UNKNOWN",
+            "ADJ",
+            "ADP",
+            "ADV",
+            "CONJ",
+            "DET",
+            "NOUN",
+            "NUM",
+            "PRON",
+            "PRT",
+            "PUNCT",
+            "VERB",
+            "X",
+            "AFFIX"
+          ]
+        },
+        "gender": {
+          "enumDescriptions": [
+            "Gender is not applicable in the analyzed language or is not predicted.",
+            "Feminine",
+            "Masculine",
+            "Neuter"
+          ],
+          "enum": [
+            "GENDER_UNKNOWN",
+            "FEMININE",
+            "MASCULINE",
+            "NEUTER"
+          ],
+          "description": "The grammatical gender.",
           "type": "string"
+        },
+        "person": {
+          "enum": [
+            "PERSON_UNKNOWN",
+            "FIRST",
+            "SECOND",
+            "THIRD",
+            "REFLEXIVE_PERSON"
+          ],
+          "description": "The grammatical person.",
+          "type": "string",
+          "enumDescriptions": [
+            "Person is not applicable in the analyzed language or is not predicted.",
+            "First",
+            "Second",
+            "Third",
+            "Reflexive"
+          ]
         }
       },
-      "id": "EntityMention"
+      "id": "PartOfSpeech"
     },
-    "AnalyzeSentimentRequest": {
-      "description": "The sentiment analysis request message.",
+    "AnalyzeSyntaxRequest": {
+      "id": "AnalyzeSyntaxRequest",
+      "description": "The syntax analysis request message.",
       "type": "object",
       "properties": {
-        "document": {
-          "description": "Input document. Currently, `analyzeSentiment` only supports English text\n(Document.language=\"EN\").",
-          "$ref": "Document"
-        },
         "encodingType": {
-          "description": "The encoding type used by the API to calculate sentence offsets.",
-          "enum": [
-            "NONE",
-            "UTF8",
-            "UTF16",
-            "UTF32"
-          ],
           "enumDescriptions": [
             "If `EncodingType` is not specified, encoding-dependent information (such as\n`begin_offset`) will be set at `-1`.",
             "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-8 encoding of the input. C++ and Go are examples of languages\nthat use this encoding natively.",
             "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-16 encoding of the input. Java and Javascript are examples of\nlanguages that use this encoding natively.",
             "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-32 encoding of the input. Python is an example of a language\nthat uses this encoding natively."
           ],
+          "enum": [
+            "NONE",
+            "UTF8",
+            "UTF16",
+            "UTF32"
+          ],
+          "description": "The encoding type used by the API to calculate offsets.",
           "type": "string"
+        },
+        "document": {
+          "$ref": "Document",
+          "description": "Input document."
         }
-      },
-      "id": "AnalyzeSentimentRequest"
+      }
     },
     "AnalyzeSentimentResponse": {
       "description": "The sentiment analysis response message.",
       "type": "object",
       "properties": {
         "documentSentiment": {
-          "description": "The overall sentiment of the input document.",
-          "$ref": "Sentiment"
+          "$ref": "Sentiment",
+          "description": "The overall sentiment of the input document."
         },
         "language": {
           "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee `Document.language` field for more details.",
           "type": "string"
         },
         "sentences": {
-          "description": "The sentiment for all the sentences in the document.",
           "type": "array",
           "items": {
             "$ref": "Sentence"
-          }
+          },
+          "description": "The sentiment for all the sentences in the document."
         }
       },
       "id": "AnalyzeSentimentResponse"
     },
-    "AnalyzeSyntaxRequest": {
-      "description": "The syntax analysis request message.",
+    "AnalyzeEntitiesResponse": {
+      "properties": {
+        "language": {
+          "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee `Document.language` field for more details.",
+          "type": "string"
+        },
+        "entities": {
+          "description": "The recognized entities in the input document.",
+          "type": "array",
+          "items": {
+            "$ref": "Entity"
+          }
+        }
+      },
+      "id": "AnalyzeEntitiesResponse",
+      "description": "The entity analysis response message.",
+      "type": "object"
+    },
+    "Entity": {
+      "description": "Represents a phrase in the text that is a known entity, such as\na person, an organization, or location. The API associates information, such\nas salience and mentions, with entities.",
       "type": "object",
       "properties": {
-        "document": {
-          "description": "Input document.",
-          "$ref": "Document"
-        },
-        "encodingType": {
-          "description": "The encoding type used by the API to calculate offsets.",
-          "enum": [
-            "NONE",
-            "UTF8",
-            "UTF16",
-            "UTF32"
+        "type": {
+          "enumDescriptions": [
+            "Unknown",
+            "Person",
+            "Location",
+            "Organization",
+            "Event",
+            "Work of art",
+            "Consumer goods",
+            "Other types"
           ],
+          "enum": [
+            "UNKNOWN",
+            "PERSON",
+            "LOCATION",
+            "ORGANIZATION",
+            "EVENT",
+            "WORK_OF_ART",
+            "CONSUMER_GOOD",
+            "OTHER"
+          ],
+          "description": "The entity type.",
+          "type": "string"
+        },
+        "metadata": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Metadata associated with the entity.\n\nCurrently, Wikipedia URLs and Knowledge Graph MIDs are provided, if\navailable. The associated keys are \"wikipedia_url\" and \"mid\", respectively.",
+          "type": "object"
+        },
+        "salience": {
+          "type": "number",
+          "description": "The salience score associated with the entity in the [0, 1.0] range.\n\nThe salience score for an entity provides information about the\nimportance or centrality of that entity to the entire document text.\nScores closer to 0 are less salient, while scores closer to 1.0 are highly\nsalient.",
+          "format": "float"
+        },
+        "mentions": {
+          "description": "The mentions of this entity in the input document. The API currently\nsupports proper noun mentions.",
+          "type": "array",
+          "items": {
+            "$ref": "EntityMention"
+          }
+        },
+        "name": {
+          "description": "The representative name for the entity.",
+          "type": "string"
+        }
+      },
+      "id": "Entity"
+    },
+    "AnalyzeSyntaxResponse": {
+      "description": "The syntax analysis response message.",
+      "type": "object",
+      "properties": {
+        "language": {
+          "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee `Document.language` field for more details.",
+          "type": "string"
+        },
+        "sentences": {
+          "description": "Sentences in the input document.",
+          "type": "array",
+          "items": {
+            "$ref": "Sentence"
+          }
+        },
+        "tokens": {
+          "description": "Tokens, along with their syntactic information, in the input document.",
+          "type": "array",
+          "items": {
+            "$ref": "Token"
+          }
+        }
+      },
+      "id": "AnalyzeSyntaxResponse"
+    },
+    "AnnotateTextRequest": {
+      "properties": {
+        "encodingType": {
+          "type": "string",
           "enumDescriptions": [
             "If `EncodingType` is not specified, encoding-dependent information (such as\n`begin_offset`) will be set at `-1`.",
             "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-8 encoding of the input. C++ and Go are examples of languages\nthat use this encoding natively.",
             "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-16 encoding of the input. Java and Javascript are examples of\nlanguages that use this encoding natively.",
             "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-32 encoding of the input. Python is an example of a language\nthat uses this encoding natively."
           ],
-          "type": "string"
+          "enum": [
+            "NONE",
+            "UTF8",
+            "UTF16",
+            "UTF32"
+          ],
+          "description": "The encoding type used by the API to calculate offsets."
+        },
+        "document": {
+          "description": "Input document.",
+          "$ref": "Document"
+        },
+        "features": {
+          "description": "The enabled features.",
+          "$ref": "Features"
         }
       },
-      "id": "AnalyzeSyntaxRequest"
+      "id": "AnnotateTextRequest",
+      "description": "The request message for the text annotation API, which can perform multiple\nanalysis types (sentiment, entities, and syntax) in one call.",
+      "type": "object"
+    },
+    "AnnotateTextResponse": {
+      "description": "The text annotations response message.",
+      "type": "object",
+      "properties": {
+        "documentSentiment": {
+          "$ref": "Sentiment",
+          "description": "The overall sentiment for the document. Populated if the user enables\nAnnotateTextRequest.Features.extract_document_sentiment."
+        },
+        "language": {
+          "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee `Document.language` field for more details.",
+          "type": "string"
+        },
+        "sentences": {
+          "description": "Sentences in the input document. Populated if the user enables\nAnnotateTextRequest.Features.extract_syntax.",
+          "type": "array",
+          "items": {
+            "$ref": "Sentence"
+          }
+        },
+        "tokens": {
+          "description": "Tokens, along with their syntactic information, in the input document.\nPopulated if the user enables\nAnnotateTextRequest.Features.extract_syntax.",
+          "type": "array",
+          "items": {
+            "$ref": "Token"
+          }
+        },
+        "entities": {
+          "description": "Entities, along with their semantic information, in the input document.\nPopulated if the user enables\nAnnotateTextRequest.Features.extract_entities.",
+          "type": "array",
+          "items": {
+            "$ref": "Entity"
+          }
+        }
+      },
+      "id": "AnnotateTextResponse"
+    },
+    "AnalyzeSentimentRequest": {
+      "type": "object",
+      "properties": {
+        "encodingType": {
+          "enumDescriptions": [
+            "If `EncodingType` is not specified, encoding-dependent information (such as\n`begin_offset`) will be set at `-1`.",
+            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-8 encoding of the input. C++ and Go are examples of languages\nthat use this encoding natively.",
+            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-16 encoding of the input. Java and Javascript are examples of\nlanguages that use this encoding natively.",
+            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-32 encoding of the input. Python is an example of a language\nthat uses this encoding natively."
+          ],
+          "enum": [
+            "NONE",
+            "UTF8",
+            "UTF16",
+            "UTF32"
+          ],
+          "description": "The encoding type used by the API to calculate sentence offsets.",
+          "type": "string"
+        },
+        "document": {
+          "description": "Input document. Currently, `analyzeSentiment` only supports English text\n(Document.language=\"EN\").",
+          "$ref": "Document"
+        }
+      },
+      "id": "AnalyzeSentimentRequest",
+      "description": "The sentiment analysis request message."
     },
     "DependencyEdge": {
-      "description": "Represents dependency parse tree information for a token. (For more\ninformation on dependency labels, see\nhttp://www.aclweb.org/anthology/P13-2017",
-      "type": "object",
       "properties": {
         "headTokenIndex": {
           "description": "Represents the head of this token in the dependency tree.\nThis is the index of the token which has an arc going to this token.\nThe index is the position of the token in the array of tokens returned\nby the API method. If this token is a root token, then the\n`head_token_index` is its own index.",
-          "type": "integer",
-          "format": "int32"
+          "format": "int32",
+          "type": "integer"
         },
         "label": {
           "description": "The parse label for the token.",
-          "enum": [
-            "UNKNOWN",
-            "ABBREV",
-            "ACOMP",
-            "ADVCL",
-            "ADVMOD",
-            "AMOD",
-            "APPOS",
-            "ATTR",
-            "AUX",
-            "AUXPASS",
-            "CC",
-            "CCOMP",
-            "CONJ",
-            "CSUBJ",
-            "CSUBJPASS",
-            "DEP",
-            "DET",
-            "DISCOURSE",
-            "DOBJ",
-            "EXPL",
-            "GOESWITH",
-            "IOBJ",
-            "MARK",
-            "MWE",
-            "MWV",
-            "NEG",
-            "NN",
-            "NPADVMOD",
-            "NSUBJ",
-            "NSUBJPASS",
-            "NUM",
-            "NUMBER",
-            "P",
-            "PARATAXIS",
-            "PARTMOD",
-            "PCOMP",
-            "POBJ",
-            "POSS",
-            "POSTNEG",
-            "PRECOMP",
-            "PRECONJ",
-            "PREDET",
-            "PREF",
-            "PREP",
-            "PRONL",
-            "PRT",
-            "PS",
-            "QUANTMOD",
-            "RCMOD",
-            "RCMODREL",
-            "RDROP",
-            "REF",
-            "REMNANT",
-            "REPARANDUM",
-            "ROOT",
-            "SNUM",
-            "SUFF",
-            "TMOD",
-            "TOPIC",
-            "VMOD",
-            "VOCATIVE",
-            "XCOMP",
-            "SUFFIX",
-            "TITLE",
-            "ADVPHMOD",
-            "AUXCAUS",
-            "AUXVV",
-            "DTMOD",
-            "FOREIGN",
-            "KW",
-            "LIST",
-            "NOMC",
-            "NOMCSUBJ",
-            "NOMCSUBJPASS",
-            "NUMC",
-            "COP",
-            "DISLOCATED"
-          ],
+          "type": "string",
           "enumDescriptions": [
             "Unknown",
             "Abbreviation modifier",
@@ -464,90 +602,184 @@
             "Copula",
             "Dislocated relation (for fronted/topicalized elements)"
           ],
-          "type": "string"
-        }
-      },
-      "id": "DependencyEdge"
-    },
-    "AnalyzeSyntaxResponse": {
-      "description": "The syntax analysis response message.",
-      "type": "object",
-      "properties": {
-        "language": {
-          "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee `Document.language` field for more details.",
-          "type": "string"
-        },
-        "tokens": {
-          "description": "Tokens, along with their syntactic information, in the input document.",
-          "type": "array",
-          "items": {
-            "$ref": "Token"
-          }
-        },
-        "sentences": {
-          "description": "Sentences in the input document.",
-          "type": "array",
-          "items": {
-            "$ref": "Sentence"
-          }
-        }
-      },
-      "id": "AnalyzeSyntaxResponse"
-    },
-    "AnnotateTextRequest": {
-      "description": "The request message for the text annotation API, which can perform multiple\nanalysis types (sentiment, entities, and syntax) in one call.",
-      "type": "object",
-      "properties": {
-        "document": {
-          "description": "Input document.",
-          "$ref": "Document"
-        },
-        "encodingType": {
-          "description": "The encoding type used by the API to calculate offsets.",
           "enum": [
-            "NONE",
-            "UTF8",
-            "UTF16",
-            "UTF32"
-          ],
-          "enumDescriptions": [
-            "If `EncodingType` is not specified, encoding-dependent information (such as\n`begin_offset`) will be set at `-1`.",
-            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-8 encoding of the input. C++ and Go are examples of languages\nthat use this encoding natively.",
-            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-16 encoding of the input. Java and Javascript are examples of\nlanguages that use this encoding natively.",
-            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-32 encoding of the input. Python is an example of a language\nthat uses this encoding natively."
-          ],
-          "type": "string"
-        },
-        "features": {
-          "description": "The enabled features.",
-          "$ref": "Features"
+            "UNKNOWN",
+            "ABBREV",
+            "ACOMP",
+            "ADVCL",
+            "ADVMOD",
+            "AMOD",
+            "APPOS",
+            "ATTR",
+            "AUX",
+            "AUXPASS",
+            "CC",
+            "CCOMP",
+            "CONJ",
+            "CSUBJ",
+            "CSUBJPASS",
+            "DEP",
+            "DET",
+            "DISCOURSE",
+            "DOBJ",
+            "EXPL",
+            "GOESWITH",
+            "IOBJ",
+            "MARK",
+            "MWE",
+            "MWV",
+            "NEG",
+            "NN",
+            "NPADVMOD",
+            "NSUBJ",
+            "NSUBJPASS",
+            "NUM",
+            "NUMBER",
+            "P",
+            "PARATAXIS",
+            "PARTMOD",
+            "PCOMP",
+            "POBJ",
+            "POSS",
+            "POSTNEG",
+            "PRECOMP",
+            "PRECONJ",
+            "PREDET",
+            "PREF",
+            "PREP",
+            "PRONL",
+            "PRT",
+            "PS",
+            "QUANTMOD",
+            "RCMOD",
+            "RCMODREL",
+            "RDROP",
+            "REF",
+            "REMNANT",
+            "REPARANDUM",
+            "ROOT",
+            "SNUM",
+            "SUFF",
+            "TMOD",
+            "TOPIC",
+            "VMOD",
+            "VOCATIVE",
+            "XCOMP",
+            "SUFFIX",
+            "TITLE",
+            "ADVPHMOD",
+            "AUXCAUS",
+            "AUXVV",
+            "DTMOD",
+            "FOREIGN",
+            "KW",
+            "LIST",
+            "NOMC",
+            "NOMCSUBJ",
+            "NOMCSUBJPASS",
+            "NUMC",
+            "COP",
+            "DISLOCATED"
+          ]
         }
       },
-      "id": "AnnotateTextRequest"
+      "id": "DependencyEdge",
+      "description": "Represents dependency parse tree information for a token. (For more\ninformation on dependency labels, see\nhttp://www.aclweb.org/anthology/P13-2017",
+      "type": "object"
     },
-    "Sentence": {
-      "description": "Represents a sentence in the input document.",
+    "Token": {
+      "description": "Represents the smallest syntactic building block of the text.",
       "type": "object",
       "properties": {
         "text": {
-          "description": "The sentence text.",
-          "$ref": "TextSpan"
+          "$ref": "TextSpan",
+          "description": "The token text."
         },
-        "sentiment": {
-          "description": "For calls to AnalyzeSentiment or if\nAnnotateTextRequest.Features.extract_document_sentiment is set to\ntrue, this field will contain the sentiment for the sentence.",
-          "$ref": "Sentiment"
+        "dependencyEdge": {
+          "$ref": "DependencyEdge",
+          "description": "Dependency tree parse for this token."
+        },
+        "lemma": {
+          "description": "[Lemma](https://en.wikipedia.org/wiki/Lemma_%28morphology%29) of the token.",
+          "type": "string"
+        },
+        "partOfSpeech": {
+          "description": "Parts of speech tag for this token.",
+          "$ref": "PartOfSpeech"
         }
       },
-      "id": "Sentence"
+      "id": "Token"
     },
-    "Features": {
-      "description": "All available features for sentiment, syntax, and semantic analysis.\nSetting each one to true will enable that specific analysis for the input.",
+    "TextSpan": {
+      "id": "TextSpan",
+      "description": "Represents an output piece of text.",
       "type": "object",
       "properties": {
-        "extractDocumentSentiment": {
-          "description": "Extract document-level sentiment.",
-          "type": "boolean"
+        "beginOffset": {
+          "description": "The API calculates the beginning offset of the content in the original\ndocument according to the EncodingType specified in the API request.",
+          "format": "int32",
+          "type": "integer"
         },
+        "content": {
+          "description": "The content of the output text.",
+          "type": "string"
+        }
+      }
+    },
+    "Status": {
+      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
+      "type": "object",
+      "properties": {
+        "code": {
+          "description": "The status code, which should be an enum value of google.rpc.Code.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "message": {
+          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
+          "type": "string"
+        },
+        "details": {
+          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
+          "type": "array",
+          "items": {
+            "additionalProperties": {
+              "description": "Properties of the object. Contains field @type with type URL.",
+              "type": "any"
+            },
+            "type": "object"
+          }
+        }
+      },
+      "id": "Status"
+    },
+    "EntityMention": {
+      "properties": {
+        "text": {
+          "$ref": "TextSpan",
+          "description": "The mention text."
+        },
+        "type": {
+          "type": "string",
+          "enumDescriptions": [
+            "Unknown",
+            "Proper name",
+            "Common noun (or noun compound)"
+          ],
+          "enum": [
+            "TYPE_UNKNOWN",
+            "PROPER",
+            "COMMON"
+          ],
+          "description": "The type of the entity mention."
+        }
+      },
+      "id": "EntityMention",
+      "description": "Represents a mention for an entity in the text. Currently, proper noun\nmentions are supported.",
+      "type": "object"
+    },
+    "Features": {
+      "properties": {
         "extractEntities": {
           "description": "Extract entities.",
           "type": "boolean"
@@ -555,531 +787,299 @@
         "extractSyntax": {
           "description": "Extract syntax information.",
           "type": "boolean"
+        },
+        "extractDocumentSentiment": {
+          "description": "Extract document-level sentiment.",
+          "type": "boolean"
         }
       },
-      "id": "Features"
+      "id": "Features",
+      "description": "All available features for sentiment, syntax, and semantic analysis.\nSetting each one to true will enable that specific analysis for the input.",
+      "type": "object"
     },
-    "PartOfSpeech": {
-      "description": "Represents part of speech information for a token. Parts of speech\nare as defined in\nhttp://www.lrec-conf.org/proceedings/lrec2012/pdf/274_Paper.pdf",
+    "Document": {
       "type": "object",
       "properties": {
-        "aspect": {
-          "description": "The grammatical aspect.",
-          "enum": [
-            "ASPECT_UNKNOWN",
-            "PERFECTIVE",
-            "IMPERFECTIVE",
-            "PROGRESSIVE"
-          ],
-          "enumDescriptions": [
-            "Aspect is not applicable in the analyzed language or is not predicted.",
-            "Perfective",
-            "Imperfective",
-            "Progressive"
-          ],
-          "type": "string"
-        },
-        "gender": {
-          "description": "The grammatical gender.",
-          "enum": [
-            "GENDER_UNKNOWN",
-            "FEMININE",
-            "MASCULINE",
-            "NEUTER"
-          ],
-          "enumDescriptions": [
-            "Gender is not applicable in the analyzed language or is not predicted.",
-            "Feminine",
-            "Masculine",
-            "Neuter"
-          ],
-          "type": "string"
-        },
-        "person": {
-          "description": "The grammatical person.",
-          "enum": [
-            "PERSON_UNKNOWN",
-            "FIRST",
-            "SECOND",
-            "THIRD",
-            "REFLEXIVE_PERSON"
-          ],
-          "enumDescriptions": [
-            "Person is not applicable in the analyzed language or is not predicted.",
-            "First",
-            "Second",
-            "Third",
-            "Reflexive"
-          ],
-          "type": "string"
-        },
-        "case": {
-          "description": "The grammatical case.",
-          "enum": [
-            "CASE_UNKNOWN",
-            "ACCUSATIVE",
-            "ADVERBIAL",
-            "COMPLEMENTIVE",
-            "DATIVE",
-            "GENITIVE",
-            "INSTRUMENTAL",
-            "LOCATIVE",
-            "NOMINATIVE",
-            "OBLIQUE",
-            "PARTITIVE",
-            "PREPOSITIONAL",
-            "REFLEXIVE_CASE",
-            "RELATIVE_CASE",
-            "VOCATIVE"
-          ],
-          "enumDescriptions": [
-            "Case is not applicable in the analyzed language or is not predicted.",
-            "Accusative",
-            "Adverbial",
-            "Complementive",
-            "Dative",
-            "Genitive",
-            "Instrumental",
-            "Locative",
-            "Nominative",
-            "Oblique",
-            "Partitive",
-            "Prepositional",
-            "Reflexive",
-            "Relative",
-            "Vocative"
-          ],
-          "type": "string"
-        },
-        "form": {
-          "description": "The grammatical form.",
-          "enum": [
-            "FORM_UNKNOWN",
-            "ADNOMIAL",
-            "AUXILIARY",
-            "COMPLEMENTIZER",
-            "FINAL_ENDING",
-            "GERUND",
-            "REALIS",
-            "IRREALIS",
-            "SHORT",
-            "LONG",
-            "ORDER",
-            "SPECIFIC"
-          ],
-          "enumDescriptions": [
-            "Form is not applicable in the analyzed language or is not predicted.",
-            "Adnomial",
-            "Auxiliary",
-            "Complementizer",
-            "Final ending",
-            "Gerund",
-            "Realis",
-            "Irrealis",
-            "Short form",
-            "Long form",
-            "Order form",
-            "Specific form"
-          ],
-          "type": "string"
-        },
-        "tense": {
-          "description": "The grammatical tense.",
-          "enum": [
-            "TENSE_UNKNOWN",
-            "CONDITIONAL_TENSE",
-            "FUTURE",
-            "PAST",
-            "PRESENT",
-            "IMPERFECT",
-            "PLUPERFECT"
-          ],
-          "enumDescriptions": [
-            "Tense is not applicable in the analyzed language or is not predicted.",
-            "Conditional",
-            "Future",
-            "Past",
-            "Present",
-            "Imperfect",
-            "Pluperfect"
-          ],
-          "type": "string"
-        },
-        "proper": {
-          "description": "The grammatical properness.",
-          "enum": [
-            "PROPER_UNKNOWN",
-            "PROPER",
-            "NOT_PROPER"
-          ],
-          "enumDescriptions": [
-            "Proper is not applicable in the analyzed language or is not predicted.",
-            "Proper",
-            "Not proper"
-          ],
-          "type": "string"
-        },
-        "mood": {
-          "description": "The grammatical mood.",
-          "enum": [
-            "MOOD_UNKNOWN",
-            "CONDITIONAL_MOOD",
-            "IMPERATIVE",
-            "INDICATIVE",
-            "INTERROGATIVE",
-            "JUSSIVE",
-            "SUBJUNCTIVE"
-          ],
-          "enumDescriptions": [
-            "Mood is not applicable in the analyzed language or is not predicted.",
-            "Conditional",
-            "Imperative",
-            "Indicative",
-            "Interrogative",
-            "Jussive",
-            "Subjunctive"
-          ],
-          "type": "string"
-        },
-        "tag": {
-          "description": "The part of speech tag.",
-          "enum": [
-            "UNKNOWN",
-            "ADJ",
-            "ADP",
-            "ADV",
-            "CONJ",
-            "DET",
-            "NOUN",
-            "NUM",
-            "PRON",
-            "PRT",
-            "PUNCT",
-            "VERB",
-            "X",
-            "AFFIX"
-          ],
-          "enumDescriptions": [
-            "Unknown",
-            "Adjective",
-            "Adposition (preposition and postposition)",
-            "Adverb",
-            "Conjunction",
-            "Determiner",
-            "Noun (common and proper)",
-            "Cardinal number",
-            "Pronoun",
-            "Particle or other function word",
-            "Punctuation",
-            "Verb (all tenses and modes)",
-            "Other: foreign words, typos, abbreviations",
-            "Affix"
-          ],
-          "type": "string"
-        },
-        "number": {
-          "description": "The grammatical number.",
-          "enum": [
-            "NUMBER_UNKNOWN",
-            "SINGULAR",
-            "PLURAL",
-            "DUAL"
-          ],
-          "enumDescriptions": [
-            "Number is not applicable in the analyzed language or is not predicted.",
-            "Singular",
-            "Plural",
-            "Dual"
-          ],
-          "type": "string"
-        },
-        "reciprocity": {
-          "description": "The grammatical reciprocity.",
-          "enum": [
-            "RECIPROCITY_UNKNOWN",
-            "RECIPROCAL",
-            "NON_RECIPROCAL"
-          ],
-          "enumDescriptions": [
-            "Reciprocity is not applicable in the analyzed language or is not\npredicted.",
-            "Reciprocal",
-            "Non-reciprocal"
-          ],
-          "type": "string"
-        },
-        "voice": {
-          "description": "The grammatical voice.",
-          "enum": [
-            "VOICE_UNKNOWN",
-            "ACTIVE",
-            "CAUSATIVE",
-            "PASSIVE"
-          ],
-          "enumDescriptions": [
-            "Voice is not applicable in the analyzed language or is not predicted.",
-            "Active",
-            "Causative",
-            "Passive"
-          ],
-          "type": "string"
-        }
-      },
-      "id": "PartOfSpeech"
-    },
-    "AnnotateTextResponse": {
-      "description": "The text annotations response message.",
-      "type": "object",
-      "properties": {
-        "entities": {
-          "description": "Entities, along with their semantic information, in the input document.\nPopulated if the user enables\nAnnotateTextRequest.Features.extract_entities.",
-          "type": "array",
-          "items": {
-            "$ref": "Entity"
-          }
-        },
-        "documentSentiment": {
-          "description": "The overall sentiment for the document. Populated if the user enables\nAnnotateTextRequest.Features.extract_document_sentiment.",
-          "$ref": "Sentiment"
-        },
         "language": {
-          "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee `Document.language` field for more details.",
-          "type": "string"
-        },
-        "tokens": {
-          "description": "Tokens, along with their syntactic information, in the input document.\nPopulated if the user enables\nAnnotateTextRequest.Features.extract_syntax.",
-          "type": "array",
-          "items": {
-            "$ref": "Token"
-          }
-        },
-        "sentences": {
-          "description": "Sentences in the input document. Populated if the user enables\nAnnotateTextRequest.Features.extract_syntax.",
-          "type": "array",
-          "items": {
-            "$ref": "Sentence"
-          }
-        }
-      },
-      "id": "AnnotateTextResponse"
-    },
-    "Entity": {
-      "description": "Represents a phrase in the text that is a known entity, such as\na person, an organization, or location. The API associates information, such\nas salience and mentions, with entities.",
-      "type": "object",
-      "properties": {
-        "metadata": {
-          "description": "Metadata associated with the entity.\n\nCurrently, Wikipedia URLs and Knowledge Graph MIDs are provided, if\navailable. The associated keys are \"wikipedia_url\" and \"mid\", respectively.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "salience": {
-          "description": "The salience score associated with the entity in the [0, 1.0] range.\n\nThe salience score for an entity provides information about the\nimportance or centrality of that entity to the entire document text.\nScores closer to 0 are less salient, while scores closer to 1.0 are highly\nsalient.",
-          "type": "number",
-          "format": "float"
+          "type": "string",
+          "description": "The language of the document (if not specified, the language is\nautomatically detected). Both ISO and BCP-47 language codes are\naccepted.\u003cbr\u003e\n**Current Language Restrictions:**\n\n * Only English, Spanish, and Japanese textual content are supported.\nIf the language (either specified by the caller or automatically detected)\nis not supported by the called API method, an `INVALID_ARGUMENT` error\nis returned."
         },
         "type": {
-          "description": "The entity type.",
-          "enum": [
-            "UNKNOWN",
-            "PERSON",
-            "LOCATION",
-            "ORGANIZATION",
-            "EVENT",
-            "WORK_OF_ART",
-            "CONSUMER_GOOD",
-            "OTHER"
-          ],
           "enumDescriptions": [
-            "Unknown",
-            "Person",
-            "Location",
-            "Organization",
-            "Event",
-            "Work of art",
-            "Consumer goods",
-            "Other types"
+            "The content type is not specified.",
+            "Plain text",
+            "HTML"
           ],
+          "enum": [
+            "TYPE_UNSPECIFIED",
+            "PLAIN_TEXT",
+            "HTML"
+          ],
+          "description": "Required. If the type is not set or is `TYPE_UNSPECIFIED`,\nreturns an `INVALID_ARGUMENT` error.",
           "type": "string"
         },
-        "mentions": {
-          "description": "The mentions of this entity in the input document. The API currently\nsupports proper noun mentions.",
-          "type": "array",
-          "items": {
-            "$ref": "EntityMention"
-          }
-        },
-        "name": {
-          "description": "The representative name for the entity.",
+        "content": {
+          "description": "The content of the input in string format.",
           "type": "string"
+        },
+        "gcsContentUri": {
+          "type": "string",
+          "description": "The Google Cloud Storage URI where the file content is located.\nThis URI must be of the form: gs://bucket_name/object_name. For more\ndetails, see https://cloud.google.com/storage/docs/reference-uris.\nNOTE: Cloud Storage object versioning is not supported."
         }
       },
-      "id": "Entity"
+      "id": "Document",
+      "description": "################################################################ #\n\nRepresents the input to API methods."
+    },
+    "Sentence": {
+      "properties": {
+        "text": {
+          "$ref": "TextSpan",
+          "description": "The sentence text."
+        },
+        "sentiment": {
+          "description": "For calls to AnalyzeSentiment or if\nAnnotateTextRequest.Features.extract_document_sentiment is set to\ntrue, this field will contain the sentiment for the sentence.",
+          "$ref": "Sentiment"
+        }
+      },
+      "id": "Sentence",
+      "description": "Represents a sentence in the input document.",
+      "type": "object"
+    },
+    "AnalyzeEntitiesRequest": {
+      "description": "The entity analysis request message.",
+      "type": "object",
+      "properties": {
+        "encodingType": {
+          "enum": [
+            "NONE",
+            "UTF8",
+            "UTF16",
+            "UTF32"
+          ],
+          "description": "The encoding type used by the API to calculate offsets.",
+          "type": "string",
+          "enumDescriptions": [
+            "If `EncodingType` is not specified, encoding-dependent information (such as\n`begin_offset`) will be set at `-1`.",
+            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-8 encoding of the input. C++ and Go are examples of languages\nthat use this encoding natively.",
+            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-16 encoding of the input. Java and Javascript are examples of\nlanguages that use this encoding natively.",
+            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-32 encoding of the input. Python is an example of a language\nthat uses this encoding natively."
+          ]
+        },
+        "document": {
+          "$ref": "Document",
+          "description": "Input document."
+        }
+      },
+      "id": "AnalyzeEntitiesRequest"
     },
     "Sentiment": {
-      "description": "Represents the feeling associated with the entire text or entities in\nthe text.",
       "type": "object",
       "properties": {
         "score": {
           "description": "Sentiment score between -1.0 (negative sentiment) and 1.0\n(positive sentiment).",
-          "type": "number",
-          "format": "float"
+          "format": "float",
+          "type": "number"
         },
         "magnitude": {
           "description": "A non-negative number in the [0, +inf) range, which represents\nthe absolute magnitude of sentiment regardless of score (positive or\nnegative).",
-          "type": "number",
-          "format": "float"
+          "format": "float",
+          "type": "number"
         }
       },
-      "id": "Sentiment"
-    },
-    "Token": {
-      "description": "Represents the smallest syntactic building block of the text.",
-      "type": "object",
-      "properties": {
-        "text": {
-          "description": "The token text.",
-          "$ref": "TextSpan"
-        },
-        "partOfSpeech": {
-          "description": "Parts of speech tag for this token.",
-          "$ref": "PartOfSpeech"
-        },
-        "dependencyEdge": {
-          "description": "Dependency tree parse for this token.",
-          "$ref": "DependencyEdge"
-        },
-        "lemma": {
-          "description": "[Lemma](https://en.wikipedia.org/wiki/Lemma_%28morphology%29) of the token.",
-          "type": "string"
-        }
-      },
-      "id": "Token"
-    },
-    "AnalyzeEntitiesResponse": {
-      "description": "The entity analysis response message.",
-      "type": "object",
-      "properties": {
-        "entities": {
-          "description": "The recognized entities in the input document.",
-          "type": "array",
-          "items": {
-            "$ref": "Entity"
-          }
-        },
-        "language": {
-          "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee `Document.language` field for more details.",
-          "type": "string"
-        }
-      },
-      "id": "AnalyzeEntitiesResponse"
+      "id": "Sentiment",
+      "description": "Represents the feeling associated with the entire text or entities in\nthe text."
     }
   },
-  "revision": "20170103",
-  "basePath": "",
+  "protocol": "rest",
   "icons": {
     "x32": "http://www.google.com/images/icons/product/search-32.gif",
     "x16": "http://www.google.com/images/icons/product/search-16.gif"
   },
-  "version_module": "True",
   "canonicalName": "Cloud Natural Language",
-  "discoveryVersion": "v1",
-  "baseUrl": "https://language.googleapis.com/",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
+    }
+  },
+  "rootUrl": "https://language.googleapis.com/",
+  "ownerDomain": "google.com",
   "name": "language",
+  "batchPath": "batch",
+  "title": "Google Cloud Natural Language API",
+  "ownerName": "Google",
+  "resources": {
+    "documents": {
+      "methods": {
+        "analyzeSyntax": {
+          "flatPath": "v1/documents:analyzeSyntax",
+          "id": "language.documents.analyzeSyntax",
+          "path": "v1/documents:analyzeSyntax",
+          "request": {
+            "$ref": "AnalyzeSyntaxRequest"
+          },
+          "description": "Analyzes the syntax of the text and provides sentence boundaries and\ntokenization along with part of speech tags, dependency trees, and other\nproperties.",
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "AnalyzeSyntaxResponse"
+          },
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ]
+        },
+        "analyzeSentiment": {
+          "flatPath": "v1/documents:analyzeSentiment",
+          "id": "language.documents.analyzeSentiment",
+          "path": "v1/documents:analyzeSentiment",
+          "request": {
+            "$ref": "AnalyzeSentimentRequest"
+          },
+          "description": "Analyzes the sentiment of the provided text.",
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "AnalyzeSentimentResponse"
+          },
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ]
+        },
+        "annotateText": {
+          "request": {
+            "$ref": "AnnotateTextRequest"
+          },
+          "description": "A convenience method that provides all the features that analyzeSentiment,\nanalyzeEntities, and analyzeSyntax provide in one call.",
+          "response": {
+            "$ref": "AnnotateTextResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "flatPath": "v1/documents:annotateText",
+          "path": "v1/documents:annotateText",
+          "id": "language.documents.annotateText"
+        },
+        "analyzeEntities": {
+          "request": {
+            "$ref": "AnalyzeEntitiesRequest"
+          },
+          "description": "Finds named entities (currently finds proper names) in the text,\nentity types, salience, mentions for each entity, and other properties.",
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "AnalyzeEntitiesResponse"
+          },
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "flatPath": "v1/documents:analyzeEntities",
+          "id": "language.documents.analyzeEntities",
+          "path": "v1/documents:analyzeEntities"
+        }
+      }
+    }
+  },
   "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    },
+    "bearer_token": {
+      "location": "query",
+      "description": "OAuth bearer token.",
+      "type": "string"
+    },
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
       "type": "string",
       "location": "query"
     },
     "prettyPrint": {
+      "location": "query",
       "description": "Returns response with indentations and line breaks.",
-      "default": "true",
       "type": "boolean",
-      "location": "query"
+      "default": "true"
     },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
       "type": "string",
       "location": "query"
     },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "callback": {
+      "type": "string",
+      "location": "query",
+      "description": "JSONP"
+    },
+    "alt": {
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
     "quotaUser": {
       "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
       "type": "string",
       "location": "query"
     },
     "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
       "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
+      "default": "true",
       "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
+      "description": "Pretty-print response."
     }
   },
-  "documentationLink": "https://cloud.google.com/natural-language/",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
-  "servicePath": "",
-  "ownerName": "Google",
   "version": "v1",
-  "rootUrl": "https://language.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "baseUrl": "https://language.googleapis.com/",
+  "kind": "discovery#restDescription",
+  "description": "Google Cloud Natural Language API provides natural language understanding technologies to developers. Examples include sentiment analysis, entity recognition, and text annotations.",
+  "servicePath": ""
 }
diff --git a/language/v1/language-gen.go b/language/v1/language-gen.go
index ad601b0..1492f94 100644
--- a/language/v1/language-gen.go
+++ b/language/v1/language-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Documents *DocumentsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewDocumentsService(s *Service) *DocumentsService {
 	rs := &DocumentsService{s: s}
 	return rs
@@ -1351,6 +1356,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.analyzeentitiesrequest)
 	if err != nil {
@@ -1471,6 +1477,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.analyzesentimentrequest)
 	if err != nil {
@@ -1595,6 +1602,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.analyzesyntaxrequest)
 	if err != nil {
@@ -1717,6 +1725,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.annotatetextrequest)
 	if err != nil {
diff --git a/language/v1beta1/language-api.json b/language/v1beta1/language-api.json
index 8a28475..d110587 100644
--- a/language/v1beta1/language-api.json
+++ b/language/v1beta1/language-api.json
@@ -1,153 +1,200 @@
 {
-  "id": "language:v1beta1",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        }
-      }
-    }
-  },
-  "description": "Google Cloud Natural Language API provides natural language understanding technologies to developers. Examples include sentiment analysis, entity recognition, and text annotations.",
-  "protocol": "rest",
+  "rootUrl": "https://language.googleapis.com/",
+  "ownerDomain": "google.com",
+  "name": "language",
+  "batchPath": "batch",
   "title": "Google Cloud Natural Language API",
+  "ownerName": "Google",
   "resources": {
     "documents": {
       "methods": {
-        "analyzeSentiment": {
-          "id": "language.documents.analyzeSentiment",
-          "response": {
-            "$ref": "AnalyzeSentimentResponse"
-          },
-          "parameterOrder": [],
-          "description": "Analyzes the sentiment of the provided text.",
-          "request": {
-            "$ref": "AnalyzeSentimentRequest"
-          },
-          "flatPath": "v1beta1/documents:analyzeSentiment",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1beta1/documents:analyzeSentiment",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "analyzeSyntax": {
-          "id": "language.documents.analyzeSyntax",
-          "response": {
-            "$ref": "AnalyzeSyntaxResponse"
-          },
-          "parameterOrder": [],
-          "description": "Analyzes the syntax of the text and provides sentence boundaries and\ntokenization along with part of speech tags, dependency trees, and other\nproperties.",
-          "request": {
-            "$ref": "AnalyzeSyntaxRequest"
-          },
-          "flatPath": "v1beta1/documents:analyzeSyntax",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1beta1/documents:analyzeSyntax",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
-        "annotateText": {
-          "id": "language.documents.annotateText",
-          "response": {
-            "$ref": "AnnotateTextResponse"
-          },
-          "parameterOrder": [],
-          "description": "A convenience method that provides all the features that analyzeSentiment,\nanalyzeEntities, and analyzeSyntax provide in one call.",
-          "request": {
-            "$ref": "AnnotateTextRequest"
-          },
-          "flatPath": "v1beta1/documents:annotateText",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1beta1/documents:annotateText",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ]
-        },
         "analyzeEntities": {
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "flatPath": "v1beta1/documents:analyzeEntities",
+          "path": "v1beta1/documents:analyzeEntities",
           "id": "language.documents.analyzeEntities",
+          "request": {
+            "$ref": "AnalyzeEntitiesRequest"
+          },
+          "description": "Finds named entities (currently finds proper names) in the text,\nentity types, salience, mentions for each entity, and other properties.",
           "response": {
             "$ref": "AnalyzeEntitiesResponse"
           },
           "parameterOrder": [],
-          "description": "Finds named entities (currently finds proper names) in the text,\nentity types, salience, mentions for each entity, and other properties.",
+          "httpMethod": "POST"
+        },
+        "analyzeSyntax": {
+          "description": "Analyzes the syntax of the text and provides sentence boundaries and\ntokenization along with part of speech tags, dependency trees, and other\nproperties.",
           "request": {
-            "$ref": "AnalyzeEntitiesRequest"
+            "$ref": "AnalyzeSyntaxRequest"
           },
-          "flatPath": "v1beta1/documents:analyzeEntities",
+          "response": {
+            "$ref": "AnalyzeSyntaxResponse"
+          },
+          "parameterOrder": [],
           "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1beta1/documents:analyzeEntities",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform"
-          ]
+          ],
+          "parameters": {},
+          "flatPath": "v1beta1/documents:analyzeSyntax",
+          "path": "v1beta1/documents:analyzeSyntax",
+          "id": "language.documents.analyzeSyntax"
+        },
+        "analyzeSentiment": {
+          "path": "v1beta1/documents:analyzeSentiment",
+          "id": "language.documents.analyzeSentiment",
+          "description": "Analyzes the sentiment of the provided text.",
+          "request": {
+            "$ref": "AnalyzeSentimentRequest"
+          },
+          "response": {
+            "$ref": "AnalyzeSentimentResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {},
+          "flatPath": "v1beta1/documents:analyzeSentiment"
+        },
+        "annotateText": {
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {},
+          "flatPath": "v1beta1/documents:annotateText",
+          "path": "v1beta1/documents:annotateText",
+          "id": "language.documents.annotateText",
+          "description": "A convenience method that provides all the features that analyzeSentiment,\nanalyzeEntities, and analyzeSyntax provide in one call.",
+          "request": {
+            "$ref": "AnnotateTextRequest"
+          },
+          "response": {
+            "$ref": "AnnotateTextResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST"
         }
       }
     }
   },
+  "parameters": {
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ]
+    },
+    "alt": {
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ]
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "access_token": {
+      "description": "OAuth access token.",
+      "type": "string",
+      "location": "query"
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
+    },
+    "oauth_token": {
+      "type": "string",
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user."
+    }
+  },
+  "version": "v1beta1",
+  "baseUrl": "https://language.googleapis.com/",
+  "servicePath": "",
+  "description": "Google Cloud Natural Language API provides natural language understanding technologies to developers. Examples include sentiment analysis, entity recognition, and text annotations.",
+  "kind": "discovery#restDescription",
+  "basePath": "",
+  "revision": "20170206",
+  "id": "language:v1beta1",
+  "documentationLink": "https://cloud.google.com/natural-language/",
+  "discoveryVersion": "v1",
+  "version_module": "True",
   "schemas": {
-    "Document": {
-      "description": "################################################################ #\n\nRepresents the input to API methods.",
-      "type": "object",
-      "properties": {
-        "language": {
-          "description": "The language of the document (if not specified, the language is\nautomatically detected). Both ISO and BCP-47 language codes are\naccepted.\u003cbr\u003e\n**Current Language Restrictions:**\n\n * Only English, Spanish, and Japanese textual content are supported.\nIf the language (either specified by the caller or automatically detected)\nis not supported by the called API method, an `INVALID_ARGUMENT` error\nis returned.",
-          "type": "string"
-        },
-        "gcsContentUri": {
-          "description": "The Google Cloud Storage URI where the file content is located.\nThis URI must be of the form: gs://bucket_name/object_name. For more\ndetails, see https://cloud.google.com/storage/docs/reference-uris.\nNOTE: Cloud Storage object versioning is not supported.",
-          "type": "string"
-        },
-        "type": {
-          "description": "Required. If the type is not set or is `TYPE_UNSPECIFIED`,\nreturns an `INVALID_ARGUMENT` error.",
-          "enum": [
-            "TYPE_UNSPECIFIED",
-            "PLAIN_TEXT",
-            "HTML"
-          ],
-          "enumDescriptions": [
-            "The content type is not specified.",
-            "Plain text",
-            "HTML"
-          ],
-          "type": "string"
-        },
-        "content": {
-          "description": "The content of the input in string format.",
-          "type": "string"
-        }
-      },
-      "id": "Document"
-    },
-    "TextSpan": {
-      "description": "Represents an output piece of text.",
-      "type": "object",
-      "properties": {
-        "beginOffset": {
-          "description": "The API calculates the beginning offset of the content in the original\ndocument according to the EncodingType specified in the API request.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "content": {
-          "description": "The content of the output text.",
-          "type": "string"
-        }
-      },
-      "id": "TextSpan"
-    },
     "Status": {
       "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
       "type": "object",
       "properties": {
         "code": {
           "description": "The status code, which should be an enum value of google.rpc.Code.",
-          "type": "integer",
-          "format": "int32"
+          "format": "int32",
+          "type": "integer"
+        },
+        "message": {
+          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
+          "type": "string"
         },
         "details": {
           "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
@@ -159,101 +206,449 @@
             },
             "type": "object"
           }
-        },
-        "message": {
-          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
-          "type": "string"
         }
       },
       "id": "Status"
     },
-    "AnalyzeEntitiesRequest": {
-      "description": "The entity analysis request message.",
-      "type": "object",
+    "Features": {
       "properties": {
-        "document": {
-          "description": "Input document.",
-          "$ref": "Document"
+        "extractEntities": {
+          "description": "Extract entities.",
+          "type": "boolean"
         },
-        "encodingType": {
-          "description": "The encoding type used by the API to calculate offsets.",
-          "enum": [
-            "NONE",
-            "UTF8",
-            "UTF16",
-            "UTF32"
-          ],
-          "enumDescriptions": [
-            "If `EncodingType` is not specified, encoding-dependent information (such as\n`begin_offset`) will be set at `-1`.",
-            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-8 encoding of the input. C++ and Go are examples of languages\nthat use this encoding natively.",
-            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-16 encoding of the input. Java and Javascript are examples of\nlanguages that use this encoding natively.",
-            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-32 encoding of the input. Python is an example of a language\nthat uses this encoding natively."
-          ],
-          "type": "string"
+        "extractSyntax": {
+          "description": "Extract syntax information.",
+          "type": "boolean"
+        },
+        "extractDocumentSentiment": {
+          "description": "Extract document-level sentiment.",
+          "type": "boolean"
         }
       },
-      "id": "AnalyzeEntitiesRequest"
+      "id": "Features",
+      "description": "All available features for sentiment, syntax, and semantic analysis.\nSetting each one to true will enable that specific analysis for the input.",
+      "type": "object"
     },
     "EntityMention": {
-      "description": "Represents a mention for an entity in the text. Currently, proper noun\nmentions are supported.",
-      "type": "object",
       "properties": {
         "text": {
-          "description": "The mention text.",
-          "$ref": "TextSpan"
+          "$ref": "TextSpan",
+          "description": "The mention text."
         },
         "type": {
-          "description": "The type of the entity mention.",
-          "enum": [
-            "TYPE_UNKNOWN",
-            "PROPER",
-            "COMMON"
-          ],
           "enumDescriptions": [
             "Unknown",
             "Proper name",
             "Common noun (or noun compound)"
           ],
+          "enum": [
+            "TYPE_UNKNOWN",
+            "PROPER",
+            "COMMON"
+          ],
+          "description": "The type of the entity mention.",
           "type": "string"
         }
       },
-      "id": "EntityMention"
+      "id": "EntityMention",
+      "description": "Represents a mention for an entity in the text. Currently, proper noun\nmentions are supported.",
+      "type": "object"
     },
-    "AnalyzeSentimentRequest": {
-      "description": "The sentiment analysis request message.",
+    "Sentence": {
+      "properties": {
+        "text": {
+          "$ref": "TextSpan",
+          "description": "The sentence text."
+        },
+        "sentiment": {
+          "description": "For calls to AnalyzeSentiment or if\nAnnotateTextRequest.Features.extract_document_sentiment is set to\ntrue, this field will contain the sentiment for the sentence.",
+          "$ref": "Sentiment"
+        }
+      },
+      "id": "Sentence",
+      "description": "Represents a sentence in the input document.",
+      "type": "object"
+    },
+    "Document": {
+      "description": "################################################################ #\n\nRepresents the input to API methods.",
+      "type": "object",
+      "properties": {
+        "gcsContentUri": {
+          "type": "string",
+          "description": "The Google Cloud Storage URI where the file content is located.\nThis URI must be of the form: gs://bucket_name/object_name. For more\ndetails, see https://cloud.google.com/storage/docs/reference-uris.\nNOTE: Cloud Storage object versioning is not supported."
+        },
+        "language": {
+          "description": "The language of the document (if not specified, the language is\nautomatically detected). Both ISO and BCP-47 language codes are\naccepted.\u003cbr\u003e\n**Current Language Restrictions:**\n\n * Only English, Spanish, and Japanese textual content are supported.\nIf the language (either specified by the caller or automatically detected)\nis not supported by the called API method, an `INVALID_ARGUMENT` error\nis returned.",
+          "type": "string"
+        },
+        "type": {
+          "description": "Required. If the type is not set or is `TYPE_UNSPECIFIED`,\nreturns an `INVALID_ARGUMENT` error.",
+          "type": "string",
+          "enumDescriptions": [
+            "The content type is not specified.",
+            "Plain text",
+            "HTML"
+          ],
+          "enum": [
+            "TYPE_UNSPECIFIED",
+            "PLAIN_TEXT",
+            "HTML"
+          ]
+        },
+        "content": {
+          "description": "The content of the input in string format.",
+          "type": "string"
+        }
+      },
+      "id": "Document"
+    },
+    "AnalyzeEntitiesRequest": {
+      "id": "AnalyzeEntitiesRequest",
+      "description": "The entity analysis request message.",
       "type": "object",
       "properties": {
         "document": {
-          "description": "Input document. Currently, `analyzeSentiment` only supports English text\n(Document.language=\"EN\").",
-          "$ref": "Document"
+          "$ref": "Document",
+          "description": "Input document."
         },
         "encodingType": {
-          "description": "The encoding type used by the API to calculate sentence offsets for the\nsentence sentiment.",
-          "enum": [
-            "NONE",
-            "UTF8",
-            "UTF16",
-            "UTF32"
-          ],
           "enumDescriptions": [
             "If `EncodingType` is not specified, encoding-dependent information (such as\n`begin_offset`) will be set at `-1`.",
             "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-8 encoding of the input. C++ and Go are examples of languages\nthat use this encoding natively.",
             "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-16 encoding of the input. Java and Javascript are examples of\nlanguages that use this encoding natively.",
             "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-32 encoding of the input. Python is an example of a language\nthat uses this encoding natively."
           ],
+          "enum": [
+            "NONE",
+            "UTF8",
+            "UTF16",
+            "UTF32"
+          ],
+          "description": "The encoding type used by the API to calculate offsets.",
           "type": "string"
         }
+      }
+    },
+    "Sentiment": {
+      "description": "Represents the feeling associated with the entire text or entities in\nthe text.",
+      "type": "object",
+      "properties": {
+        "polarity": {
+          "description": "DEPRECATED FIELD - This field is being deprecated in\nfavor of score. Please refer to our documentation at\nhttps://cloud.google.com/natural-language/docs for more information.",
+          "format": "float",
+          "type": "number"
+        },
+        "score": {
+          "description": "Sentiment score between -1.0 (negative sentiment) and 1.0\n(positive sentiment).",
+          "format": "float",
+          "type": "number"
+        },
+        "magnitude": {
+          "type": "number",
+          "description": "A non-negative number in the [0, +inf) range, which represents\nthe absolute magnitude of sentiment regardless of score (positive or\nnegative).",
+          "format": "float"
+        }
       },
-      "id": "AnalyzeSentimentRequest"
+      "id": "Sentiment"
+    },
+    "PartOfSpeech": {
+      "id": "PartOfSpeech",
+      "description": "Represents part of speech information for a token.",
+      "type": "object",
+      "properties": {
+        "case": {
+          "enum": [
+            "CASE_UNKNOWN",
+            "ACCUSATIVE",
+            "ADVERBIAL",
+            "COMPLEMENTIVE",
+            "DATIVE",
+            "GENITIVE",
+            "INSTRUMENTAL",
+            "LOCATIVE",
+            "NOMINATIVE",
+            "OBLIQUE",
+            "PARTITIVE",
+            "PREPOSITIONAL",
+            "REFLEXIVE_CASE",
+            "RELATIVE_CASE",
+            "VOCATIVE"
+          ],
+          "description": "The grammatical case.",
+          "type": "string",
+          "enumDescriptions": [
+            "Case is not applicable in the analyzed language or is not predicted.",
+            "Accusative",
+            "Adverbial",
+            "Complementive",
+            "Dative",
+            "Genitive",
+            "Instrumental",
+            "Locative",
+            "Nominative",
+            "Oblique",
+            "Partitive",
+            "Prepositional",
+            "Reflexive",
+            "Relative",
+            "Vocative"
+          ]
+        },
+        "tense": {
+          "enum": [
+            "TENSE_UNKNOWN",
+            "CONDITIONAL_TENSE",
+            "FUTURE",
+            "PAST",
+            "PRESENT",
+            "IMPERFECT",
+            "PLUPERFECT"
+          ],
+          "description": "The grammatical tense.",
+          "type": "string",
+          "enumDescriptions": [
+            "Tense is not applicable in the analyzed language or is not predicted.",
+            "Conditional",
+            "Future",
+            "Past",
+            "Present",
+            "Imperfect",
+            "Pluperfect"
+          ]
+        },
+        "reciprocity": {
+          "description": "The grammatical reciprocity.",
+          "type": "string",
+          "enumDescriptions": [
+            "Reciprocity is not applicable in the analyzed language or is not\npredicted.",
+            "Reciprocal",
+            "Non-reciprocal"
+          ],
+          "enum": [
+            "RECIPROCITY_UNKNOWN",
+            "RECIPROCAL",
+            "NON_RECIPROCAL"
+          ]
+        },
+        "form": {
+          "enum": [
+            "FORM_UNKNOWN",
+            "ADNOMIAL",
+            "AUXILIARY",
+            "COMPLEMENTIZER",
+            "FINAL_ENDING",
+            "GERUND",
+            "REALIS",
+            "IRREALIS",
+            "SHORT",
+            "LONG",
+            "ORDER",
+            "SPECIFIC"
+          ],
+          "description": "The grammatical form.",
+          "type": "string",
+          "enumDescriptions": [
+            "Form is not applicable in the analyzed language or is not predicted.",
+            "Adnomial",
+            "Auxiliary",
+            "Complementizer",
+            "Final ending",
+            "Gerund",
+            "Realis",
+            "Irrealis",
+            "Short form",
+            "Long form",
+            "Order form",
+            "Specific form"
+          ]
+        },
+        "number": {
+          "enumDescriptions": [
+            "Number is not applicable in the analyzed language or is not predicted.",
+            "Singular",
+            "Plural",
+            "Dual"
+          ],
+          "enum": [
+            "NUMBER_UNKNOWN",
+            "SINGULAR",
+            "PLURAL",
+            "DUAL"
+          ],
+          "description": "The grammatical number.",
+          "type": "string"
+        },
+        "voice": {
+          "enum": [
+            "VOICE_UNKNOWN",
+            "ACTIVE",
+            "CAUSATIVE",
+            "PASSIVE"
+          ],
+          "description": "The grammatical voice.",
+          "type": "string",
+          "enumDescriptions": [
+            "Voice is not applicable in the analyzed language or is not predicted.",
+            "Active",
+            "Causative",
+            "Passive"
+          ]
+        },
+        "aspect": {
+          "enumDescriptions": [
+            "Aspect is not applicable in the analyzed language or is not predicted.",
+            "Perfective",
+            "Imperfective",
+            "Progressive"
+          ],
+          "enum": [
+            "ASPECT_UNKNOWN",
+            "PERFECTIVE",
+            "IMPERFECTIVE",
+            "PROGRESSIVE"
+          ],
+          "description": "The grammatical aspect.",
+          "type": "string"
+        },
+        "mood": {
+          "enumDescriptions": [
+            "Mood is not applicable in the analyzed language or is not predicted.",
+            "Conditional",
+            "Imperative",
+            "Indicative",
+            "Interrogative",
+            "Jussive",
+            "Subjunctive"
+          ],
+          "enum": [
+            "MOOD_UNKNOWN",
+            "CONDITIONAL_MOOD",
+            "IMPERATIVE",
+            "INDICATIVE",
+            "INTERROGATIVE",
+            "JUSSIVE",
+            "SUBJUNCTIVE"
+          ],
+          "description": "The grammatical mood.",
+          "type": "string"
+        },
+        "tag": {
+          "enumDescriptions": [
+            "Unknown",
+            "Adjective",
+            "Adposition (preposition and postposition)",
+            "Adverb",
+            "Conjunction",
+            "Determiner",
+            "Noun (common and proper)",
+            "Cardinal number",
+            "Pronoun",
+            "Particle or other function word",
+            "Punctuation",
+            "Verb (all tenses and modes)",
+            "Other: foreign words, typos, abbreviations",
+            "Affix"
+          ],
+          "enum": [
+            "UNKNOWN",
+            "ADJ",
+            "ADP",
+            "ADV",
+            "CONJ",
+            "DET",
+            "NOUN",
+            "NUM",
+            "PRON",
+            "PRT",
+            "PUNCT",
+            "VERB",
+            "X",
+            "AFFIX"
+          ],
+          "description": "The part of speech tag.",
+          "type": "string"
+        },
+        "gender": {
+          "enum": [
+            "GENDER_UNKNOWN",
+            "FEMININE",
+            "MASCULINE",
+            "NEUTER"
+          ],
+          "description": "The grammatical gender.",
+          "type": "string",
+          "enumDescriptions": [
+            "Gender is not applicable in the analyzed language or is not predicted.",
+            "Feminine",
+            "Masculine",
+            "Neuter"
+          ]
+        },
+        "person": {
+          "enum": [
+            "PERSON_UNKNOWN",
+            "FIRST",
+            "SECOND",
+            "THIRD",
+            "REFLEXIVE_PERSON"
+          ],
+          "description": "The grammatical person.",
+          "type": "string",
+          "enumDescriptions": [
+            "Person is not applicable in the analyzed language or is not predicted.",
+            "First",
+            "Second",
+            "Third",
+            "Reflexive"
+          ]
+        },
+        "proper": {
+          "enumDescriptions": [
+            "Proper is not applicable in the analyzed language or is not predicted.",
+            "Proper",
+            "Not proper"
+          ],
+          "enum": [
+            "PROPER_UNKNOWN",
+            "PROPER",
+            "NOT_PROPER"
+          ],
+          "description": "The grammatical properness.",
+          "type": "string"
+        }
+      }
+    },
+    "AnalyzeSyntaxRequest": {
+      "properties": {
+        "document": {
+          "$ref": "Document",
+          "description": "Input document."
+        },
+        "encodingType": {
+          "description": "The encoding type used by the API to calculate offsets.",
+          "type": "string",
+          "enumDescriptions": [
+            "If `EncodingType` is not specified, encoding-dependent information (such as\n`begin_offset`) will be set at `-1`.",
+            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-8 encoding of the input. C++ and Go are examples of languages\nthat use this encoding natively.",
+            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-16 encoding of the input. Java and Javascript are examples of\nlanguages that use this encoding natively.",
+            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-32 encoding of the input. Python is an example of a language\nthat uses this encoding natively."
+          ],
+          "enum": [
+            "NONE",
+            "UTF8",
+            "UTF16",
+            "UTF32"
+          ]
+        }
+      },
+      "id": "AnalyzeSyntaxRequest",
+      "description": "The syntax analysis request message.",
+      "type": "object"
     },
     "AnalyzeSentimentResponse": {
       "description": "The sentiment analysis response message.",
       "type": "object",
       "properties": {
-        "documentSentiment": {
-          "description": "The overall sentiment of the input document.",
-          "$ref": "Sentiment"
-        },
         "language": {
           "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.",
           "type": "string"
@@ -264,36 +659,204 @@
           "items": {
             "$ref": "Sentence"
           }
+        },
+        "documentSentiment": {
+          "$ref": "Sentiment",
+          "description": "The overall sentiment of the input document."
         }
       },
       "id": "AnalyzeSentimentResponse"
     },
-    "AnalyzeSyntaxRequest": {
-      "description": "The syntax analysis request message.",
+    "AnalyzeEntitiesResponse": {
+      "description": "The entity analysis response message.",
       "type": "object",
       "properties": {
-        "document": {
-          "description": "Input document.",
-          "$ref": "Document"
+        "entities": {
+          "type": "array",
+          "items": {
+            "$ref": "Entity"
+          },
+          "description": "The recognized entities in the input document."
+        },
+        "language": {
+          "type": "string",
+          "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee Document.language field for more details."
+        }
+      },
+      "id": "AnalyzeEntitiesResponse"
+    },
+    "AnalyzeSyntaxResponse": {
+      "description": "The syntax analysis response message.",
+      "type": "object",
+      "properties": {
+        "language": {
+          "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee Document.language field for more details.",
+          "type": "string"
+        },
+        "sentences": {
+          "description": "Sentences in the input document.",
+          "type": "array",
+          "items": {
+            "$ref": "Sentence"
+          }
+        },
+        "tokens": {
+          "description": "Tokens, along with their syntactic information, in the input document.",
+          "type": "array",
+          "items": {
+            "$ref": "Token"
+          }
+        }
+      },
+      "id": "AnalyzeSyntaxResponse"
+    },
+    "Entity": {
+      "description": "Represents a phrase in the text that is a known entity, such as\na person, an organization, or location. The API associates information, such\nas salience and mentions, with entities.",
+      "type": "object",
+      "properties": {
+        "mentions": {
+          "description": "The mentions of this entity in the input document. The API currently\nsupports proper noun mentions.",
+          "type": "array",
+          "items": {
+            "$ref": "EntityMention"
+          }
+        },
+        "name": {
+          "description": "The representative name for the entity.",
+          "type": "string"
+        },
+        "type": {
+          "type": "string",
+          "enumDescriptions": [
+            "Unknown",
+            "Person",
+            "Location",
+            "Organization",
+            "Event",
+            "Work of art",
+            "Consumer goods",
+            "Other types"
+          ],
+          "enum": [
+            "UNKNOWN",
+            "PERSON",
+            "LOCATION",
+            "ORGANIZATION",
+            "EVENT",
+            "WORK_OF_ART",
+            "CONSUMER_GOOD",
+            "OTHER"
+          ],
+          "description": "The entity type."
+        },
+        "metadata": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Metadata associated with the entity.\n\nCurrently, Wikipedia URLs and Knowledge Graph MIDs are provided, if\navailable. The associated keys are \"wikipedia_url\" and \"mid\", respectively.",
+          "type": "object"
+        },
+        "salience": {
+          "description": "The salience score associated with the entity in the [0, 1.0] range.\n\nThe salience score for an entity provides information about the\nimportance or centrality of that entity to the entire document text.\nScores closer to 0 are less salient, while scores closer to 1.0 are highly\nsalient.",
+          "format": "float",
+          "type": "number"
+        }
+      },
+      "id": "Entity"
+    },
+    "AnnotateTextRequest": {
+      "description": "The request message for the text annotation API, which can perform multiple\nanalysis types (sentiment, entities, and syntax) in one call.",
+      "type": "object",
+      "properties": {
+        "features": {
+          "$ref": "Features",
+          "description": "The enabled features."
         },
         "encodingType": {
-          "description": "The encoding type used by the API to calculate offsets.",
           "enum": [
             "NONE",
             "UTF8",
             "UTF16",
             "UTF32"
           ],
+          "description": "The encoding type used by the API to calculate offsets.",
+          "type": "string",
           "enumDescriptions": [
             "If `EncodingType` is not specified, encoding-dependent information (such as\n`begin_offset`) will be set at `-1`.",
             "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-8 encoding of the input. C++ and Go are examples of languages\nthat use this encoding natively.",
             "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-16 encoding of the input. Java and Javascript are examples of\nlanguages that use this encoding natively.",
             "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-32 encoding of the input. Python is an example of a language\nthat uses this encoding natively."
-          ],
-          "type": "string"
+          ]
+        },
+        "document": {
+          "$ref": "Document",
+          "description": "Input document."
         }
       },
-      "id": "AnalyzeSyntaxRequest"
+      "id": "AnnotateTextRequest"
+    },
+    "AnalyzeSentimentRequest": {
+      "properties": {
+        "encodingType": {
+          "enum": [
+            "NONE",
+            "UTF8",
+            "UTF16",
+            "UTF32"
+          ],
+          "description": "The encoding type used by the API to calculate sentence offsets for the\nsentence sentiment.",
+          "type": "string",
+          "enumDescriptions": [
+            "If `EncodingType` is not specified, encoding-dependent information (such as\n`begin_offset`) will be set at `-1`.",
+            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-8 encoding of the input. C++ and Go are examples of languages\nthat use this encoding natively.",
+            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-16 encoding of the input. Java and Javascript are examples of\nlanguages that use this encoding natively.",
+            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-32 encoding of the input. Python is an example of a language\nthat uses this encoding natively."
+          ]
+        },
+        "document": {
+          "$ref": "Document",
+          "description": "Input document. Currently, `analyzeSentiment` only supports English text\n(Document.language=\"EN\")."
+        }
+      },
+      "id": "AnalyzeSentimentRequest",
+      "description": "The sentiment analysis request message.",
+      "type": "object"
+    },
+    "AnnotateTextResponse": {
+      "type": "object",
+      "properties": {
+        "documentSentiment": {
+          "description": "The overall sentiment for the document. Populated if the user enables\nAnnotateTextRequest.Features.extract_document_sentiment.",
+          "$ref": "Sentiment"
+        },
+        "language": {
+          "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee Document.language field for more details.",
+          "type": "string"
+        },
+        "sentences": {
+          "description": "Sentences in the input document. Populated if the user enables\nAnnotateTextRequest.Features.extract_syntax.",
+          "type": "array",
+          "items": {
+            "$ref": "Sentence"
+          }
+        },
+        "tokens": {
+          "description": "Tokens, along with their syntactic information, in the input document.\nPopulated if the user enables\nAnnotateTextRequest.Features.extract_syntax.",
+          "type": "array",
+          "items": {
+            "$ref": "Token"
+          }
+        },
+        "entities": {
+          "description": "Entities, along with their semantic information, in the input document.\nPopulated if the user enables\nAnnotateTextRequest.Features.extract_entities.",
+          "type": "array",
+          "items": {
+            "$ref": "Entity"
+          }
+        }
+      },
+      "id": "AnnotateTextResponse",
+      "description": "The text annotations response message."
     },
     "DependencyEdge": {
       "description": "Represents dependency parse tree information for a token.",
@@ -301,90 +864,10 @@
       "properties": {
         "headTokenIndex": {
           "description": "Represents the head of this token in the dependency tree.\nThis is the index of the token which has an arc going to this token.\nThe index is the position of the token in the array of tokens returned\nby the API method. If this token is a root token, then the\n`head_token_index` is its own index.",
-          "type": "integer",
-          "format": "int32"
+          "format": "int32",
+          "type": "integer"
         },
         "label": {
-          "description": "The parse label for the token.",
-          "enum": [
-            "UNKNOWN",
-            "ABBREV",
-            "ACOMP",
-            "ADVCL",
-            "ADVMOD",
-            "AMOD",
-            "APPOS",
-            "ATTR",
-            "AUX",
-            "AUXPASS",
-            "CC",
-            "CCOMP",
-            "CONJ",
-            "CSUBJ",
-            "CSUBJPASS",
-            "DEP",
-            "DET",
-            "DISCOURSE",
-            "DOBJ",
-            "EXPL",
-            "GOESWITH",
-            "IOBJ",
-            "MARK",
-            "MWE",
-            "MWV",
-            "NEG",
-            "NN",
-            "NPADVMOD",
-            "NSUBJ",
-            "NSUBJPASS",
-            "NUM",
-            "NUMBER",
-            "P",
-            "PARATAXIS",
-            "PARTMOD",
-            "PCOMP",
-            "POBJ",
-            "POSS",
-            "POSTNEG",
-            "PRECOMP",
-            "PRECONJ",
-            "PREDET",
-            "PREF",
-            "PREP",
-            "PRONL",
-            "PRT",
-            "PS",
-            "QUANTMOD",
-            "RCMOD",
-            "RCMODREL",
-            "RDROP",
-            "REF",
-            "REMNANT",
-            "REPARANDUM",
-            "ROOT",
-            "SNUM",
-            "SUFF",
-            "TMOD",
-            "TOPIC",
-            "VMOD",
-            "VOCATIVE",
-            "XCOMP",
-            "SUFFIX",
-            "TITLE",
-            "ADVPHMOD",
-            "AUXCAUS",
-            "AUXVV",
-            "DTMOD",
-            "FOREIGN",
-            "KW",
-            "LIST",
-            "NOMC",
-            "NOMCSUBJ",
-            "NOMCSUBJPASS",
-            "NUMC",
-            "COP",
-            "DISLOCATED"
-          ],
           "enumDescriptions": [
             "Unknown",
             "Abbreviation modifier",
@@ -464,627 +947,144 @@
             "Copula",
             "Dislocated relation (for fronted/topicalized elements)"
           ],
+          "enum": [
+            "UNKNOWN",
+            "ABBREV",
+            "ACOMP",
+            "ADVCL",
+            "ADVMOD",
+            "AMOD",
+            "APPOS",
+            "ATTR",
+            "AUX",
+            "AUXPASS",
+            "CC",
+            "CCOMP",
+            "CONJ",
+            "CSUBJ",
+            "CSUBJPASS",
+            "DEP",
+            "DET",
+            "DISCOURSE",
+            "DOBJ",
+            "EXPL",
+            "GOESWITH",
+            "IOBJ",
+            "MARK",
+            "MWE",
+            "MWV",
+            "NEG",
+            "NN",
+            "NPADVMOD",
+            "NSUBJ",
+            "NSUBJPASS",
+            "NUM",
+            "NUMBER",
+            "P",
+            "PARATAXIS",
+            "PARTMOD",
+            "PCOMP",
+            "POBJ",
+            "POSS",
+            "POSTNEG",
+            "PRECOMP",
+            "PRECONJ",
+            "PREDET",
+            "PREF",
+            "PREP",
+            "PRONL",
+            "PRT",
+            "PS",
+            "QUANTMOD",
+            "RCMOD",
+            "RCMODREL",
+            "RDROP",
+            "REF",
+            "REMNANT",
+            "REPARANDUM",
+            "ROOT",
+            "SNUM",
+            "SUFF",
+            "TMOD",
+            "TOPIC",
+            "VMOD",
+            "VOCATIVE",
+            "XCOMP",
+            "SUFFIX",
+            "TITLE",
+            "ADVPHMOD",
+            "AUXCAUS",
+            "AUXVV",
+            "DTMOD",
+            "FOREIGN",
+            "KW",
+            "LIST",
+            "NOMC",
+            "NOMCSUBJ",
+            "NOMCSUBJPASS",
+            "NUMC",
+            "COP",
+            "DISLOCATED"
+          ],
+          "description": "The parse label for the token.",
           "type": "string"
         }
       },
       "id": "DependencyEdge"
     },
-    "AnalyzeSyntaxResponse": {
-      "description": "The syntax analysis response message.",
+    "TextSpan": {
+      "description": "Represents an output piece of text.",
       "type": "object",
       "properties": {
-        "language": {
-          "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee Document.language field for more details.",
-          "type": "string"
+        "beginOffset": {
+          "description": "The API calculates the beginning offset of the content in the original\ndocument according to the EncodingType specified in the API request.",
+          "format": "int32",
+          "type": "integer"
         },
-        "tokens": {
-          "description": "Tokens, along with their syntactic information, in the input document.",
-          "type": "array",
-          "items": {
-            "$ref": "Token"
-          }
-        },
-        "sentences": {
-          "description": "Sentences in the input document.",
-          "type": "array",
-          "items": {
-            "$ref": "Sentence"
-          }
-        }
-      },
-      "id": "AnalyzeSyntaxResponse"
-    },
-    "AnnotateTextRequest": {
-      "description": "The request message for the text annotation API, which can perform multiple\nanalysis types (sentiment, entities, and syntax) in one call.",
-      "type": "object",
-      "properties": {
-        "document": {
-          "description": "Input document.",
-          "$ref": "Document"
-        },
-        "encodingType": {
-          "description": "The encoding type used by the API to calculate offsets.",
-          "enum": [
-            "NONE",
-            "UTF8",
-            "UTF16",
-            "UTF32"
-          ],
-          "enumDescriptions": [
-            "If `EncodingType` is not specified, encoding-dependent information (such as\n`begin_offset`) will be set at `-1`.",
-            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-8 encoding of the input. C++ and Go are examples of languages\nthat use this encoding natively.",
-            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-16 encoding of the input. Java and Javascript are examples of\nlanguages that use this encoding natively.",
-            "Encoding-dependent information (such as `begin_offset`) is calculated based\non the UTF-32 encoding of the input. Python is an example of a language\nthat uses this encoding natively."
-          ],
-          "type": "string"
-        },
-        "features": {
-          "description": "The enabled features.",
-          "$ref": "Features"
-        }
-      },
-      "id": "AnnotateTextRequest"
-    },
-    "Sentence": {
-      "description": "Represents a sentence in the input document.",
-      "type": "object",
-      "properties": {
-        "text": {
-          "description": "The sentence text.",
-          "$ref": "TextSpan"
-        },
-        "sentiment": {
-          "description": "For calls to AnalyzeSentiment or if\nAnnotateTextRequest.Features.extract_document_sentiment is set to\ntrue, this field will contain the sentiment for the sentence.",
-          "$ref": "Sentiment"
-        }
-      },
-      "id": "Sentence"
-    },
-    "Features": {
-      "description": "All available features for sentiment, syntax, and semantic analysis.\nSetting each one to true will enable that specific analysis for the input.",
-      "type": "object",
-      "properties": {
-        "extractDocumentSentiment": {
-          "description": "Extract document-level sentiment.",
-          "type": "boolean"
-        },
-        "extractEntities": {
-          "description": "Extract entities.",
-          "type": "boolean"
-        },
-        "extractSyntax": {
-          "description": "Extract syntax information.",
-          "type": "boolean"
-        }
-      },
-      "id": "Features"
-    },
-    "PartOfSpeech": {
-      "description": "Represents part of speech information for a token.",
-      "type": "object",
-      "properties": {
-        "aspect": {
-          "description": "The grammatical aspect.",
-          "enum": [
-            "ASPECT_UNKNOWN",
-            "PERFECTIVE",
-            "IMPERFECTIVE",
-            "PROGRESSIVE"
-          ],
-          "enumDescriptions": [
-            "Aspect is not applicable in the analyzed language or is not predicted.",
-            "Perfective",
-            "Imperfective",
-            "Progressive"
-          ],
-          "type": "string"
-        },
-        "gender": {
-          "description": "The grammatical gender.",
-          "enum": [
-            "GENDER_UNKNOWN",
-            "FEMININE",
-            "MASCULINE",
-            "NEUTER"
-          ],
-          "enumDescriptions": [
-            "Gender is not applicable in the analyzed language or is not predicted.",
-            "Feminine",
-            "Masculine",
-            "Neuter"
-          ],
-          "type": "string"
-        },
-        "person": {
-          "description": "The grammatical person.",
-          "enum": [
-            "PERSON_UNKNOWN",
-            "FIRST",
-            "SECOND",
-            "THIRD",
-            "REFLEXIVE_PERSON"
-          ],
-          "enumDescriptions": [
-            "Person is not applicable in the analyzed language or is not predicted.",
-            "First",
-            "Second",
-            "Third",
-            "Reflexive"
-          ],
-          "type": "string"
-        },
-        "case": {
-          "description": "The grammatical case.",
-          "enum": [
-            "CASE_UNKNOWN",
-            "ACCUSATIVE",
-            "ADVERBIAL",
-            "COMPLEMENTIVE",
-            "DATIVE",
-            "GENITIVE",
-            "INSTRUMENTAL",
-            "LOCATIVE",
-            "NOMINATIVE",
-            "OBLIQUE",
-            "PARTITIVE",
-            "PREPOSITIONAL",
-            "REFLEXIVE_CASE",
-            "RELATIVE_CASE",
-            "VOCATIVE"
-          ],
-          "enumDescriptions": [
-            "Case is not applicable in the analyzed language or is not predicted.",
-            "Accusative",
-            "Adverbial",
-            "Complementive",
-            "Dative",
-            "Genitive",
-            "Instrumental",
-            "Locative",
-            "Nominative",
-            "Oblique",
-            "Partitive",
-            "Prepositional",
-            "Reflexive",
-            "Relative",
-            "Vocative"
-          ],
-          "type": "string"
-        },
-        "form": {
-          "description": "The grammatical form.",
-          "enum": [
-            "FORM_UNKNOWN",
-            "ADNOMIAL",
-            "AUXILIARY",
-            "COMPLEMENTIZER",
-            "FINAL_ENDING",
-            "GERUND",
-            "REALIS",
-            "IRREALIS",
-            "SHORT",
-            "LONG",
-            "ORDER",
-            "SPECIFIC"
-          ],
-          "enumDescriptions": [
-            "Form is not applicable in the analyzed language or is not predicted.",
-            "Adnomial",
-            "Auxiliary",
-            "Complementizer",
-            "Final ending",
-            "Gerund",
-            "Realis",
-            "Irrealis",
-            "Short form",
-            "Long form",
-            "Order form",
-            "Specific form"
-          ],
-          "type": "string"
-        },
-        "tense": {
-          "description": "The grammatical tense.",
-          "enum": [
-            "TENSE_UNKNOWN",
-            "CONDITIONAL_TENSE",
-            "FUTURE",
-            "PAST",
-            "PRESENT",
-            "IMPERFECT",
-            "PLUPERFECT"
-          ],
-          "enumDescriptions": [
-            "Tense is not applicable in the analyzed language or is not predicted.",
-            "Conditional",
-            "Future",
-            "Past",
-            "Present",
-            "Imperfect",
-            "Pluperfect"
-          ],
-          "type": "string"
-        },
-        "proper": {
-          "description": "The grammatical properness.",
-          "enum": [
-            "PROPER_UNKNOWN",
-            "PROPER",
-            "NOT_PROPER"
-          ],
-          "enumDescriptions": [
-            "Proper is not applicable in the analyzed language or is not predicted.",
-            "Proper",
-            "Not proper"
-          ],
-          "type": "string"
-        },
-        "mood": {
-          "description": "The grammatical mood.",
-          "enum": [
-            "MOOD_UNKNOWN",
-            "CONDITIONAL_MOOD",
-            "IMPERATIVE",
-            "INDICATIVE",
-            "INTERROGATIVE",
-            "JUSSIVE",
-            "SUBJUNCTIVE"
-          ],
-          "enumDescriptions": [
-            "Mood is not applicable in the analyzed language or is not predicted.",
-            "Conditional",
-            "Imperative",
-            "Indicative",
-            "Interrogative",
-            "Jussive",
-            "Subjunctive"
-          ],
-          "type": "string"
-        },
-        "tag": {
-          "description": "The part of speech tag.",
-          "enum": [
-            "UNKNOWN",
-            "ADJ",
-            "ADP",
-            "ADV",
-            "CONJ",
-            "DET",
-            "NOUN",
-            "NUM",
-            "PRON",
-            "PRT",
-            "PUNCT",
-            "VERB",
-            "X",
-            "AFFIX"
-          ],
-          "enumDescriptions": [
-            "Unknown",
-            "Adjective",
-            "Adposition (preposition and postposition)",
-            "Adverb",
-            "Conjunction",
-            "Determiner",
-            "Noun (common and proper)",
-            "Cardinal number",
-            "Pronoun",
-            "Particle or other function word",
-            "Punctuation",
-            "Verb (all tenses and modes)",
-            "Other: foreign words, typos, abbreviations",
-            "Affix"
-          ],
-          "type": "string"
-        },
-        "number": {
-          "description": "The grammatical number.",
-          "enum": [
-            "NUMBER_UNKNOWN",
-            "SINGULAR",
-            "PLURAL",
-            "DUAL"
-          ],
-          "enumDescriptions": [
-            "Number is not applicable in the analyzed language or is not predicted.",
-            "Singular",
-            "Plural",
-            "Dual"
-          ],
-          "type": "string"
-        },
-        "reciprocity": {
-          "description": "The grammatical reciprocity.",
-          "enum": [
-            "RECIPROCITY_UNKNOWN",
-            "RECIPROCAL",
-            "NON_RECIPROCAL"
-          ],
-          "enumDescriptions": [
-            "Reciprocity is not applicable in the analyzed language or is not\npredicted.",
-            "Reciprocal",
-            "Non-reciprocal"
-          ],
-          "type": "string"
-        },
-        "voice": {
-          "description": "The grammatical voice.",
-          "enum": [
-            "VOICE_UNKNOWN",
-            "ACTIVE",
-            "CAUSATIVE",
-            "PASSIVE"
-          ],
-          "enumDescriptions": [
-            "Voice is not applicable in the analyzed language or is not predicted.",
-            "Active",
-            "Causative",
-            "Passive"
-          ],
+        "content": {
+          "description": "The content of the output text.",
           "type": "string"
         }
       },
-      "id": "PartOfSpeech"
-    },
-    "AnnotateTextResponse": {
-      "description": "The text annotations response message.",
-      "type": "object",
-      "properties": {
-        "entities": {
-          "description": "Entities, along with their semantic information, in the input document.\nPopulated if the user enables\nAnnotateTextRequest.Features.extract_entities.",
-          "type": "array",
-          "items": {
-            "$ref": "Entity"
-          }
-        },
-        "documentSentiment": {
-          "description": "The overall sentiment for the document. Populated if the user enables\nAnnotateTextRequest.Features.extract_document_sentiment.",
-          "$ref": "Sentiment"
-        },
-        "language": {
-          "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee Document.language field for more details.",
-          "type": "string"
-        },
-        "tokens": {
-          "description": "Tokens, along with their syntactic information, in the input document.\nPopulated if the user enables\nAnnotateTextRequest.Features.extract_syntax.",
-          "type": "array",
-          "items": {
-            "$ref": "Token"
-          }
-        },
-        "sentences": {
-          "description": "Sentences in the input document. Populated if the user enables\nAnnotateTextRequest.Features.extract_syntax.",
-          "type": "array",
-          "items": {
-            "$ref": "Sentence"
-          }
-        }
-      },
-      "id": "AnnotateTextResponse"
-    },
-    "Entity": {
-      "description": "Represents a phrase in the text that is a known entity, such as\na person, an organization, or location. The API associates information, such\nas salience and mentions, with entities.",
-      "type": "object",
-      "properties": {
-        "metadata": {
-          "description": "Metadata associated with the entity.\n\nCurrently, Wikipedia URLs and Knowledge Graph MIDs are provided, if\navailable. The associated keys are \"wikipedia_url\" and \"mid\", respectively.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "salience": {
-          "description": "The salience score associated with the entity in the [0, 1.0] range.\n\nThe salience score for an entity provides information about the\nimportance or centrality of that entity to the entire document text.\nScores closer to 0 are less salient, while scores closer to 1.0 are highly\nsalient.",
-          "type": "number",
-          "format": "float"
-        },
-        "type": {
-          "description": "The entity type.",
-          "enum": [
-            "UNKNOWN",
-            "PERSON",
-            "LOCATION",
-            "ORGANIZATION",
-            "EVENT",
-            "WORK_OF_ART",
-            "CONSUMER_GOOD",
-            "OTHER"
-          ],
-          "enumDescriptions": [
-            "Unknown",
-            "Person",
-            "Location",
-            "Organization",
-            "Event",
-            "Work of art",
-            "Consumer goods",
-            "Other types"
-          ],
-          "type": "string"
-        },
-        "mentions": {
-          "description": "The mentions of this entity in the input document. The API currently\nsupports proper noun mentions.",
-          "type": "array",
-          "items": {
-            "$ref": "EntityMention"
-          }
-        },
-        "name": {
-          "description": "The representative name for the entity.",
-          "type": "string"
-        }
-      },
-      "id": "Entity"
-    },
-    "Sentiment": {
-      "description": "Represents the feeling associated with the entire text or entities in\nthe text.",
-      "type": "object",
-      "properties": {
-        "score": {
-          "description": "Sentiment score between -1.0 (negative sentiment) and 1.0\n(positive sentiment).",
-          "type": "number",
-          "format": "float"
-        },
-        "polarity": {
-          "description": "DEPRECATED FIELD - This field is being deprecated in\nfavor of score. Please refer to our documentation at\nhttps://cloud.google.com/natural-language/docs for more information.",
-          "type": "number",
-          "format": "float"
-        },
-        "magnitude": {
-          "description": "A non-negative number in the [0, +inf) range, which represents\nthe absolute magnitude of sentiment regardless of score (positive or\nnegative).",
-          "type": "number",
-          "format": "float"
-        }
-      },
-      "id": "Sentiment"
+      "id": "TextSpan"
     },
     "Token": {
-      "description": "Represents the smallest syntactic building block of the text.",
-      "type": "object",
       "properties": {
         "text": {
-          "description": "The token text.",
-          "$ref": "TextSpan"
-        },
-        "partOfSpeech": {
-          "description": "Parts of speech tag for this token.",
-          "$ref": "PartOfSpeech"
+          "$ref": "TextSpan",
+          "description": "The token text."
         },
         "dependencyEdge": {
-          "description": "Dependency tree parse for this token.",
-          "$ref": "DependencyEdge"
+          "$ref": "DependencyEdge",
+          "description": "Dependency tree parse for this token."
         },
         "lemma": {
           "description": "[Lemma](https://en.wikipedia.org/wiki/Lemma_%28morphology%29) of the token.",
           "type": "string"
-        }
-      },
-      "id": "Token"
-    },
-    "AnalyzeEntitiesResponse": {
-      "description": "The entity analysis response message.",
-      "type": "object",
-      "properties": {
-        "entities": {
-          "description": "The recognized entities in the input document.",
-          "type": "array",
-          "items": {
-            "$ref": "Entity"
-          }
         },
-        "language": {
-          "description": "The language of the text, which will be the same as the language specified\nin the request or, if not specified, the automatically-detected language.\nSee Document.language field for more details.",
-          "type": "string"
+        "partOfSpeech": {
+          "$ref": "PartOfSpeech",
+          "description": "Parts of speech tag for this token."
         }
       },
-      "id": "AnalyzeEntitiesResponse"
+      "id": "Token",
+      "description": "Represents the smallest syntactic building block of the text.",
+      "type": "object"
     }
   },
-  "revision": "20170103",
-  "basePath": "",
   "icons": {
     "x32": "http://www.google.com/images/icons/product/search-32.gif",
     "x16": "http://www.google.com/images/icons/product/search-16.gif"
   },
-  "version_module": "True",
+  "protocol": "rest",
   "canonicalName": "Cloud Natural Language",
-  "discoveryVersion": "v1",
-  "baseUrl": "https://language.googleapis.com/",
-  "name": "language",
-  "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
     }
-  },
-  "documentationLink": "https://cloud.google.com/natural-language/",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
-  "servicePath": "",
-  "ownerName": "Google",
-  "version": "v1beta1",
-  "rootUrl": "https://language.googleapis.com/",
-  "kind": "discovery#restDescription"
+  }
 }
diff --git a/language/v1beta1/language-gen.go b/language/v1beta1/language-gen.go
index 5bf31a3..ac11e4f 100644
--- a/language/v1beta1/language-gen.go
+++ b/language/v1beta1/language-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Documents *DocumentsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewDocumentsService(s *Service) *DocumentsService {
 	rs := &DocumentsService{s: s}
 	return rs
@@ -1352,6 +1357,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.analyzeentitiesrequest)
 	if err != nil {
@@ -1472,6 +1478,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.analyzesentimentrequest)
 	if err != nil {
@@ -1596,6 +1603,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.analyzesyntaxrequest)
 	if err != nil {
@@ -1718,6 +1726,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.annotatetextrequest)
 	if err != nil {
diff --git a/licensing/v1/licensing-gen.go b/licensing/v1/licensing-gen.go
index 1d76c43..ddffbe3 100644
--- a/licensing/v1/licensing-gen.go
+++ b/licensing/v1/licensing-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	LicenseAssignments *LicenseAssignmentsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewLicenseAssignmentsService(s *Service) *LicenseAssignmentsService {
 	rs := &LicenseAssignmentsService{s: s}
 	return rs
@@ -256,6 +261,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{productId}/sku/{skuId}/user/{userId}")
@@ -383,6 +389,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -529,6 +536,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.licenseassignmentinsert)
 	if err != nil {
@@ -696,6 +704,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -895,6 +904,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1078,6 +1088,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.licenseassignment)
 	if err != nil {
@@ -1231,6 +1242,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.licenseassignment)
 	if err != nil {
diff --git a/logging/v2/logging-api.json b/logging/v2/logging-api.json
index 17f9fc0..e6ed824 100644
--- a/logging/v2/logging-api.json
+++ b/logging/v2/logging-api.json
@@ -1,149 +1,38 @@
 {
+  "kind": "discovery#restDescription",
+  "description": "Writes log entries and manages your Stackdriver Logging configuration.",
+  "servicePath": "",
+  "basePath": "",
+  "documentationLink": "https://cloud.google.com/logging/docs/",
+  "revision": "20170206",
+  "id": "logging:v2",
   "discoveryVersion": "v1",
   "version_module": "True",
   "schemas": {
-    "MonitoredResource": {
-      "description": "An object representing a resource that can be used for monitoring, logging, billing, or other purposes. Examples include virtual machine instances, databases, and storage devices such as disks. The type field identifies a MonitoredResourceDescriptor object that describes the resource's schema. Information in the labels field identifies the actual resource and its attributes according to the schema. For example, a particular Compute Engine VM instance could be represented by the following object, because the MonitoredResourceDescriptor for \"gce_instance\" has labels \"instance_id\" and \"zone\":\n{ \"type\": \"gce_instance\",\n  \"labels\": { \"instance_id\": \"12345678901234\",\n              \"zone\": \"us-central1-a\" }}\n",
-      "type": "object",
-      "properties": {
-        "type": {
-          "description": "Required. The monitored resource type. This field must match the type field of a MonitoredResourceDescriptor object. For example, the type of a Cloud SQL database is \"cloudsql_database\".",
-          "type": "string"
-        },
-        "labels": {
-          "type": "object",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "description": "Required. Values for all of the labels listed in the associated monitored resource descriptor. For example, Cloud SQL databases use the labels \"database_id\" and \"zone\"."
-        }
-      },
-      "id": "MonitoredResource"
-    },
-    "WriteLogEntriesRequest": {
-      "type": "object",
-      "properties": {
-        "resource": {
-          "$ref": "MonitoredResource",
-          "description": "Optional. A default monitored resource object that is assigned to all log entries in entries that do not specify a value for resource. Example:\n{ \"type\": \"gce_instance\",\n  \"labels\": {\n    \"zone\": \"us-central1-a\", \"instance_id\": \"00000000000000000000\" }}\nSee LogEntry."
-        },
-        "logName": {
-          "description": "Optional. A default log resource name that is assigned to all log entries in entries that do not specify a value for log_name:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\" or \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
-          "type": "string"
-        },
-        "entries": {
-          "description": "Required. The log entries to write. Values supplied for the fields log_name, resource, and labels in this entries.write request are added to those log entries that do not provide their own values for the fields.To improve throughput and to avoid exceeding the quota limit for calls to entries.write, you should write multiple log entries at once rather than calling this method for each individual log entry.",
-          "type": "array",
-          "items": {
-            "$ref": "LogEntry"
-          }
-        },
-        "partialSuccess": {
-          "description": "Optional. Whether valid entries should be written even if some other entries fail due to INVALID_ARGUMENT or PERMISSION_DENIED errors. If any entry is not written, the response status will be the error associated with one of the failed entries and include error details in the form of WriteLogEntriesPartialErrors.",
-          "type": "boolean"
-        },
-        "labels": {
-          "type": "object",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "description": "Optional. Default labels that are added to the labels field of all log entries in entries. If a log entry already has a label with the same key as a label in this parameter, then the log entry's label is not changed. See LogEntry."
-        }
-      },
-      "id": "WriteLogEntriesRequest",
-      "description": "The parameters to WriteLogEntries."
-    },
-    "LogSink": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "description": "Required. The client-assigned sink identifier, unique within the project. Example: \"my-syslog-errors-to-pubsub\". Sink identifiers are limited to 100 characters and can include only the following characters: upper and lower-case alphanumeric characters, underscores, hyphens, and periods.",
-          "type": "string"
-        },
-        "filter": {
-          "description": "Optional. An advanced logs filter. The only exported log entries are those that are in the resource owning the sink and that match the filter. The filter must use the log entry format specified by the output_version_format parameter. For example, in the v2 format:\nlogName=\"projects/[PROJECT_ID]/logs/[LOG_ID]\" AND severity\u003e=ERROR\n",
-          "type": "string"
-        },
-        "destination": {
-          "description": "Required. The export destination:\n\"storage.googleapis.com/[GCS_BUCKET]\"\n\"bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]\"\n\"pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]\"\nThe sink's writer_identity, set when the sink is created, must have permission to write to the destination or else the log entries are not exported. For more information, see Exporting Logs With Sinks.",
-          "type": "string"
-        },
-        "endTime": {
-          "description": "Optional. The time at which this sink will stop exporting log entries. Log entries are exported only if their timestamp is earlier than the end time. If this field is not supplied, there is no end time. If both a start time and an end time are provided, then the end time must be later than the start time.",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "writerIdentity": {
-          "type": "string",
-          "description": "Output only. An IAM identity&mdash;a service account or group&mdash;under which Stackdriver Logging writes the exported log entries to the sink's destination. This field is set by sinks.create and sinks.update, based on the setting of unique_writer_identity in those methods.Until you grant this identity write-access to the destination, log entry exports from this sink will fail. For more information, see Granting access for a resource. Consult the destination service's documentation to determine the appropriate IAM roles to assign to the identity."
-        },
-        "startTime": {
-          "description": "Optional. The time at which this sink will begin exporting log entries. Log entries are exported only if their timestamp is not earlier than the start time. The default value of this field is the time the sink is created or updated.",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "outputVersionFormat": {
-          "enum": [
-            "VERSION_FORMAT_UNSPECIFIED",
-            "V2",
-            "V1"
-          ],
-          "description": "Optional. The log entry format to use for this sink's exported log entries. The v2 format is used by default. The v1 format is deprecated and should be used only as part of a migration effort to v2. See Migration to the v2 API.",
-          "type": "string",
-          "enumDescriptions": [
-            "An unspecified format version that will default to V2.",
-            "LogEntry version 2 format.",
-            "LogEntry version 1 format."
-          ]
-        }
-      },
-      "id": "LogSink",
-      "description": "Describes a sink used to export log entries to one of the following destinations in any project: a Cloud Storage bucket, a BigQuery dataset, or a Cloud Pub/Sub topic. A logs filter controls which log entries are exported. The sink must be created within a project or organization."
-    },
     "ListLogsResponse": {
+      "description": "Result returned from ListLogs.",
       "type": "object",
       "properties": {
-        "logNames": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          },
-          "description": "A list of log names. For example, \"projects/my-project/syslog\" or \"organizations/123/cloudresourcemanager.googleapis.com%2Factivity\"."
-        },
         "nextPageToken": {
           "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.",
           "type": "string"
-        }
-      },
-      "id": "ListLogsResponse",
-      "description": "Result returned from ListLogs."
-    },
-    "ListSinksResponse": {
-      "description": "Result returned from ListSinks.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "type": "string",
-          "description": "If there might be more results than appear in this response, then nextPageToken is included. To get the next set of results, call the same method again using the value of nextPageToken as pageToken."
         },
-        "sinks": {
+        "logNames": {
+          "description": "A list of log names. For example, \"projects/my-project/syslog\" or \"organizations/123/cloudresourcemanager.googleapis.com%2Factivity\".",
           "type": "array",
           "items": {
-            "$ref": "LogSink"
-          },
-          "description": "A list of sinks."
+            "type": "string"
+          }
         }
       },
-      "id": "ListSinksResponse"
+      "id": "ListLogsResponse"
     },
     "HttpRequest": {
-      "description": "A common proto for logging HTTP requests. Only contains semantics defined by the HTTP specification. Product-specific logging information MUST be defined in a separate message.",
-      "type": "object",
       "properties": {
         "latency": {
-          "type": "string",
           "description": "The request processing latency on the server, from the time the request was received until the response was sent.",
-          "format": "google-duration"
+          "format": "google-duration",
+          "type": "string"
         },
         "userAgent": {
           "type": "string",
@@ -155,8 +44,8 @@
           "type": "string"
         },
         "requestMethod": {
-          "type": "string",
-          "description": "The request method. Examples: \"GET\", \"HEAD\", \"PUT\", \"POST\"."
+          "description": "The request method. Examples: \"GET\", \"HEAD\", \"PUT\", \"POST\".",
+          "type": "string"
         },
         "responseSize": {
           "description": "The size of the HTTP response message sent back to the client, in bytes, including the response headers and the response body.",
@@ -164,25 +53,25 @@
           "type": "string"
         },
         "requestSize": {
-          "type": "string",
           "description": "The size of the HTTP request message in bytes, including the request headers and the request body.",
-          "format": "int64"
+          "format": "int64",
+          "type": "string"
         },
         "requestUrl": {
-          "type": "string",
-          "description": "The scheme (http, https), the host name, the path and the query portion of the URL that was requested. Example: \"http://example.com/some/info?color=red\"."
-        },
-        "serverIp": {
-          "type": "string",
-          "description": "The IP address (IPv4 or IPv6) of the origin server that the request was sent to."
+          "description": "The scheme (http, https), the host name, the path and the query portion of the URL that was requested. Example: \"http://example.com/some/info?color=red\".",
+          "type": "string"
         },
         "remoteIp": {
           "type": "string",
           "description": "The IP address (IPv4 or IPv6) of the client that issued the HTTP request. Examples: \"192.168.1.1\", \"FE80::0202:B3FF:FE1E:8329\"."
         },
+        "serverIp": {
+          "description": "The IP address (IPv4 or IPv6) of the origin server that the request was sent to.",
+          "type": "string"
+        },
         "cacheLookup": {
-          "type": "boolean",
-          "description": "Whether or not a cache lookup was attempted."
+          "description": "Whether or not a cache lookup was attempted.",
+          "type": "boolean"
         },
         "cacheHit": {
           "description": "Whether or not an entity was served from cache (with or without validation).",
@@ -202,10 +91,29 @@
           "type": "string"
         }
       },
-      "id": "HttpRequest"
+      "id": "HttpRequest",
+      "description": "A common proto for logging HTTP requests. Only contains semantics defined by the HTTP specification. Product-specific logging information MUST be defined in a separate message.",
+      "type": "object"
+    },
+    "ListSinksResponse": {
+      "description": "Result returned from ListSinks.",
+      "type": "object",
+      "properties": {
+        "sinks": {
+          "description": "A list of sinks.",
+          "type": "array",
+          "items": {
+            "$ref": "LogSink"
+          }
+        },
+        "nextPageToken": {
+          "description": "If there might be more results than appear in this response, then nextPageToken is included. To get the next set of results, call the same method again using the value of nextPageToken as pageToken.",
+          "type": "string"
+        }
+      },
+      "id": "ListSinksResponse"
     },
     "LabelDescriptor": {
-      "type": "object",
       "properties": {
         "valueType": {
           "enum": [
@@ -222,8 +130,8 @@
           ]
         },
         "key": {
-          "type": "string",
-          "description": "The label key."
+          "description": "The label key.",
+          "type": "string"
         },
         "description": {
           "description": "A human-readable description for the label.",
@@ -231,7 +139,8 @@
         }
       },
       "id": "LabelDescriptor",
-      "description": "A description of a label."
+      "description": "A description of a label.",
+      "type": "object"
     },
     "MonitoredResourceDescriptor": {
       "description": "An object that describes the schema of a MonitoredResource object using a type name and a set of labels. For example, the monitored resource descriptor for Google Compute Engine VM instances has a type of \"gce_instance\" and specifies the use of the labels \"instance_id\" and \"zone\" to identify particular VM instances.Different APIs can support different monitored resource types. APIs generally provide a list method that returns the monitored resource descriptors used by the API.",
@@ -242,8 +151,8 @@
           "type": "string"
         },
         "displayName": {
-          "type": "string",
-          "description": "Optional. A concise name for the monitored resource type that might be displayed in user interfaces. It should be a Title Cased Noun Phrase, without any article or other determiners. For example, \"Google Cloud SQL Database\"."
+          "description": "Optional. A concise name for the monitored resource type that might be displayed in user interfaces. It should be a Title Cased Noun Phrase, without any article or other determiners. For example, \"Google Cloud SQL Database\".",
+          "type": "string"
         },
         "description": {
           "description": "Optional. A detailed description of the monitored resource type that might be used in documentation.",
@@ -272,13 +181,13 @@
           "type": "string"
         },
         "function": {
-          "type": "string",
-          "description": "Optional. Human-readable name of the function or method being invoked, with optional context such as the class or package name. This information may be used in contexts such as the logs viewer, where a file and line number are less meaningful. The format can vary by language. For example: qual.if.ied.Class.method (Java), dir/package.func (Go), function (Python)."
+          "description": "Optional. Human-readable name of the function or method being invoked, with optional context such as the class or package name. This information may be used in contexts such as the logs viewer, where a file and line number are less meaningful. The format can vary by language. For example: qual.if.ied.Class.method (Java), dir/package.func (Go), function (Python).",
+          "type": "string"
         },
         "line": {
-          "type": "string",
           "description": "Optional. Line within the source file. 1-based; 0 indicates no line number available.",
-          "format": "int64"
+          "format": "int64",
+          "type": "string"
         }
       },
       "id": "LogEntrySourceLocation"
@@ -302,8 +211,6 @@
       "id": "ListLogEntriesResponse"
     },
     "LogLine": {
-      "description": "Application log line emitted while processing a request.",
-      "type": "object",
       "properties": {
         "severity": {
           "enum": [
@@ -345,82 +252,80 @@
           "type": "string"
         }
       },
-      "id": "LogLine"
+      "id": "LogLine",
+      "description": "Application log line emitted while processing a request.",
+      "type": "object"
     },
     "ListLogMetricsResponse": {
+      "description": "Result returned from ListLogMetrics.",
       "type": "object",
       "properties": {
+        "nextPageToken": {
+          "description": "If there might be more results than appear in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.",
+          "type": "string"
+        },
         "metrics": {
           "description": "A list of logs-based metrics.",
           "type": "array",
           "items": {
             "$ref": "LogMetric"
           }
-        },
-        "nextPageToken": {
-          "description": "If there might be more results than appear in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.",
-          "type": "string"
         }
       },
-      "id": "ListLogMetricsResponse",
-      "description": "Result returned from ListLogMetrics."
+      "id": "ListLogMetricsResponse"
     },
     "LogEntry": {
+      "description": "An individual entry in a log.",
       "type": "object",
       "properties": {
-        "logName": {
-          "type": "string",
-          "description": "Required. The resource name of the log to which this log entry belongs:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded within log_name. Example: \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". [LOG_ID] must be less than 512 characters long and can only include the following characters: upper and lower case alphanumeric characters, forward-slash, underscore, hyphen, and period.For backward compatibility, if log_name begins with a forward-slash, such as /projects/..., then the log entry is ingested as usual but the forward-slash is removed. Listing the log entry will not show the leading slash and filtering for a log name with a leading slash will never return any results."
-        },
         "resource": {
           "$ref": "MonitoredResource",
           "description": "Required. The monitored resource associated with this log entry. Example: a log entry that reports a database error would be associated with the monitored resource designating the particular database that reported the error."
         },
         "httpRequest": {
-          "$ref": "HttpRequest",
-          "description": "Optional. Information about the HTTP request associated with this log entry, if applicable."
+          "description": "Optional. Information about the HTTP request associated with this log entry, if applicable.",
+          "$ref": "HttpRequest"
         },
         "jsonPayload": {
-          "type": "object",
           "additionalProperties": {
             "description": "Properties of the object.",
             "type": "any"
           },
-          "description": "The log entry payload, represented as a structure that is expressed as a JSON object."
-        },
-        "operation": {
-          "$ref": "LogEntryOperation",
-          "description": "Optional. Information about an operation associated with the log entry, if applicable."
+          "description": "The log entry payload, represented as a structure that is expressed as a JSON object.",
+          "type": "object"
         },
         "insertId": {
           "type": "string",
           "description": "Optional. A unique ID for the log entry. If you provide this field, the logging service considers other log entries in the same project with the same ID as duplicates which can be removed. If omitted, Stackdriver Logging will generate a unique ID for this log entry."
         },
+        "operation": {
+          "$ref": "LogEntryOperation",
+          "description": "Optional. Information about an operation associated with the log entry, if applicable."
+        },
         "textPayload": {
           "description": "The log entry payload, represented as a Unicode string (UTF-8).",
           "type": "string"
         },
         "protoPayload": {
           "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
+            "type": "any",
+            "description": "Properties of the object. Contains field @type with type URL."
           },
           "description": "The log entry payload, represented as a protocol buffer. Some Google Cloud Platform services use this field for their log entry payloads.",
           "type": "object"
         },
         "labels": {
-          "type": "object",
           "additionalProperties": {
             "type": "string"
           },
-          "description": "Optional. A set of user-defined (key, value) data that provides additional information about the log entry."
+          "description": "Optional. A set of user-defined (key, value) data that provides additional information about the log entry.",
+          "type": "object"
         },
         "trace": {
           "description": "Optional. Resource name of the trace associated with the log entry, if any. If it contains a relative resource name, the name is assumed to be relative to //tracing.googleapis.com. Example: projects/my-projectid/traces/06796866738c859f2f19b7cfb3214824",
           "type": "string"
         },
         "severity": {
-          "type": "string",
           "enumDescriptions": [
             "(0) The log entry has no assigned severity level.",
             "(100) Debug or trace information.",
@@ -443,7 +348,8 @@
             "ALERT",
             "EMERGENCY"
           ],
-          "description": "Optional. The severity of the log entry. The default value is LogSeverity.DEFAULT."
+          "description": "Optional. The severity of the log entry. The default value is LogSeverity.DEFAULT.",
+          "type": "string"
         },
         "sourceLocation": {
           "$ref": "LogEntrySourceLocation",
@@ -453,33 +359,36 @@
           "description": "Optional. The time the event described by the log entry occurred. If omitted, Stackdriver Logging will use the time the log entry is received.",
           "format": "google-datetime",
           "type": "string"
+        },
+        "logName": {
+          "description": "Required. The resource name of the log to which this log entry belongs:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded within log_name. Example: \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". [LOG_ID] must be less than 512 characters long and can only include the following characters: upper and lower case alphanumeric characters, forward-slash, underscore, hyphen, and period.For backward compatibility, if log_name begins with a forward-slash, such as /projects/..., then the log entry is ingested as usual but the forward-slash is removed. Listing the log entry will not show the leading slash and filtering for a log name with a leading slash will never return any results.",
+          "type": "string"
         }
       },
-      "id": "LogEntry",
-      "description": "An individual entry in a log."
+      "id": "LogEntry"
     },
     "Empty": {
-      "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:\nservice Foo {\n  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n}\nThe JSON representation for Empty is empty JSON object {}.",
-      "type": "object",
       "properties": {},
-      "id": "Empty"
+      "id": "Empty",
+      "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:\nservice Foo {\n  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n}\nThe JSON representation for Empty is empty JSON object {}.",
+      "type": "object"
     },
     "SourceLocation": {
       "description": "Specifies a location in a source code file.",
       "type": "object",
       "properties": {
-        "file": {
-          "type": "string",
-          "description": "Source file name. Depending on the runtime environment, this might be a simple name or a fully-qualified name."
-        },
-        "functionName": {
-          "description": "Human-readable name of the function or method being invoked, with optional context such as the class or package name. This information is used in contexts such as the logs viewer, where a file and line number are less meaningful. The format can vary by language. For example: qual.if.ied.Class.method (Java), dir/package.func (Go), function (Python).",
-          "type": "string"
-        },
         "line": {
           "description": "Line within the source file.",
           "format": "int64",
           "type": "string"
+        },
+        "file": {
+          "description": "Source file name. Depending on the runtime environment, this might be a simple name or a fully-qualified name.",
+          "type": "string"
+        },
+        "functionName": {
+          "description": "Human-readable name of the function or method being invoked, with optional context such as the class or package name. This information is used in contexts such as the logs viewer, where a file and line number are less meaningful. The format can vary by language. For example: qual.if.ied.Class.method (Java), dir/package.func (Go), function (Python).",
+          "type": "string"
         }
       },
       "id": "SourceLocation"
@@ -487,6 +396,10 @@
     "ListLogEntriesRequest": {
       "type": "object",
       "properties": {
+        "orderBy": {
+          "description": "Optional. How the results should be sorted. Presently, the only permitted values are \"timestamp asc\" (default) and \"timestamp desc\". The first option returns entries in order of increasing values of LogEntry.timestamp (oldest first), and the second option returns entries in order of decreasing timestamps (newest first). Entries with equal timestamps are returned in order of LogEntry.insertId.",
+          "type": "string"
+        },
         "resourceNames": {
           "description": "Required. Names of one or more resources from which to retrieve log entries:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\nProjects listed in the project_ids field are added to this list.",
           "type": "array",
@@ -513,18 +426,78 @@
           "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
           "format": "int32",
           "type": "integer"
-        },
-        "orderBy": {
-          "type": "string",
-          "description": "Optional. How the results should be sorted. Presently, the only permitted values are \"timestamp asc\" (default) and \"timestamp desc\". The first option returns entries in order of increasing values of LogEntry.timestamp (oldest first), and the second option returns entries in order of decreasing timestamps (newest first). Entries with equal timestamps are returned in order of LogEntry.insertId."
         }
       },
       "id": "ListLogEntriesRequest",
       "description": "The parameters to ListLogEntries."
     },
     "RequestLog": {
-      "type": "object",
       "properties": {
+        "instanceIndex": {
+          "description": "If the instance processing this request belongs to a manually scaled module, then this is the 0-based index of the instance. Otherwise, this value is -1.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "host": {
+          "description": "Internet host and port number of the resource being requested.",
+          "type": "string"
+        },
+        "finished": {
+          "description": "Whether this request is finished or active.",
+          "type": "boolean"
+        },
+        "httpVersion": {
+          "description": "HTTP version of request. Example: \"HTTP/1.1\".",
+          "type": "string"
+        },
+        "startTime": {
+          "description": "Time when the request started.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "latency": {
+          "description": "Latency of the request.",
+          "format": "google-duration",
+          "type": "string"
+        },
+        "ip": {
+          "description": "Origin IP address.",
+          "type": "string"
+        },
+        "appId": {
+          "description": "Application that handled this request.",
+          "type": "string"
+        },
+        "appEngineRelease": {
+          "description": "App Engine release version.",
+          "type": "string"
+        },
+        "method": {
+          "type": "string",
+          "description": "Request method. Example: \"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\"."
+        },
+        "cost": {
+          "type": "number",
+          "description": "An indication of the relative cost of serving this request.",
+          "format": "double"
+        },
+        "instanceId": {
+          "description": "An identifier for the instance that handled the request.",
+          "type": "string"
+        },
+        "megaCycles": {
+          "description": "Number of CPU megacycles used to process request.",
+          "format": "int64",
+          "type": "string"
+        },
+        "first": {
+          "description": "Whether this is the first RequestLog entry for this request. If an active request has several RequestLog entries written to Stackdriver Logging, then this field will be set for one of them.",
+          "type": "boolean"
+        },
+        "versionId": {
+          "type": "string",
+          "description": "Version of the application that handled this request."
+        },
         "moduleId": {
           "description": "Module of the application that handled this request.",
           "type": "string"
@@ -535,8 +508,8 @@
           "format": "google-datetime"
         },
         "userAgent": {
-          "type": "string",
-          "description": "User agent that made the request."
+          "description": "User agent that made the request.",
+          "type": "string"
         },
         "wasLoadingRequest": {
           "description": "Whether this was a loading request for the instance.",
@@ -555,8 +528,8 @@
           "type": "string"
         },
         "traceId": {
-          "type": "string",
-          "description": "Stackdriver Trace identifier for this request."
+          "description": "Stackdriver Trace identifier for this request.",
+          "type": "string"
         },
         "line": {
           "type": "array",
@@ -566,29 +539,29 @@
           "description": "A list of log lines emitted by the application while serving this request."
         },
         "taskQueueName": {
-          "description": "Queue name of the request, in the case of an offline request.",
-          "type": "string"
+          "type": "string",
+          "description": "Queue name of the request, in the case of an offline request."
         },
         "referrer": {
-          "type": "string",
-          "description": "Referrer URL of request."
+          "description": "Referrer URL of request.",
+          "type": "string"
         },
         "requestId": {
-          "type": "string",
-          "description": "Globally unique identifier for a request, which is based on the request start time. Request IDs for requests which started later will compare greater as strings than those for requests which started earlier."
+          "description": "Globally unique identifier for a request, which is based on the request start time. Request IDs for requests which started later will compare greater as strings than those for requests which started earlier.",
+          "type": "string"
         },
         "nickname": {
           "description": "The logged-in user who made the request.Most likely, this is the part of the user's email before the @ sign. The field value is the same for different requests from the same user, but different users can have similar names. This information is also available to the application via the App Engine Users API.This field will be populated starting with App Engine 1.9.21.",
           "type": "string"
         },
-        "pendingTime": {
-          "type": "string",
-          "description": "Time this request spent in the pending request queue.",
-          "format": "google-duration"
-        },
         "resource": {
-          "type": "string",
-          "description": "Contains the path and query portion of the URL that was requested. For example, if the URL was \"http://example.com/app?name=val\", the resource would be \"/app?name=val\". The fragment identifier, which is identified by the # character, is not included."
+          "description": "Contains the path and query portion of the URL that was requested. For example, if the URL was \"http://example.com/app?name=val\", the resource would be \"/app?name=val\". The fragment identifier, which is identified by the # character, is not included.",
+          "type": "string"
+        },
+        "pendingTime": {
+          "description": "Time this request spent in the pending request queue.",
+          "format": "google-duration",
+          "type": "string"
         },
         "status": {
           "description": "HTTP response status code. Example: 200, 404.",
@@ -596,84 +569,19 @@
           "type": "integer"
         },
         "taskName": {
-          "type": "string",
-          "description": "Task name of the request, in the case of an offline request."
+          "description": "Task name of the request, in the case of an offline request.",
+          "type": "string"
         },
         "urlMapEntry": {
           "description": "File or class that handled the request.",
           "type": "string"
-        },
-        "instanceIndex": {
-          "description": "If the instance processing this request belongs to a manually scaled module, then this is the 0-based index of the instance. Otherwise, this value is -1.",
-          "format": "int32",
-          "type": "integer"
-        },
-        "host": {
-          "type": "string",
-          "description": "Internet host and port number of the resource being requested."
-        },
-        "finished": {
-          "type": "boolean",
-          "description": "Whether this request is finished or active."
-        },
-        "httpVersion": {
-          "type": "string",
-          "description": "HTTP version of request. Example: \"HTTP/1.1\"."
-        },
-        "startTime": {
-          "type": "string",
-          "description": "Time when the request started.",
-          "format": "google-datetime"
-        },
-        "latency": {
-          "description": "Latency of the request.",
-          "format": "google-duration",
-          "type": "string"
-        },
-        "ip": {
-          "type": "string",
-          "description": "Origin IP address."
-        },
-        "appId": {
-          "type": "string",
-          "description": "Application that handled this request."
-        },
-        "appEngineRelease": {
-          "description": "App Engine release version.",
-          "type": "string"
-        },
-        "method": {
-          "description": "Request method. Example: \"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\".",
-          "type": "string"
-        },
-        "cost": {
-          "type": "number",
-          "description": "An indication of the relative cost of serving this request.",
-          "format": "double"
-        },
-        "instanceId": {
-          "type": "string",
-          "description": "An identifier for the instance that handled the request."
-        },
-        "megaCycles": {
-          "type": "string",
-          "description": "Number of CPU megacycles used to process request.",
-          "format": "int64"
-        },
-        "first": {
-          "description": "Whether this is the first RequestLog entry for this request. If an active request has several RequestLog entries written to Stackdriver Logging, then this field will be set for one of them.",
-          "type": "boolean"
-        },
-        "versionId": {
-          "description": "Version of the application that handled this request.",
-          "type": "string"
         }
       },
       "id": "RequestLog",
-      "description": "Complete log information about a single HTTP request to an App Engine application."
+      "description": "Complete log information about a single HTTP request to an App Engine application.",
+      "type": "object"
     },
     "ListMonitoredResourceDescriptorsResponse": {
-      "description": "Result returned from ListMonitoredResourceDescriptors.",
       "type": "object",
       "properties": {
         "nextPageToken": {
@@ -681,25 +589,26 @@
           "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken."
         },
         "resourceDescriptors": {
+          "description": "A list of resource descriptors.",
           "type": "array",
           "items": {
             "$ref": "MonitoredResourceDescriptor"
-          },
-          "description": "A list of resource descriptors."
+          }
         }
       },
-      "id": "ListMonitoredResourceDescriptorsResponse"
+      "id": "ListMonitoredResourceDescriptorsResponse",
+      "description": "Result returned from ListMonitoredResourceDescriptors."
     },
     "SourceReference": {
       "type": "object",
       "properties": {
         "repository": {
-          "type": "string",
-          "description": "Optional. A URI string identifying the repository. Example: \"https://github.com/GoogleCloudPlatform/kubernetes.git\""
+          "description": "Optional. A URI string identifying the repository. Example: \"https://github.com/GoogleCloudPlatform/kubernetes.git\"",
+          "type": "string"
         },
         "revisionId": {
-          "type": "string",
-          "description": "The canonical and persistent identifier of the deployed revision. Example (git): \"0035781c50ec7aa23385dc841529ce8a4b70db1b\""
+          "description": "The canonical and persistent identifier of the deployed revision. Example (git): \"0035781c50ec7aa23385dc841529ce8a4b70db1b\"",
+          "type": "string"
         }
       },
       "id": "SourceReference",
@@ -709,29 +618,29 @@
       "description": "Describes a logs-based metric. The value of the metric is the number of log entries that match a logs filter in a given time interval.",
       "type": "object",
       "properties": {
+        "version": {
+          "enum": [
+            "V2",
+            "V1"
+          ],
+          "description": "Output only. The API version that created or updated this metric. The version also dictates the syntax of the filter expression. When a value for this field is missing, the default value of V2 should be assumed.",
+          "type": "string",
+          "enumDescriptions": [
+            "Stackdriver Logging API v2.",
+            "Stackdriver Logging API v1."
+          ]
+        },
+        "filter": {
+          "type": "string",
+          "description": "Required. An advanced logs filter which is used to match log entries. Example:\n\"resource.type=gae_app AND severity\u003e=ERROR\"\nThe maximum length of the filter is 20000 characters."
+        },
         "name": {
           "description": "Required. The client-assigned metric identifier. Examples: \"error_count\", \"nginx/requests\".Metric identifiers are limited to 100 characters and can include only the following characters: A-Z, a-z, 0-9, and the special characters _-.,+!*',()%/. The forward-slash character (/) denotes a hierarchy of name pieces, and it cannot be the first character of the name.The metric identifier in this field must not be URL-encoded (https://en.wikipedia.org/wiki/Percent-encoding). However, when the metric identifier appears as the [METRIC_ID] part of a metric_name API parameter, then the metric identifier must be URL-encoded. Example: \"projects/my-project/metrics/nginx%2Frequests\".",
           "type": "string"
         },
         "description": {
-          "type": "string",
-          "description": "Optional. A description of this metric, which is used in documentation."
-        },
-        "version": {
-          "type": "string",
-          "enumDescriptions": [
-            "Stackdriver Logging API v2.",
-            "Stackdriver Logging API v1."
-          ],
-          "enum": [
-            "V2",
-            "V1"
-          ],
-          "description": "Output only. The API version that created or updated this metric. The version also dictates the syntax of the filter expression. When a value for this field is missing, the default value of V2 should be assumed."
-        },
-        "filter": {
-          "type": "string",
-          "description": "Required. An advanced logs filter which is used to match log entries. Example:\n\"resource.type=gae_app AND severity\u003e=ERROR\"\nThe maximum length of the filter is 20000 characters."
+          "description": "Optional. A description of this metric, which is used in documentation.",
+          "type": "string"
         }
       },
       "id": "LogMetric"
@@ -740,10 +649,6 @@
       "description": "Additional information about a potentially long-running operation with which a log entry is associated.",
       "type": "object",
       "properties": {
-        "last": {
-          "type": "boolean",
-          "description": "Optional. Set this to True if this is the last log entry in the operation."
-        },
         "id": {
           "description": "Optional. An arbitrary operation identifier. Log entries with the same identifier are assumed to be part of the same operation.",
           "type": "string"
@@ -755,6 +660,10 @@
         "first": {
           "type": "boolean",
           "description": "Optional. Set this to True if this is the first log entry in the operation."
+        },
+        "last": {
+          "description": "Optional. Set this to True if this is the last log entry in the operation.",
+          "type": "boolean"
         }
       },
       "id": "LogEntryOperation"
@@ -764,6 +673,104 @@
       "type": "object",
       "properties": {},
       "id": "WriteLogEntriesResponse"
+    },
+    "MonitoredResource": {
+      "properties": {
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Required. Values for all of the labels listed in the associated monitored resource descriptor. For example, Cloud SQL databases use the labels \"database_id\" and \"zone\".",
+          "type": "object"
+        },
+        "type": {
+          "description": "Required. The monitored resource type. This field must match the type field of a MonitoredResourceDescriptor object. For example, the type of a Cloud SQL database is \"cloudsql_database\".",
+          "type": "string"
+        }
+      },
+      "id": "MonitoredResource",
+      "description": "An object representing a resource that can be used for monitoring, logging, billing, or other purposes. Examples include virtual machine instances, databases, and storage devices such as disks. The type field identifies a MonitoredResourceDescriptor object that describes the resource's schema. Information in the labels field identifies the actual resource and its attributes according to the schema. For example, a particular Compute Engine VM instance could be represented by the following object, because the MonitoredResourceDescriptor for \"gce_instance\" has labels \"instance_id\" and \"zone\":\n{ \"type\": \"gce_instance\",\n  \"labels\": { \"instance_id\": \"12345678901234\",\n              \"zone\": \"us-central1-a\" }}\n",
+      "type": "object"
+    },
+    "WriteLogEntriesRequest": {
+      "id": "WriteLogEntriesRequest",
+      "description": "The parameters to WriteLogEntries.",
+      "type": "object",
+      "properties": {
+        "logName": {
+          "description": "Optional. A default log resource name that is assigned to all log entries in entries that do not specify a value for log_name:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\" or \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
+          "type": "string"
+        },
+        "entries": {
+          "description": "Required. The log entries to write. Values supplied for the fields log_name, resource, and labels in this entries.write request are added to those log entries that do not provide their own values for the fields.To improve throughput and to avoid exceeding the quota limit for calls to entries.write, you should write multiple log entries at once rather than calling this method for each individual log entry.",
+          "type": "array",
+          "items": {
+            "$ref": "LogEntry"
+          }
+        },
+        "partialSuccess": {
+          "description": "Optional. Whether valid entries should be written even if some other entries fail due to INVALID_ARGUMENT or PERMISSION_DENIED errors. If any entry is not written, the response status will be the error associated with one of the failed entries and include error details in the form of WriteLogEntriesPartialErrors.",
+          "type": "boolean"
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional. Default labels that are added to the labels field of all log entries in entries. If a log entry already has a label with the same key as a label in this parameter, then the log entry's label is not changed. See LogEntry.",
+          "type": "object"
+        },
+        "resource": {
+          "$ref": "MonitoredResource",
+          "description": "Optional. A default monitored resource object that is assigned to all log entries in entries that do not specify a value for resource. Example:\n{ \"type\": \"gce_instance\",\n  \"labels\": {\n    \"zone\": \"us-central1-a\", \"instance_id\": \"00000000000000000000\" }}\nSee LogEntry."
+        }
+      }
+    },
+    "LogSink": {
+      "id": "LogSink",
+      "description": "Describes a sink used to export log entries to one of the following destinations in any project: a Cloud Storage bucket, a BigQuery dataset, or a Cloud Pub/Sub topic. A logs filter controls which log entries are exported. The sink must be created within a project or organization.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string",
+          "description": "Required. The client-assigned sink identifier, unique within the project. Example: \"my-syslog-errors-to-pubsub\". Sink identifiers are limited to 100 characters and can include only the following characters: upper and lower-case alphanumeric characters, underscores, hyphens, and periods."
+        },
+        "destination": {
+          "description": "Required. The export destination:\n\"storage.googleapis.com/[GCS_BUCKET]\"\n\"bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]\"\n\"pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]\"\nThe sink's writer_identity, set when the sink is created, must have permission to write to the destination or else the log entries are not exported. For more information, see Exporting Logs With Sinks.",
+          "type": "string"
+        },
+        "filter": {
+          "description": "Optional. An advanced logs filter. The only exported log entries are those that are in the resource owning the sink and that match the filter. The filter must use the log entry format specified by the output_version_format parameter. For example, in the v2 format:\nlogName=\"projects/[PROJECT_ID]/logs/[LOG_ID]\" AND severity\u003e=ERROR\n",
+          "type": "string"
+        },
+        "endTime": {
+          "description": "Optional. The time at which this sink will stop exporting log entries. Log entries are exported only if their timestamp is earlier than the end time. If this field is not supplied, there is no end time. If both a start time and an end time are provided, then the end time must be later than the start time.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "writerIdentity": {
+          "description": "Output only. An IAM identity&mdash;a service account or group&mdash;under which Stackdriver Logging writes the exported log entries to the sink's destination. This field is set by sinks.create and sinks.update, based on the setting of unique_writer_identity in those methods.Until you grant this identity write-access to the destination, log entry exports from this sink will fail. For more information, see Granting access for a resource. Consult the destination service's documentation to determine the appropriate IAM roles to assign to the identity.",
+          "type": "string"
+        },
+        "startTime": {
+          "description": "Optional. The time at which this sink will begin exporting log entries. Log entries are exported only if their timestamp is not earlier than the start time. The default value of this field is the time the sink is created or updated.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "outputVersionFormat": {
+          "enum": [
+            "VERSION_FORMAT_UNSPECIFIED",
+            "V2",
+            "V1"
+          ],
+          "description": "Optional. The log entry format to use for this sink's exported log entries. The v2 format is used by default. The v1 format is deprecated and should be used only as part of a migration effort to v2. See Migration to the v2 API.",
+          "type": "string",
+          "enumDescriptions": [
+            "An unspecified format version that will default to V2.",
+            "LogEntry version 2 format.",
+            "LogEntry version 1 format."
+          ]
+        }
+      }
     }
   },
   "icons": {
@@ -800,698 +807,22 @@
   "title": "Stackdriver Logging API",
   "ownerName": "Google",
   "resources": {
-    "entries": {
-      "methods": {
-        "list": {
-          "response": {
-            "$ref": "ListLogEntriesResponse"
-          },
-          "parameterOrder": [],
-          "httpMethod": "POST",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only",
-            "https://www.googleapis.com/auth/logging.admin",
-            "https://www.googleapis.com/auth/logging.read"
-          ],
-          "parameters": {},
-          "flatPath": "v2/entries:list",
-          "path": "v2/entries:list",
-          "id": "logging.entries.list",
-          "description": "Lists log entries. Use this method to retrieve log entries from Stackdriver Logging. For ways to export log entries, see Exporting Logs.",
-          "request": {
-            "$ref": "ListLogEntriesRequest"
-          }
-        },
-        "write": {
-          "flatPath": "v2/entries:write",
-          "path": "v2/entries:write",
-          "id": "logging.entries.write",
-          "description": "Writes log entries to Stackdriver Logging. All log entries are written by this method.",
-          "request": {
-            "$ref": "WriteLogEntriesRequest"
-          },
-          "response": {
-            "$ref": "WriteLogEntriesResponse"
-          },
-          "parameterOrder": [],
-          "httpMethod": "POST",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/logging.admin",
-            "https://www.googleapis.com/auth/logging.write"
-          ],
-          "parameters": {}
-        }
-      }
-    },
-    "projects": {
-      "resources": {
-        "logs": {
-          "methods": {
-            "delete": {
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "logName"
-              ],
-              "httpMethod": "DELETE",
-              "parameters": {
-                "logName": {
-                  "location": "path",
-                  "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/logs/[^/]+$"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "flatPath": "v2/projects/{projectsId}/logs/{logsId}",
-              "path": "v2/{+logName}",
-              "id": "logging.projects.logs.delete",
-              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries."
-            },
-            "list": {
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "parent"
-              ],
-              "response": {
-                "$ref": "ListLogsResponse"
-              },
-              "parameters": {
-                "pageToken": {
-                  "location": "query",
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "location": "query",
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32",
-                  "type": "integer"
-                },
-                "parent": {
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "flatPath": "v2/projects/{projectsId}/logs",
-              "id": "logging.projects.logs.list",
-              "path": "v2/{+parent}/logs",
-              "description": "Lists the logs in projects or organizations. Only logs that have entries are listed."
-            }
-          }
-        },
-        "sinks": {
-          "methods": {
-            "list": {
-              "description": "Lists sinks.",
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "parent"
-              ],
-              "response": {
-                "$ref": "ListSinksResponse"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "parameters": {
-                "parent": {
-                  "location": "path",
-                  "description": "Required. The parent resource whose sinks are to be listed. Examples: \"projects/my-logging-project\", \"organizations/123456789\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$"
-                },
-                "pageToken": {
-                  "type": "string",
-                  "location": "query",
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call."
-                },
-                "pageSize": {
-                  "type": "integer",
-                  "location": "query",
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32"
-                }
-              },
-              "flatPath": "v2/projects/{projectsId}/sinks",
-              "id": "logging.projects.sinks.list",
-              "path": "v2/{+parent}/sinks"
-            },
-            "get": {
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "sinkName"
-              ],
-              "response": {
-                "$ref": "LogSink"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "parameters": {
-                "sinkName": {
-                  "location": "path",
-                  "description": "Required. The parent resource name of the sink:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/sinks/[^/]+$"
-                }
-              },
-              "flatPath": "v2/projects/{projectsId}/sinks/{sinksId}",
-              "id": "logging.projects.sinks.get",
-              "path": "v2/{+sinkName}",
-              "description": "Gets a sink."
-            },
-            "update": {
-              "response": {
-                "$ref": "LogSink"
-              },
-              "parameterOrder": [
-                "sinkName"
-              ],
-              "httpMethod": "PUT",
-              "parameters": {
-                "sinkName": {
-                  "location": "path",
-                  "description": "Required. The full resource name of the sink to update, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/sinks/[^/]+$"
-                },
-                "uniqueWriterIdentity": {
-                  "location": "query",
-                  "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value was false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value was true and the new value is false.",
-                  "type": "boolean"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "flatPath": "v2/projects/{projectsId}/sinks/{sinksId}",
-              "path": "v2/{+sinkName}",
-              "id": "logging.projects.sinks.update",
-              "request": {
-                "$ref": "LogSink"
-              },
-              "description": "Updates a sink. If the named sink doesn't exist, then this method is identical to sinks.create. If the named sink does exist, then this method replaces the following fields in the existing sink with values from the new sink: destination, filter, output_version_format, start_time, and end_time. The updated filter might also have a new writer_identity; see the unique_writer_identity field."
-            },
-            "create": {
-              "request": {
-                "$ref": "LogSink"
-              },
-              "description": "Creates a sink that exports specified log entries to a destination. The export of newly-ingested log entries begins immediately, unless the current time is outside the sink's start and end times or the sink's writer_identity is not permitted to write to the destination. A sink can export log entries only from the resource owning the sink.",
-              "response": {
-                "$ref": "LogSink"
-              },
-              "parameterOrder": [
-                "parent"
-              ],
-              "httpMethod": "POST",
-              "parameters": {
-                "parent": {
-                  "location": "path",
-                  "description": "Required. The resource in which to create the sink:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\nExamples: \"projects/my-logging-project\", \"organizations/123456789\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$"
-                },
-                "uniqueWriterIdentity": {
-                  "location": "query",
-                  "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@google.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
-                  "type": "boolean"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "flatPath": "v2/projects/{projectsId}/sinks",
-              "path": "v2/{+parent}/sinks",
-              "id": "logging.projects.sinks.create"
-            },
-            "delete": {
-              "description": "Deletes a sink. If the sink has a unique writer_identity, then that service account is also deleted.",
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "sinkName"
-              ],
-              "httpMethod": "DELETE",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "parameters": {
-                "sinkName": {
-                  "location": "path",
-                  "description": "Required. The full resource name of the sink to delete, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nIt is an error if the sink does not exist. Example: \"projects/my-project-id/sinks/my-sink-id\". It is an error if the sink does not exist.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/sinks/[^/]+$"
-                }
-              },
-              "flatPath": "v2/projects/{projectsId}/sinks/{sinksId}",
-              "path": "v2/{+sinkName}",
-              "id": "logging.projects.sinks.delete"
-            }
-          }
-        },
-        "metrics": {
-          "methods": {
-            "delete": {
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "metricName"
-              ],
-              "httpMethod": "DELETE",
-              "parameters": {
-                "metricName": {
-                  "location": "path",
-                  "description": "The resource name of the metric to delete:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\n",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/metrics/[^/]+$"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.write"
-              ],
-              "flatPath": "v2/projects/{projectsId}/metrics/{metricsId}",
-              "path": "v2/{+metricName}",
-              "id": "logging.projects.metrics.delete",
-              "description": "Deletes a logs-based metric."
-            },
-            "list": {
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "parent"
-              ],
-              "response": {
-                "$ref": "ListLogMetricsResponse"
-              },
-              "parameters": {
-                "pageToken": {
-                  "location": "query",
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "location": "query",
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32",
-                  "type": "integer"
-                },
-                "parent": {
-                  "location": "path",
-                  "description": "Required. The name of the project containing the metrics:\n\"projects/[PROJECT_ID]\"\n",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "flatPath": "v2/projects/{projectsId}/metrics",
-              "id": "logging.projects.metrics.list",
-              "path": "v2/{+parent}/metrics",
-              "description": "Lists logs-based metrics."
-            },
-            "get": {
-              "description": "Gets a logs-based metric.",
-              "response": {
-                "$ref": "LogMetric"
-              },
-              "parameterOrder": [
-                "metricName"
-              ],
-              "httpMethod": "GET",
-              "parameters": {
-                "metricName": {
-                  "location": "path",
-                  "description": "The resource name of the desired metric:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\n",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/metrics/[^/]+$"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "flatPath": "v2/projects/{projectsId}/metrics/{metricsId}",
-              "path": "v2/{+metricName}",
-              "id": "logging.projects.metrics.get"
-            },
-            "update": {
-              "request": {
-                "$ref": "LogMetric"
-              },
-              "description": "Creates or updates a logs-based metric.",
-              "httpMethod": "PUT",
-              "parameterOrder": [
-                "metricName"
-              ],
-              "response": {
-                "$ref": "LogMetric"
-              },
-              "parameters": {
-                "metricName": {
-                  "location": "path",
-                  "description": "The resource name of the metric to update:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\nThe updated metric must be provided in the request and it's name field must be the same as [METRIC_ID] If the metric does not exist in [PROJECT_ID], then a new metric is created.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/metrics/[^/]+$"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.write"
-              ],
-              "flatPath": "v2/projects/{projectsId}/metrics/{metricsId}",
-              "id": "logging.projects.metrics.update",
-              "path": "v2/{+metricName}"
-            },
-            "create": {
-              "httpMethod": "POST",
-              "parameterOrder": [
-                "parent"
-              ],
-              "response": {
-                "$ref": "LogMetric"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.write"
-              ],
-              "parameters": {
-                "parent": {
-                  "location": "path",
-                  "description": "The resource name of the project in which to create the metric:\n\"projects/[PROJECT_ID]\"\nThe new metric must be provided in the request.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$"
-                }
-              },
-              "flatPath": "v2/projects/{projectsId}/metrics",
-              "id": "logging.projects.metrics.create",
-              "path": "v2/{+parent}/metrics",
-              "description": "Creates a logs-based metric.",
-              "request": {
-                "$ref": "LogMetric"
-              }
-            }
-          }
-        }
-      }
-    },
-    "billingAccounts": {
-      "resources": {
-        "logs": {
-          "methods": {
-            "delete": {
-              "flatPath": "v2/billingAccounts/{billingAccountsId}/logs/{logsId}",
-              "path": "v2/{+logName}",
-              "id": "logging.billingAccounts.logs.delete",
-              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "logName"
-              ],
-              "httpMethod": "DELETE",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "parameters": {
-                "logName": {
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^billingAccounts/[^/]+/logs/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry."
-                }
-              }
-            },
-            "list": {
-              "flatPath": "v2/billingAccounts/{billingAccountsId}/logs",
-              "path": "v2/{+parent}/logs",
-              "id": "logging.billingAccounts.logs.list",
-              "description": "Lists the logs in projects or organizations. Only logs that have entries are listed.",
-              "response": {
-                "$ref": "ListLogsResponse"
-              },
-              "parameterOrder": [
-                "parent"
-              ],
-              "httpMethod": "GET",
-              "parameters": {
-                "pageToken": {
-                  "type": "string",
-                  "location": "query",
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call."
-                },
-                "pageSize": {
-                  "type": "integer",
-                  "location": "query",
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32"
-                },
-                "parent": {
-                  "location": "path",
-                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^billingAccounts/[^/]+$"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ]
-            }
-          }
-        },
-        "sinks": {
-          "methods": {
-            "delete": {
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "sinkName"
-              ],
-              "httpMethod": "DELETE",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "parameters": {
-                "sinkName": {
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^billingAccounts/[^/]+/sinks/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The full resource name of the sink to delete, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nIt is an error if the sink does not exist. Example: \"projects/my-project-id/sinks/my-sink-id\". It is an error if the sink does not exist."
-                }
-              },
-              "flatPath": "v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}",
-              "path": "v2/{+sinkName}",
-              "id": "logging.billingAccounts.sinks.delete",
-              "description": "Deletes a sink. If the sink has a unique writer_identity, then that service account is also deleted."
-            },
-            "list": {
-              "flatPath": "v2/billingAccounts/{billingAccountsId}/sinks",
-              "id": "logging.billingAccounts.sinks.list",
-              "path": "v2/{+parent}/sinks",
-              "description": "Lists sinks.",
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "parent"
-              ],
-              "response": {
-                "$ref": "ListSinksResponse"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "parameters": {
-                "parent": {
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^billingAccounts/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The parent resource whose sinks are to be listed. Examples: \"projects/my-logging-project\", \"organizations/123456789\"."
-                },
-                "pageToken": {
-                  "type": "string",
-                  "location": "query",
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call."
-                },
-                "pageSize": {
-                  "type": "integer",
-                  "location": "query",
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32"
-                }
-              }
-            },
-            "get": {
-              "flatPath": "v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}",
-              "path": "v2/{+sinkName}",
-              "id": "logging.billingAccounts.sinks.get",
-              "description": "Gets a sink.",
-              "response": {
-                "$ref": "LogSink"
-              },
-              "parameterOrder": [
-                "sinkName"
-              ],
-              "httpMethod": "GET",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "parameters": {
-                "sinkName": {
-                  "location": "path",
-                  "description": "Required. The parent resource name of the sink:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^billingAccounts/[^/]+/sinks/[^/]+$"
-                }
-              }
-            },
-            "update": {
-              "request": {
-                "$ref": "LogSink"
-              },
-              "description": "Updates a sink. If the named sink doesn't exist, then this method is identical to sinks.create. If the named sink does exist, then this method replaces the following fields in the existing sink with values from the new sink: destination, filter, output_version_format, start_time, and end_time. The updated filter might also have a new writer_identity; see the unique_writer_identity field.",
-              "httpMethod": "PUT",
-              "parameterOrder": [
-                "sinkName"
-              ],
-              "response": {
-                "$ref": "LogSink"
-              },
-              "parameters": {
-                "sinkName": {
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^billingAccounts/[^/]+/sinks/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The full resource name of the sink to update, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\"."
-                },
-                "uniqueWriterIdentity": {
-                  "location": "query",
-                  "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value was false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value was true and the new value is false.",
-                  "type": "boolean"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "flatPath": "v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}",
-              "id": "logging.billingAccounts.sinks.update",
-              "path": "v2/{+sinkName}"
-            },
-            "create": {
-              "flatPath": "v2/billingAccounts/{billingAccountsId}/sinks",
-              "path": "v2/{+parent}/sinks",
-              "id": "logging.billingAccounts.sinks.create",
-              "description": "Creates a sink that exports specified log entries to a destination. The export of newly-ingested log entries begins immediately, unless the current time is outside the sink's start and end times or the sink's writer_identity is not permitted to write to the destination. A sink can export log entries only from the resource owning the sink.",
-              "request": {
-                "$ref": "LogSink"
-              },
-              "response": {
-                "$ref": "LogSink"
-              },
-              "parameterOrder": [
-                "parent"
-              ],
-              "httpMethod": "POST",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "parameters": {
-                "parent": {
-                  "location": "path",
-                  "description": "Required. The resource in which to create the sink:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\nExamples: \"projects/my-logging-project\", \"organizations/123456789\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^billingAccounts/[^/]+$"
-                },
-                "uniqueWriterIdentity": {
-                  "location": "query",
-                  "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@google.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
-                  "type": "boolean"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
     "folders": {
       "resources": {
         "logs": {
           "methods": {
             "delete": {
-              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
+              "httpMethod": "DELETE",
               "response": {
                 "$ref": "Empty"
               },
               "parameterOrder": [
                 "logName"
               ],
-              "httpMethod": "DELETE",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
               "parameters": {
                 "logName": {
                   "location": "path",
@@ -1501,18 +832,12 @@
                   "pattern": "^folders/[^/]+/logs/[^/]+$"
                 }
               },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
               "flatPath": "v2/folders/{foldersId}/logs/{logsId}",
+              "id": "logging.folders.logs.delete",
               "path": "v2/{+logName}",
-              "id": "logging.folders.logs.delete"
+              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted."
             },
             "list": {
-              "flatPath": "v2/folders/{foldersId}/logs",
-              "id": "logging.folders.logs.list",
-              "path": "v2/{+parent}/logs",
               "description": "Lists the logs in projects or organizations. Only logs that have entries are listed.",
               "httpMethod": "GET",
               "parameterOrder": [
@@ -1521,90 +846,110 @@
               "response": {
                 "$ref": "ListLogsResponse"
               },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
               "parameters": {
-                "pageToken": {
+                "parent": {
+                  "location": "path",
+                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n",
+                  "required": true,
                   "type": "string",
+                  "pattern": "^folders/[^/]+$"
+                },
+                "pageToken": {
                   "location": "query",
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call."
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+                  "type": "string"
                 },
                 "pageSize": {
                   "type": "integer",
                   "location": "query",
                   "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
                   "format": "int32"
-                },
-                "parent": {
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^folders/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n"
                 }
-              }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "flatPath": "v2/folders/{foldersId}/logs",
+              "id": "logging.folders.logs.list",
+              "path": "v2/{+parent}/logs"
             }
           }
         },
         "sinks": {
           "methods": {
-            "delete": {
-              "description": "Deletes a sink. If the sink has a unique writer_identity, then that service account is also deleted.",
-              "httpMethod": "DELETE",
+            "create": {
+              "request": {
+                "$ref": "LogSink"
+              },
+              "description": "Creates a sink that exports specified log entries to a destination. The export of newly-ingested log entries begins immediately, unless the current time is outside the sink's start and end times or the sink's writer_identity is not permitted to write to the destination. A sink can export log entries only from the resource owning the sink.",
+              "httpMethod": "POST",
               "parameterOrder": [
-                "sinkName"
+                "parent"
               ],
               "response": {
-                "$ref": "Empty"
+                "$ref": "LogSink"
               },
               "parameters": {
-                "sinkName": {
+                "parent": {
+                  "description": "Required. The resource in which to create the sink:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\nExamples: \"projects/my-logging-project\", \"organizations/123456789\".",
                   "required": true,
                   "type": "string",
-                  "pattern": "^folders/[^/]+/sinks/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The full resource name of the sink to delete, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nIt is an error if the sink does not exist. Example: \"projects/my-project-id/sinks/my-sink-id\". It is an error if the sink does not exist."
+                  "pattern": "^folders/[^/]+$",
+                  "location": "path"
+                },
+                "uniqueWriterIdentity": {
+                  "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@system.gserviceaccount.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
+                  "type": "boolean",
+                  "location": "query"
                 }
               },
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/logging.admin"
               ],
+              "flatPath": "v2/folders/{foldersId}/sinks",
+              "id": "logging.folders.sinks.create",
+              "path": "v2/{+parent}/sinks"
+            },
+            "delete": {
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "sinkName"
+              ],
+              "httpMethod": "DELETE",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "sinkName": {
+                  "pattern": "^folders/[^/]+/sinks/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The full resource name of the sink to delete, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nIt is an error if the sink does not exist. Example: \"projects/my-project-id/sinks/my-sink-id\". It is an error if the sink does not exist.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
               "flatPath": "v2/folders/{foldersId}/sinks/{sinksId}",
+              "path": "v2/{+sinkName}",
               "id": "logging.folders.sinks.delete",
-              "path": "v2/{+sinkName}"
+              "description": "Deletes a sink. If the sink has a unique writer_identity, then that service account is also deleted."
             },
             "list": {
-              "response": {
-                "$ref": "ListSinksResponse"
-              },
+              "id": "logging.folders.sinks.list",
+              "path": "v2/{+parent}/sinks",
+              "description": "Lists sinks.",
+              "httpMethod": "GET",
               "parameterOrder": [
                 "parent"
               ],
-              "httpMethod": "GET",
-              "parameters": {
-                "pageToken": {
-                  "type": "string",
-                  "location": "query",
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call."
-                },
-                "pageSize": {
-                  "type": "integer",
-                  "location": "query",
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32"
-                },
-                "parent": {
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^folders/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The parent resource whose sinks are to be listed. Examples: \"projects/my-logging-project\", \"organizations/123456789\"."
-                }
+              "response": {
+                "$ref": "ListSinksResponse"
               },
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
@@ -1612,10 +957,27 @@
                 "https://www.googleapis.com/auth/logging.admin",
                 "https://www.googleapis.com/auth/logging.read"
               ],
-              "flatPath": "v2/folders/{foldersId}/sinks",
-              "path": "v2/{+parent}/sinks",
-              "id": "logging.folders.sinks.list",
-              "description": "Lists sinks."
+              "parameters": {
+                "pageSize": {
+                  "location": "query",
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "parent": {
+                  "description": "Required. The parent resource whose sinks are to be listed. Examples: \"projects/my-logging-project\", \"organizations/123456789\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^folders/[^/]+$",
+                  "location": "path"
+                },
+                "pageToken": {
+                  "type": "string",
+                  "location": "query",
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call."
+                }
+              },
+              "flatPath": "v2/folders/{foldersId}/sinks"
             },
             "get": {
               "flatPath": "v2/folders/{foldersId}/sinks/{sinksId}",
@@ -1646,9 +1008,6 @@
               ]
             },
             "update": {
-              "flatPath": "v2/folders/{foldersId}/sinks/{sinksId}",
-              "path": "v2/{+sinkName}",
-              "id": "logging.folders.sinks.update",
               "request": {
                 "$ref": "LogSink"
               },
@@ -1662,11 +1021,11 @@
               "httpMethod": "PUT",
               "parameters": {
                 "sinkName": {
+                  "description": "Required. The full resource name of the sink to update, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
                   "required": true,
                   "type": "string",
                   "pattern": "^folders/[^/]+/sinks/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The full resource name of the sink to update, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\"."
+                  "location": "path"
                 },
                 "uniqueWriterIdentity": {
                   "location": "query",
@@ -1677,41 +1036,10 @@
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/logging.admin"
-              ]
-            },
-            "create": {
-              "httpMethod": "POST",
-              "parameterOrder": [
-                "parent"
               ],
-              "response": {
-                "$ref": "LogSink"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "parameters": {
-                "parent": {
-                  "location": "path",
-                  "description": "Required. The resource in which to create the sink:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\nExamples: \"projects/my-logging-project\", \"organizations/123456789\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^folders/[^/]+$"
-                },
-                "uniqueWriterIdentity": {
-                  "type": "boolean",
-                  "location": "query",
-                  "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@google.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink."
-                }
-              },
-              "flatPath": "v2/folders/{foldersId}/sinks",
-              "id": "logging.folders.sinks.create",
-              "path": "v2/{+parent}/sinks",
-              "description": "Creates a sink that exports specified log entries to a destination. The export of newly-ingested log entries begins immediately, unless the current time is outside the sink's start and end times or the sink's writer_identity is not permitted to write to the destination. A sink can export log entries only from the resource owning the sink.",
-              "request": {
-                "$ref": "LogSink"
-              }
+              "flatPath": "v2/folders/{foldersId}/sinks/{sinksId}",
+              "path": "v2/{+sinkName}",
+              "id": "logging.folders.sinks.update"
             }
           }
         }
@@ -1720,34 +1048,34 @@
     "monitoredResourceDescriptors": {
       "methods": {
         "list": {
+          "path": "v2/monitoredResourceDescriptors",
+          "id": "logging.monitoredResourceDescriptors.list",
           "description": "Lists the descriptors for monitored resource types used by Stackdriver Logging.",
+          "parameterOrder": [],
           "response": {
             "$ref": "ListMonitoredResourceDescriptorsResponse"
           },
-          "parameterOrder": [],
           "httpMethod": "GET",
-          "parameters": {
-            "pageToken": {
-              "type": "string",
-              "location": "query",
-              "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call."
-            },
-            "pageSize": {
-              "type": "integer",
-              "location": "query",
-              "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-              "format": "int32"
-            }
-          },
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/cloud-platform.read-only",
             "https://www.googleapis.com/auth/logging.admin",
             "https://www.googleapis.com/auth/logging.read"
           ],
-          "flatPath": "v2/monitoredResourceDescriptors",
-          "path": "v2/monitoredResourceDescriptors",
-          "id": "logging.monitoredResourceDescriptors.list"
+          "parameters": {
+            "pageToken": {
+              "location": "query",
+              "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+              "type": "string"
+            },
+            "pageSize": {
+              "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+              "format": "int32",
+              "type": "integer",
+              "location": "query"
+            }
+          },
+          "flatPath": "v2/monitoredResourceDescriptors"
         }
       }
     },
@@ -1755,70 +1083,70 @@
       "resources": {
         "logs": {
           "methods": {
+            "delete": {
+              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted.",
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "logName"
+              ],
+              "httpMethod": "DELETE",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "logName": {
+                  "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^organizations/[^/]+/logs/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v2/organizations/{organizationsId}/logs/{logsId}",
+              "path": "v2/{+logName}",
+              "id": "logging.organizations.logs.delete"
+            },
             "list": {
-              "flatPath": "v2/organizations/{organizationsId}/logs",
-              "id": "logging.organizations.logs.list",
-              "path": "v2/{+parent}/logs",
-              "description": "Lists the logs in projects or organizations. Only logs that have entries are listed.",
-              "httpMethod": "GET",
               "parameterOrder": [
                 "parent"
               ],
               "response": {
                 "$ref": "ListLogsResponse"
               },
+              "httpMethod": "GET",
+              "parameters": {
+                "parent": {
+                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^organizations/[^/]+$",
+                  "location": "path"
+                },
+                "pageToken": {
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32",
+                  "type": "integer"
+                }
+              },
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/cloud-platform.read-only",
                 "https://www.googleapis.com/auth/logging.admin",
                 "https://www.googleapis.com/auth/logging.read"
               ],
-              "parameters": {
-                "pageToken": {
-                  "type": "string",
-                  "location": "query",
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call."
-                },
-                "pageSize": {
-                  "type": "integer",
-                  "location": "query",
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32"
-                },
-                "parent": {
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^organizations/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n"
-                }
-              }
-            },
-            "delete": {
-              "flatPath": "v2/organizations/{organizationsId}/logs/{logsId}",
-              "id": "logging.organizations.logs.delete",
-              "path": "v2/{+logName}",
-              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
-              "httpMethod": "DELETE",
-              "parameterOrder": [
-                "logName"
-              ],
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameters": {
-                "logName": {
-                  "location": "path",
-                  "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^organizations/[^/]+/logs/[^/]+$"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ]
+              "flatPath": "v2/organizations/{organizationsId}/logs",
+              "path": "v2/{+parent}/logs",
+              "id": "logging.organizations.logs.list",
+              "description": "Lists the logs in projects or organizations. Only logs that have entries are listed."
             }
           }
         },
@@ -1828,57 +1156,49 @@
               "response": {
                 "$ref": "ListSinksResponse"
               },
+              "httpMethod": "GET",
               "parameterOrder": [
                 "parent"
               ],
-              "httpMethod": "GET",
+              "parameters": {
+                "pageSize": {
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                },
+                "parent": {
+                  "pattern": "^organizations/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The parent resource whose sinks are to be listed. Examples: \"projects/my-logging-project\", \"organizations/123456789\".",
+                  "required": true,
+                  "type": "string"
+                },
+                "pageToken": {
+                  "location": "query",
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+                  "type": "string"
+                }
+              },
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/cloud-platform.read-only",
                 "https://www.googleapis.com/auth/logging.admin",
                 "https://www.googleapis.com/auth/logging.read"
               ],
-              "parameters": {
-                "parent": {
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^organizations/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The parent resource whose sinks are to be listed. Examples: \"projects/my-logging-project\", \"organizations/123456789\"."
-                },
-                "pageToken": {
-                  "location": "query",
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "type": "integer",
-                  "location": "query",
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32"
-                }
-              },
               "flatPath": "v2/organizations/{organizationsId}/sinks",
               "path": "v2/{+parent}/sinks",
               "id": "logging.organizations.sinks.list",
               "description": "Lists sinks."
             },
             "get": {
-              "response": {
-                "$ref": "LogSink"
-              },
+              "description": "Gets a sink.",
+              "httpMethod": "GET",
               "parameterOrder": [
                 "sinkName"
               ],
-              "httpMethod": "GET",
-              "parameters": {
-                "sinkName": {
-                  "location": "path",
-                  "description": "Required. The parent resource name of the sink:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^organizations/[^/]+/sinks/[^/]+$"
-                }
+              "response": {
+                "$ref": "LogSink"
               },
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
@@ -1886,50 +1206,54 @@
                 "https://www.googleapis.com/auth/logging.admin",
                 "https://www.googleapis.com/auth/logging.read"
               ],
-              "flatPath": "v2/organizations/{organizationsId}/sinks/{sinksId}",
-              "path": "v2/{+sinkName}",
-              "id": "logging.organizations.sinks.get",
-              "description": "Gets a sink."
-            },
-            "update": {
-              "request": {
-                "$ref": "LogSink"
-              },
-              "description": "Updates a sink. If the named sink doesn't exist, then this method is identical to sinks.create. If the named sink does exist, then this method replaces the following fields in the existing sink with values from the new sink: destination, filter, output_version_format, start_time, and end_time. The updated filter might also have a new writer_identity; see the unique_writer_identity field.",
-              "response": {
-                "$ref": "LogSink"
-              },
-              "parameterOrder": [
-                "sinkName"
-              ],
-              "httpMethod": "PUT",
               "parameters": {
                 "sinkName": {
+                  "pattern": "^organizations/[^/]+/sinks/[^/]+$",
                   "location": "path",
-                  "description": "Required. The full resource name of the sink to update, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
+                  "description": "Required. The parent resource name of the sink:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
                   "required": true,
-                  "type": "string",
-                  "pattern": "^organizations/[^/]+/sinks/[^/]+$"
-                },
-                "uniqueWriterIdentity": {
-                  "type": "boolean",
-                  "location": "query",
-                  "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value was false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value was true and the new value is false."
+                  "type": "string"
                 }
               },
+              "flatPath": "v2/organizations/{organizationsId}/sinks/{sinksId}",
+              "id": "logging.organizations.sinks.get",
+              "path": "v2/{+sinkName}"
+            },
+            "update": {
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/logging.admin"
               ],
+              "parameters": {
+                "sinkName": {
+                  "description": "Required. The full resource name of the sink to update, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^organizations/[^/]+/sinks/[^/]+$",
+                  "location": "path"
+                },
+                "uniqueWriterIdentity": {
+                  "location": "query",
+                  "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value was false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value was true and the new value is false.",
+                  "type": "boolean"
+                }
+              },
               "flatPath": "v2/organizations/{organizationsId}/sinks/{sinksId}",
+              "id": "logging.organizations.sinks.update",
               "path": "v2/{+sinkName}",
-              "id": "logging.organizations.sinks.update"
-            },
-            "create": {
+              "description": "Updates a sink. If the named sink doesn't exist, then this method is identical to sinks.create. If the named sink does exist, then this method replaces the following fields in the existing sink with values from the new sink: destination, filter, output_version_format, start_time, and end_time. The updated filter might also have a new writer_identity; see the unique_writer_identity field.",
               "request": {
                 "$ref": "LogSink"
               },
-              "description": "Creates a sink that exports specified log entries to a destination. The export of newly-ingested log entries begins immediately, unless the current time is outside the sink's start and end times or the sink's writer_identity is not permitted to write to the destination. A sink can export log entries only from the resource owning the sink.",
+              "httpMethod": "PUT",
+              "parameterOrder": [
+                "sinkName"
+              ],
+              "response": {
+                "$ref": "LogSink"
+              }
+            },
+            "create": {
               "response": {
                 "$ref": "LogSink"
               },
@@ -1939,16 +1263,16 @@
               "httpMethod": "POST",
               "parameters": {
                 "parent": {
-                  "location": "path",
                   "description": "Required. The resource in which to create the sink:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\nExamples: \"projects/my-logging-project\", \"organizations/123456789\".",
                   "required": true,
                   "type": "string",
-                  "pattern": "^organizations/[^/]+$"
+                  "pattern": "^organizations/[^/]+$",
+                  "location": "path"
                 },
                 "uniqueWriterIdentity": {
+                  "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@system.gserviceaccount.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
                   "type": "boolean",
-                  "location": "query",
-                  "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@google.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink."
+                  "location": "query"
                 }
               },
               "scopes": [
@@ -1957,13 +1281,13 @@
               ],
               "flatPath": "v2/organizations/{organizationsId}/sinks",
               "path": "v2/{+parent}/sinks",
-              "id": "logging.organizations.sinks.create"
+              "id": "logging.organizations.sinks.create",
+              "request": {
+                "$ref": "LogSink"
+              },
+              "description": "Creates a sink that exports specified log entries to a destination. The export of newly-ingested log entries begins immediately, unless the current time is outside the sink's start and end times or the sink's writer_identity is not permitted to write to the destination. A sink can export log entries only from the resource owning the sink."
             },
             "delete": {
-              "flatPath": "v2/organizations/{organizationsId}/sinks/{sinksId}",
-              "path": "v2/{+sinkName}",
-              "id": "logging.organizations.sinks.delete",
-              "description": "Deletes a sink. If the sink has a unique writer_identity, then that service account is also deleted.",
               "response": {
                 "$ref": "Empty"
               },
@@ -1983,60 +1307,716 @@
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "flatPath": "v2/organizations/{organizationsId}/sinks/{sinksId}",
+              "path": "v2/{+sinkName}",
+              "id": "logging.organizations.sinks.delete",
+              "description": "Deletes a sink. If the sink has a unique writer_identity, then that service account is also deleted."
+            }
+          }
+        }
+      }
+    },
+    "entries": {
+      "methods": {
+        "list": {
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "ListLogEntriesResponse"
+          },
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only",
+            "https://www.googleapis.com/auth/logging.admin",
+            "https://www.googleapis.com/auth/logging.read"
+          ],
+          "flatPath": "v2/entries:list",
+          "id": "logging.entries.list",
+          "path": "v2/entries:list",
+          "request": {
+            "$ref": "ListLogEntriesRequest"
+          },
+          "description": "Lists log entries. Use this method to retrieve log entries from Stackdriver Logging. For ways to export log entries, see Exporting Logs."
+        },
+        "write": {
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/logging.admin",
+            "https://www.googleapis.com/auth/logging.write"
+          ],
+          "parameters": {},
+          "flatPath": "v2/entries:write",
+          "path": "v2/entries:write",
+          "id": "logging.entries.write",
+          "description": "Writes log entries to Stackdriver Logging. All log entries are written by this method.",
+          "request": {
+            "$ref": "WriteLogEntriesRequest"
+          },
+          "response": {
+            "$ref": "WriteLogEntriesResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST"
+        }
+      }
+    },
+    "projects": {
+      "resources": {
+        "logs": {
+          "methods": {
+            "delete": {
+              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted.",
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "logName"
+              ],
+              "httpMethod": "DELETE",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "logName": {
+                  "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/logs/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v2/projects/{projectsId}/logs/{logsId}",
+              "path": "v2/{+logName}",
+              "id": "logging.projects.logs.delete"
+            },
+            "list": {
+              "description": "Lists the logs in projects or organizations. Only logs that have entries are listed.",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "parent"
+              ],
+              "response": {
+                "$ref": "ListLogsResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "parameters": {
+                "pageToken": {
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                },
+                "parent": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n"
+                }
+              },
+              "flatPath": "v2/projects/{projectsId}/logs",
+              "id": "logging.projects.logs.list",
+              "path": "v2/{+parent}/logs"
+            }
+          }
+        },
+        "sinks": {
+          "methods": {
+            "list": {
+              "description": "Lists sinks.",
+              "response": {
+                "$ref": "ListSinksResponse"
+              },
+              "parameterOrder": [
+                "parent"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "parameters": {
+                "parent": {
+                  "location": "path",
+                  "description": "Required. The parent resource whose sinks are to be listed. Examples: \"projects/my-logging-project\", \"organizations/123456789\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                },
+                "pageToken": {
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32",
+                  "type": "integer"
+                }
+              },
+              "flatPath": "v2/projects/{projectsId}/sinks",
+              "path": "v2/{+parent}/sinks",
+              "id": "logging.projects.sinks.list"
+            },
+            "get": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "sinkName"
+              ],
+              "response": {
+                "$ref": "LogSink"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "parameters": {
+                "sinkName": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/sinks/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The parent resource name of the sink:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\"."
+                }
+              },
+              "flatPath": "v2/projects/{projectsId}/sinks/{sinksId}",
+              "id": "logging.projects.sinks.get",
+              "path": "v2/{+sinkName}",
+              "description": "Gets a sink."
+            },
+            "update": {
+              "description": "Updates a sink. If the named sink doesn't exist, then this method is identical to sinks.create. If the named sink does exist, then this method replaces the following fields in the existing sink with values from the new sink: destination, filter, output_version_format, start_time, and end_time. The updated filter might also have a new writer_identity; see the unique_writer_identity field.",
+              "request": {
+                "$ref": "LogSink"
+              },
+              "response": {
+                "$ref": "LogSink"
+              },
+              "parameterOrder": [
+                "sinkName"
+              ],
+              "httpMethod": "PUT",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "sinkName": {
+                  "location": "path",
+                  "description": "Required. The full resource name of the sink to update, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/sinks/[^/]+$"
+                },
+                "uniqueWriterIdentity": {
+                  "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value was false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value was true and the new value is false.",
+                  "type": "boolean",
+                  "location": "query"
+                }
+              },
+              "flatPath": "v2/projects/{projectsId}/sinks/{sinksId}",
+              "path": "v2/{+sinkName}",
+              "id": "logging.projects.sinks.update"
+            },
+            "create": {
+              "response": {
+                "$ref": "LogSink"
+              },
+              "parameterOrder": [
+                "parent"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "parent": {
+                  "location": "path",
+                  "description": "Required. The resource in which to create the sink:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\nExamples: \"projects/my-logging-project\", \"organizations/123456789\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                },
+                "uniqueWriterIdentity": {
+                  "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@system.gserviceaccount.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
+                  "type": "boolean",
+                  "location": "query"
+                }
+              },
+              "flatPath": "v2/projects/{projectsId}/sinks",
+              "path": "v2/{+parent}/sinks",
+              "id": "logging.projects.sinks.create",
+              "description": "Creates a sink that exports specified log entries to a destination. The export of newly-ingested log entries begins immediately, unless the current time is outside the sink's start and end times or the sink's writer_identity is not permitted to write to the destination. A sink can export log entries only from the resource owning the sink.",
+              "request": {
+                "$ref": "LogSink"
+              }
+            },
+            "delete": {
+              "description": "Deletes a sink. If the sink has a unique writer_identity, then that service account is also deleted.",
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "sinkName"
+              ],
+              "httpMethod": "DELETE",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "sinkName": {
+                  "description": "Required. The full resource name of the sink to delete, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nIt is an error if the sink does not exist. Example: \"projects/my-project-id/sinks/my-sink-id\". It is an error if the sink does not exist.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/sinks/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v2/projects/{projectsId}/sinks/{sinksId}",
+              "path": "v2/{+sinkName}",
+              "id": "logging.projects.sinks.delete"
+            }
+          }
+        },
+        "metrics": {
+          "methods": {
+            "list": {
+              "parameterOrder": [
+                "parent"
+              ],
+              "response": {
+                "$ref": "ListLogMetricsResponse"
+              },
+              "httpMethod": "GET",
+              "parameters": {
+                "parent": {
+                  "location": "path",
+                  "description": "Required. The name of the project containing the metrics:\n\"projects/[PROJECT_ID]\"\n",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                },
+                "pageToken": {
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "type": "integer",
+                  "location": "query",
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "flatPath": "v2/projects/{projectsId}/metrics",
+              "path": "v2/{+parent}/metrics",
+              "id": "logging.projects.metrics.list",
+              "description": "Lists logs-based metrics."
+            },
+            "get": {
+              "description": "Gets a logs-based metric.",
+              "response": {
+                "$ref": "LogMetric"
+              },
+              "parameterOrder": [
+                "metricName"
+              ],
+              "httpMethod": "GET",
+              "parameters": {
+                "metricName": {
+                  "pattern": "^projects/[^/]+/metrics/[^/]+$",
+                  "location": "path",
+                  "description": "The resource name of the desired metric:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\n",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "flatPath": "v2/projects/{projectsId}/metrics/{metricsId}",
+              "path": "v2/{+metricName}",
+              "id": "logging.projects.metrics.get"
+            },
+            "update": {
+              "request": {
+                "$ref": "LogMetric"
+              },
+              "description": "Creates or updates a logs-based metric.",
+              "response": {
+                "$ref": "LogMetric"
+              },
+              "parameterOrder": [
+                "metricName"
+              ],
+              "httpMethod": "PUT",
+              "parameters": {
+                "metricName": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/metrics/[^/]+$",
+                  "location": "path",
+                  "description": "The resource name of the metric to update:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\nThe updated metric must be provided in the request and it's name field must be the same as [METRIC_ID] If the metric does not exist in [PROJECT_ID], then a new metric is created."
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.write"
+              ],
+              "flatPath": "v2/projects/{projectsId}/metrics/{metricsId}",
+              "path": "v2/{+metricName}",
+              "id": "logging.projects.metrics.update"
+            },
+            "create": {
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "parent"
+              ],
+              "response": {
+                "$ref": "LogMetric"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.write"
+              ],
+              "parameters": {
+                "parent": {
+                  "description": "The resource name of the project in which to create the metric:\n\"projects/[PROJECT_ID]\"\nThe new metric must be provided in the request.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v2/projects/{projectsId}/metrics",
+              "id": "logging.projects.metrics.create",
+              "path": "v2/{+parent}/metrics",
+              "description": "Creates a logs-based metric.",
+              "request": {
+                "$ref": "LogMetric"
+              }
+            },
+            "delete": {
+              "httpMethod": "DELETE",
+              "parameterOrder": [
+                "metricName"
+              ],
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameters": {
+                "metricName": {
+                  "pattern": "^projects/[^/]+/metrics/[^/]+$",
+                  "location": "path",
+                  "description": "The resource name of the metric to delete:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\n",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.write"
+              ],
+              "flatPath": "v2/projects/{projectsId}/metrics/{metricsId}",
+              "id": "logging.projects.metrics.delete",
+              "path": "v2/{+metricName}",
+              "description": "Deletes a logs-based metric."
+            }
+          }
+        }
+      }
+    },
+    "billingAccounts": {
+      "resources": {
+        "logs": {
+          "methods": {
+            "delete": {
+              "httpMethod": "DELETE",
+              "parameterOrder": [
+                "logName"
+              ],
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameters": {
+                "logName": {
+                  "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^billingAccounts/[^/]+/logs/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "flatPath": "v2/billingAccounts/{billingAccountsId}/logs/{logsId}",
+              "id": "logging.billingAccounts.logs.delete",
+              "path": "v2/{+logName}",
+              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted."
+            },
+            "list": {
+              "flatPath": "v2/billingAccounts/{billingAccountsId}/logs",
+              "id": "logging.billingAccounts.logs.list",
+              "path": "v2/{+parent}/logs",
+              "description": "Lists the logs in projects or organizations. Only logs that have entries are listed.",
+              "parameterOrder": [
+                "parent"
+              ],
+              "httpMethod": "GET",
+              "response": {
+                "$ref": "ListLogsResponse"
+              },
+              "parameters": {
+                "pageToken": {
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "parent": {
+                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^billingAccounts/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
               ]
             }
           }
+        },
+        "sinks": {
+          "methods": {
+            "delete": {
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "sinkName"
+              ],
+              "httpMethod": "DELETE",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "sinkName": {
+                  "pattern": "^billingAccounts/[^/]+/sinks/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The full resource name of the sink to delete, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nIt is an error if the sink does not exist. Example: \"projects/my-project-id/sinks/my-sink-id\". It is an error if the sink does not exist.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}",
+              "path": "v2/{+sinkName}",
+              "id": "logging.billingAccounts.sinks.delete",
+              "description": "Deletes a sink. If the sink has a unique writer_identity, then that service account is also deleted."
+            },
+            "list": {
+              "httpMethod": "GET",
+              "response": {
+                "$ref": "ListSinksResponse"
+              },
+              "parameterOrder": [
+                "parent"
+              ],
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "parameters": {
+                "pageToken": {
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                },
+                "parent": {
+                  "location": "path",
+                  "description": "Required. The parent resource whose sinks are to be listed. Examples: \"projects/my-logging-project\", \"organizations/123456789\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^billingAccounts/[^/]+$"
+                }
+              },
+              "flatPath": "v2/billingAccounts/{billingAccountsId}/sinks",
+              "id": "logging.billingAccounts.sinks.list",
+              "path": "v2/{+parent}/sinks",
+              "description": "Lists sinks."
+            },
+            "get": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "sinkName"
+              ],
+              "response": {
+                "$ref": "LogSink"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "parameters": {
+                "sinkName": {
+                  "pattern": "^billingAccounts/[^/]+/sinks/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The parent resource name of the sink:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}",
+              "id": "logging.billingAccounts.sinks.get",
+              "path": "v2/{+sinkName}",
+              "description": "Gets a sink."
+            },
+            "update": {
+              "description": "Updates a sink. If the named sink doesn't exist, then this method is identical to sinks.create. If the named sink does exist, then this method replaces the following fields in the existing sink with values from the new sink: destination, filter, output_version_format, start_time, and end_time. The updated filter might also have a new writer_identity; see the unique_writer_identity field.",
+              "request": {
+                "$ref": "LogSink"
+              },
+              "response": {
+                "$ref": "LogSink"
+              },
+              "parameterOrder": [
+                "sinkName"
+              ],
+              "httpMethod": "PUT",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "sinkName": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^billingAccounts/[^/]+/sinks/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The full resource name of the sink to update, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\"."
+                },
+                "uniqueWriterIdentity": {
+                  "location": "query",
+                  "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value was false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value was true and the new value is false.",
+                  "type": "boolean"
+                }
+              },
+              "flatPath": "v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}",
+              "path": "v2/{+sinkName}",
+              "id": "logging.billingAccounts.sinks.update"
+            },
+            "create": {
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "parent"
+              ],
+              "response": {
+                "$ref": "LogSink"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "parent": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^billingAccounts/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The resource in which to create the sink:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\nExamples: \"projects/my-logging-project\", \"organizations/123456789\"."
+                },
+                "uniqueWriterIdentity": {
+                  "location": "query",
+                  "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@system.gserviceaccount.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
+                  "type": "boolean"
+                }
+              },
+              "flatPath": "v2/billingAccounts/{billingAccountsId}/sinks",
+              "id": "logging.billingAccounts.sinks.create",
+              "path": "v2/{+parent}/sinks",
+              "description": "Creates a sink that exports specified log entries to a destination. The export of newly-ingested log entries begins immediately, unless the current time is outside the sink's start and end times or the sink's writer_identity is not permitted to write to the destination. A sink can export log entries only from the resource owning the sink.",
+              "request": {
+                "$ref": "LogSink"
+              }
+            }
+          }
         }
       }
     }
   },
   "parameters": {
-    "upload_protocol": {
-      "location": "query",
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string"
-    },
-    "prettyPrint": {
-      "location": "query",
-      "description": "Returns response with indentations and line breaks.",
-      "type": "boolean",
-      "default": "true"
-    },
-    "fields": {
-      "type": "string",
-      "location": "query",
-      "description": "Selector specifying which fields to include in a partial response."
-    },
-    "uploadType": {
-      "type": "string",
-      "location": "query",
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\")."
-    },
     "callback": {
-      "location": "query",
       "description": "JSONP",
-      "type": "string"
+      "type": "string",
+      "location": "query"
     },
     "$.xgafv": {
-      "location": "query",
-      "enum": [
-        "1",
-        "2"
-      ],
       "description": "V1 error format.",
       "type": "string",
       "enumDescriptions": [
         "v1 error format",
         "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
       ]
     },
     "alt": {
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "type": "string",
       "enumDescriptions": [
         "Responses with Content-Type of application/json",
         "Media download with context-dependent Content-Type",
@@ -2044,7 +2024,13 @@
       ],
       "location": "query",
       "description": "Data format for response.",
-      "default": "json"
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string"
     },
     "key": {
       "location": "query",
@@ -2052,14 +2038,14 @@
       "type": "string"
     },
     "access_token": {
-      "type": "string",
       "location": "query",
-      "description": "OAuth access token."
+      "description": "OAuth access token.",
+      "type": "string"
     },
     "quotaUser": {
-      "type": "string",
       "location": "query",
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters."
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
     },
     "pp": {
       "location": "query",
@@ -2068,23 +2054,37 @@
       "default": "true"
     },
     "bearer_token": {
-      "location": "query",
       "description": "OAuth bearer token.",
-      "type": "string"
+      "type": "string",
+      "location": "query"
     },
     "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    },
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "prettyPrint": {
+      "type": "boolean",
+      "default": "true",
+      "location": "query",
+      "description": "Returns response with indentations and line breaks."
+    },
+    "fields": {
       "type": "string",
       "location": "query",
-      "description": "OAuth 2.0 token for the current user."
+      "description": "Selector specifying which fields to include in a partial response."
+    },
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string",
+      "location": "query"
     }
   },
   "version": "v2",
-  "baseUrl": "https://logging.googleapis.com/",
-  "description": "Writes log entries and manages your Stackdriver Logging configuration.",
-  "kind": "discovery#restDescription",
-  "servicePath": "",
-  "basePath": "",
-  "documentationLink": "https://cloud.google.com/logging/docs/",
-  "revision": "20170114",
-  "id": "logging:v2"
+  "baseUrl": "https://logging.googleapis.com/"
 }
diff --git a/logging/v2/logging-gen.go b/logging/v2/logging-gen.go
index 3660452..32877f7 100644
--- a/logging/v2/logging-gen.go
+++ b/logging/v2/logging-gen.go
@@ -78,9 +78,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	BillingAccounts *BillingAccountsService
 
@@ -102,6 +103,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewBillingAccountsService(s *Service) *BillingAccountsService {
 	rs := &BillingAccountsService{s: s}
 	rs.Logs = NewBillingAccountsLogsService(s)
@@ -1519,7 +1524,8 @@
 }
 
 // Delete: Deletes all the log entries in a log. The log reappears if it
-// receives new entries.
+// receives new entries. Log entries written shortly before the delete
+// operation might not be deleted.
 func (r *BillingAccountsLogsService) Delete(logName string) *BillingAccountsLogsDeleteCall {
 	c := &BillingAccountsLogsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.logName = logName
@@ -1557,6 +1563,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2/{+logName}")
@@ -1607,7 +1614,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
+	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted.",
 	//   "flatPath": "v2/billingAccounts/{billingAccountsId}/logs/{logsId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "logging.billingAccounts.logs.delete",
@@ -1714,6 +1721,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1857,11 +1865,11 @@
 // "uniqueWriterIdentity": Determines the kind of IAM identity returned
 // as writer_identity in the new sink. If this value is omitted or set
 // to false, and if the sink's parent is a project, then the value
-// returned as writer_identity is cloud-logs@google.com, the same
-// identity used before the addition of writer identities to this API.
-// The sink's destination must be in the same project as the sink
-// itself.If this field is set to true, or if the sink is owned by a
-// non-project resource such as an organization, then the value of
+// returned as writer_identity is cloud-logs@system.gserviceaccount.com,
+// the same identity used before the addition of writer identities to
+// this API. The sink's destination must be in the same project as the
+// sink itself.If this field is set to true, or if the sink is owned by
+// a non-project resource such as an organization, then the value of
 // writer_identity will be a unique service account used only for
 // exports from the new sink. For more information, see writer_identity
 // in LogSink.
@@ -1901,6 +1909,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink)
 	if err != nil {
@@ -1972,7 +1981,7 @@
 	//       "type": "string"
 	//     },
 	//     "uniqueWriterIdentity": {
-	//       "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@google.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
+	//       "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@system.gserviceaccount.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
 	//       "location": "query",
 	//       "type": "boolean"
 	//     }
@@ -2041,6 +2050,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2/{+sinkName}")
@@ -2178,6 +2188,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2339,6 +2350,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2525,6 +2537,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink)
 	if err != nil {
@@ -2666,6 +2679,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.listlogentriesrequest)
 	if err != nil {
@@ -2811,6 +2825,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.writelogentriesrequest)
 	if err != nil {
@@ -2896,7 +2911,8 @@
 }
 
 // Delete: Deletes all the log entries in a log. The log reappears if it
-// receives new entries.
+// receives new entries. Log entries written shortly before the delete
+// operation might not be deleted.
 func (r *FoldersLogsService) Delete(logName string) *FoldersLogsDeleteCall {
 	c := &FoldersLogsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.logName = logName
@@ -2934,6 +2950,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2/{+logName}")
@@ -2984,7 +3001,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
+	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted.",
 	//   "flatPath": "v2/folders/{foldersId}/logs/{logsId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "logging.folders.logs.delete",
@@ -3091,6 +3108,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3234,11 +3252,11 @@
 // "uniqueWriterIdentity": Determines the kind of IAM identity returned
 // as writer_identity in the new sink. If this value is omitted or set
 // to false, and if the sink's parent is a project, then the value
-// returned as writer_identity is cloud-logs@google.com, the same
-// identity used before the addition of writer identities to this API.
-// The sink's destination must be in the same project as the sink
-// itself.If this field is set to true, or if the sink is owned by a
-// non-project resource such as an organization, then the value of
+// returned as writer_identity is cloud-logs@system.gserviceaccount.com,
+// the same identity used before the addition of writer identities to
+// this API. The sink's destination must be in the same project as the
+// sink itself.If this field is set to true, or if the sink is owned by
+// a non-project resource such as an organization, then the value of
 // writer_identity will be a unique service account used only for
 // exports from the new sink. For more information, see writer_identity
 // in LogSink.
@@ -3278,6 +3296,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink)
 	if err != nil {
@@ -3349,7 +3368,7 @@
 	//       "type": "string"
 	//     },
 	//     "uniqueWriterIdentity": {
-	//       "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@google.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
+	//       "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@system.gserviceaccount.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
 	//       "location": "query",
 	//       "type": "boolean"
 	//     }
@@ -3418,6 +3437,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2/{+sinkName}")
@@ -3555,6 +3575,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3716,6 +3737,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3902,6 +3924,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink)
 	if err != nil {
@@ -4070,6 +4093,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4186,7 +4210,8 @@
 }
 
 // Delete: Deletes all the log entries in a log. The log reappears if it
-// receives new entries.
+// receives new entries. Log entries written shortly before the delete
+// operation might not be deleted.
 func (r *OrganizationsLogsService) Delete(logName string) *OrganizationsLogsDeleteCall {
 	c := &OrganizationsLogsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.logName = logName
@@ -4224,6 +4249,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2/{+logName}")
@@ -4274,7 +4300,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
+	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted.",
 	//   "flatPath": "v2/organizations/{organizationsId}/logs/{logsId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "logging.organizations.logs.delete",
@@ -4381,6 +4407,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4524,11 +4551,11 @@
 // "uniqueWriterIdentity": Determines the kind of IAM identity returned
 // as writer_identity in the new sink. If this value is omitted or set
 // to false, and if the sink's parent is a project, then the value
-// returned as writer_identity is cloud-logs@google.com, the same
-// identity used before the addition of writer identities to this API.
-// The sink's destination must be in the same project as the sink
-// itself.If this field is set to true, or if the sink is owned by a
-// non-project resource such as an organization, then the value of
+// returned as writer_identity is cloud-logs@system.gserviceaccount.com,
+// the same identity used before the addition of writer identities to
+// this API. The sink's destination must be in the same project as the
+// sink itself.If this field is set to true, or if the sink is owned by
+// a non-project resource such as an organization, then the value of
 // writer_identity will be a unique service account used only for
 // exports from the new sink. For more information, see writer_identity
 // in LogSink.
@@ -4568,6 +4595,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink)
 	if err != nil {
@@ -4639,7 +4667,7 @@
 	//       "type": "string"
 	//     },
 	//     "uniqueWriterIdentity": {
-	//       "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@google.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
+	//       "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@system.gserviceaccount.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
 	//       "location": "query",
 	//       "type": "boolean"
 	//     }
@@ -4708,6 +4736,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2/{+sinkName}")
@@ -4845,6 +4874,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5006,6 +5036,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5192,6 +5223,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink)
 	if err != nil {
@@ -5294,7 +5326,8 @@
 }
 
 // Delete: Deletes all the log entries in a log. The log reappears if it
-// receives new entries.
+// receives new entries. Log entries written shortly before the delete
+// operation might not be deleted.
 func (r *ProjectsLogsService) Delete(logName string) *ProjectsLogsDeleteCall {
 	c := &ProjectsLogsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.logName = logName
@@ -5332,6 +5365,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2/{+logName}")
@@ -5382,7 +5416,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
+	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted.",
 	//   "flatPath": "v2/projects/{projectsId}/logs/{logsId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "logging.projects.logs.delete",
@@ -5489,6 +5523,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5654,6 +5689,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logmetric)
 	if err != nil {
@@ -5789,6 +5825,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2/{+metricName}")
@@ -5927,6 +5964,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6088,6 +6126,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6253,6 +6292,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logmetric)
 	if err != nil {
@@ -6368,11 +6408,11 @@
 // "uniqueWriterIdentity": Determines the kind of IAM identity returned
 // as writer_identity in the new sink. If this value is omitted or set
 // to false, and if the sink's parent is a project, then the value
-// returned as writer_identity is cloud-logs@google.com, the same
-// identity used before the addition of writer identities to this API.
-// The sink's destination must be in the same project as the sink
-// itself.If this field is set to true, or if the sink is owned by a
-// non-project resource such as an organization, then the value of
+// returned as writer_identity is cloud-logs@system.gserviceaccount.com,
+// the same identity used before the addition of writer identities to
+// this API. The sink's destination must be in the same project as the
+// sink itself.If this field is set to true, or if the sink is owned by
+// a non-project resource such as an organization, then the value of
 // writer_identity will be a unique service account used only for
 // exports from the new sink. For more information, see writer_identity
 // in LogSink.
@@ -6412,6 +6452,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink)
 	if err != nil {
@@ -6483,7 +6524,7 @@
 	//       "type": "string"
 	//     },
 	//     "uniqueWriterIdentity": {
-	//       "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@google.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
+	//       "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@system.gserviceaccount.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
 	//       "location": "query",
 	//       "type": "boolean"
 	//     }
@@ -6552,6 +6593,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2/{+sinkName}")
@@ -6689,6 +6731,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6850,6 +6893,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7036,6 +7080,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink)
 	if err != nil {
diff --git a/logging/v2beta1/logging-api.json b/logging/v2beta1/logging-api.json
index b8fff72..ef8377d 100644
--- a/logging/v2beta1/logging-api.json
+++ b/logging/v2beta1/logging-api.json
@@ -1,827 +1,25 @@
 {
-  "canonicalName": "Logging",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform.read-only": {
-          "description": "View your data across Google Cloud Platform services"
-        },
-        "https://www.googleapis.com/auth/logging.admin": {
-          "description": "Administrate log data for your projects"
-        },
-        "https://www.googleapis.com/auth/logging.read": {
-          "description": "View log data for your projects"
-        },
-        "https://www.googleapis.com/auth/logging.write": {
-          "description": "Submit log data for your projects"
-        },
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        }
-      }
-    }
-  },
-  "rootUrl": "https://logging.googleapis.com/",
-  "ownerDomain": "google.com",
-  "name": "logging",
-  "batchPath": "batch",
-  "title": "Stackdriver Logging API",
-  "ownerName": "Google",
-  "resources": {
-    "projects": {
-      "resources": {
-        "logs": {
-          "methods": {
-            "delete": {
-              "path": "v2beta1/{+logName}",
-              "id": "logging.projects.logs.delete",
-              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
-              "parameterOrder": [
-                "logName"
-              ],
-              "httpMethod": "DELETE",
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameters": {
-                "logName": {
-                  "pattern": "^projects/[^/]+/logs/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "flatPath": "v2beta1/projects/{projectsId}/logs/{logsId}"
-            },
-            "list": {
-              "description": "Lists the logs in projects or organizations. Only logs that have entries are listed.",
-              "httpMethod": "GET",
-              "response": {
-                "$ref": "ListLogsResponse"
-              },
-              "parameterOrder": [
-                "parent"
-              ],
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "parameters": {
-                "parent": {
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n",
-                  "required": true,
-                  "type": "string"
-                },
-                "pageToken": {
-                  "location": "query",
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "location": "query",
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32",
-                  "type": "integer"
-                }
-              },
-              "flatPath": "v2beta1/projects/{projectsId}/logs",
-              "id": "logging.projects.logs.list",
-              "path": "v2beta1/{+parent}/logs"
-            }
-          }
-        },
-        "sinks": {
-          "methods": {
-            "delete": {
-              "path": "v2beta1/{+sinkName}",
-              "id": "logging.projects.sinks.delete",
-              "description": "Deletes a sink. If the sink has a unique writer_identity, then that service account is also deleted.",
-              "response": {
-                "$ref": "Empty"
-              },
-              "httpMethod": "DELETE",
-              "parameterOrder": [
-                "sinkName"
-              ],
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "parameters": {
-                "sinkName": {
-                  "pattern": "^projects/[^/]+/sinks/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The full resource name of the sink to delete, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nIt is an error if the sink does not exist. Example: \"projects/my-project-id/sinks/my-sink-id\". It is an error if the sink does not exist.",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "flatPath": "v2beta1/projects/{projectsId}/sinks/{sinksId}"
-            },
-            "list": {
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "parent"
-              ],
-              "response": {
-                "$ref": "ListSinksResponse"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "parameters": {
-                "pageToken": {
-                  "location": "query",
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "location": "query",
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32",
-                  "type": "integer"
-                },
-                "parent": {
-                  "description": "Required. The parent resource whose sinks are to be listed. Examples: \"projects/my-logging-project\", \"organizations/123456789\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "flatPath": "v2beta1/projects/{projectsId}/sinks",
-              "id": "logging.projects.sinks.list",
-              "path": "v2beta1/{+parent}/sinks",
-              "description": "Lists sinks."
-            },
-            "get": {
-              "description": "Gets a sink.",
-              "response": {
-                "$ref": "LogSink"
-              },
-              "parameterOrder": [
-                "sinkName"
-              ],
-              "httpMethod": "GET",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "parameters": {
-                "sinkName": {
-                  "pattern": "^projects/[^/]+/sinks/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The parent resource name of the sink:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "flatPath": "v2beta1/projects/{projectsId}/sinks/{sinksId}",
-              "path": "v2beta1/{+sinkName}",
-              "id": "logging.projects.sinks.get"
-            },
-            "update": {
-              "httpMethod": "PUT",
-              "parameterOrder": [
-                "sinkName"
-              ],
-              "response": {
-                "$ref": "LogSink"
-              },
-              "parameters": {
-                "sinkName": {
-                  "description": "Required. The full resource name of the sink to update, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/sinks/[^/]+$",
-                  "location": "path"
-                },
-                "uniqueWriterIdentity": {
-                  "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value was false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value was true and the new value is false.",
-                  "type": "boolean",
-                  "location": "query"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "flatPath": "v2beta1/projects/{projectsId}/sinks/{sinksId}",
-              "id": "logging.projects.sinks.update",
-              "path": "v2beta1/{+sinkName}",
-              "request": {
-                "$ref": "LogSink"
-              },
-              "description": "Updates a sink. If the named sink doesn't exist, then this method is identical to sinks.create. If the named sink does exist, then this method replaces the following fields in the existing sink with values from the new sink: destination, filter, output_version_format, start_time, and end_time. The updated filter might also have a new writer_identity; see the unique_writer_identity field."
-            },
-            "create": {
-              "response": {
-                "$ref": "LogSink"
-              },
-              "parameterOrder": [
-                "parent"
-              ],
-              "httpMethod": "POST",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "parameters": {
-                "parent": {
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The resource in which to create the sink:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\nExamples: \"projects/my-logging-project\", \"organizations/123456789\".",
-                  "required": true,
-                  "type": "string"
-                },
-                "uniqueWriterIdentity": {
-                  "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@google.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
-                  "type": "boolean",
-                  "location": "query"
-                }
-              },
-              "flatPath": "v2beta1/projects/{projectsId}/sinks",
-              "path": "v2beta1/{+parent}/sinks",
-              "id": "logging.projects.sinks.create",
-              "description": "Creates a sink that exports specified log entries to a destination. The export of newly-ingested log entries begins immediately, unless the current time is outside the sink's start and end times or the sink's writer_identity is not permitted to write to the destination. A sink can export log entries only from the resource owning the sink.",
-              "request": {
-                "$ref": "LogSink"
-              }
-            }
-          }
-        },
-        "metrics": {
-          "methods": {
-            "create": {
-              "response": {
-                "$ref": "LogMetric"
-              },
-              "parameterOrder": [
-                "parent"
-              ],
-              "httpMethod": "POST",
-              "parameters": {
-                "parent": {
-                  "description": "The resource name of the project in which to create the metric:\n\"projects/[PROJECT_ID]\"\nThe new metric must be provided in the request.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.write"
-              ],
-              "flatPath": "v2beta1/projects/{projectsId}/metrics",
-              "path": "v2beta1/{+parent}/metrics",
-              "id": "logging.projects.metrics.create",
-              "request": {
-                "$ref": "LogMetric"
-              },
-              "description": "Creates a logs-based metric."
-            },
-            "delete": {
-              "path": "v2beta1/{+metricName}",
-              "id": "logging.projects.metrics.delete",
-              "description": "Deletes a logs-based metric.",
-              "parameterOrder": [
-                "metricName"
-              ],
-              "response": {
-                "$ref": "Empty"
-              },
-              "httpMethod": "DELETE",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.write"
-              ],
-              "parameters": {
-                "metricName": {
-                  "pattern": "^projects/[^/]+/metrics/[^/]+$",
-                  "location": "path",
-                  "description": "The resource name of the metric to delete:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\n",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "flatPath": "v2beta1/projects/{projectsId}/metrics/{metricsId}"
-            },
-            "list": {
-              "id": "logging.projects.metrics.list",
-              "path": "v2beta1/{+parent}/metrics",
-              "description": "Lists logs-based metrics.",
-              "httpMethod": "GET",
-              "response": {
-                "$ref": "ListLogMetricsResponse"
-              },
-              "parameterOrder": [
-                "parent"
-              ],
-              "parameters": {
-                "parent": {
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The name of the project containing the metrics:\n\"projects/[PROJECT_ID]\"\n",
-                  "required": true,
-                  "type": "string"
-                },
-                "pageToken": {
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
-                  "type": "string",
-                  "location": "query"
-                },
-                "pageSize": {
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32",
-                  "type": "integer",
-                  "location": "query"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "flatPath": "v2beta1/projects/{projectsId}/metrics"
-            },
-            "get": {
-              "response": {
-                "$ref": "LogMetric"
-              },
-              "parameterOrder": [
-                "metricName"
-              ],
-              "httpMethod": "GET",
-              "parameters": {
-                "metricName": {
-                  "description": "The resource name of the desired metric:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\n",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/metrics/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "flatPath": "v2beta1/projects/{projectsId}/metrics/{metricsId}",
-              "path": "v2beta1/{+metricName}",
-              "id": "logging.projects.metrics.get",
-              "description": "Gets a logs-based metric."
-            },
-            "update": {
-              "parameters": {
-                "metricName": {
-                  "pattern": "^projects/[^/]+/metrics/[^/]+$",
-                  "location": "path",
-                  "description": "The resource name of the metric to update:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\nThe updated metric must be provided in the request and it's name field must be the same as [METRIC_ID] If the metric does not exist in [PROJECT_ID], then a new metric is created.",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.write"
-              ],
-              "flatPath": "v2beta1/projects/{projectsId}/metrics/{metricsId}",
-              "id": "logging.projects.metrics.update",
-              "path": "v2beta1/{+metricName}",
-              "request": {
-                "$ref": "LogMetric"
-              },
-              "description": "Creates or updates a logs-based metric.",
-              "httpMethod": "PUT",
-              "parameterOrder": [
-                "metricName"
-              ],
-              "response": {
-                "$ref": "LogMetric"
-              }
-            }
-          }
-        }
-      }
-    },
-    "billingAccounts": {
-      "resources": {
-        "logs": {
-          "methods": {
-            "delete": {
-              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
-              "httpMethod": "DELETE",
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "logName"
-              ],
-              "parameters": {
-                "logName": {
-                  "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^billingAccounts/[^/]+/logs/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "flatPath": "v2beta1/billingAccounts/{billingAccountsId}/logs/{logsId}",
-              "id": "logging.billingAccounts.logs.delete",
-              "path": "v2beta1/{+logName}"
-            },
-            "list": {
-              "parameters": {
-                "pageToken": {
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
-                  "type": "string",
-                  "location": "query"
-                },
-                "pageSize": {
-                  "location": "query",
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32",
-                  "type": "integer"
-                },
-                "parent": {
-                  "pattern": "^billingAccounts/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "flatPath": "v2beta1/billingAccounts/{billingAccountsId}/logs",
-              "id": "logging.billingAccounts.logs.list",
-              "path": "v2beta1/{+parent}/logs",
-              "description": "Lists the logs in projects or organizations. Only logs that have entries are listed.",
-              "httpMethod": "GET",
-              "response": {
-                "$ref": "ListLogsResponse"
-              },
-              "parameterOrder": [
-                "parent"
-              ]
-            }
-          }
-        }
-      }
-    },
-    "monitoredResourceDescriptors": {
-      "methods": {
-        "list": {
-          "parameterOrder": [],
-          "response": {
-            "$ref": "ListMonitoredResourceDescriptorsResponse"
-          },
-          "httpMethod": "GET",
-          "parameters": {
-            "pageToken": {
-              "location": "query",
-              "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
-              "type": "string"
-            },
-            "pageSize": {
-              "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-              "format": "int32",
-              "type": "integer",
-              "location": "query"
-            }
-          },
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only",
-            "https://www.googleapis.com/auth/logging.admin",
-            "https://www.googleapis.com/auth/logging.read"
-          ],
-          "flatPath": "v2beta1/monitoredResourceDescriptors",
-          "path": "v2beta1/monitoredResourceDescriptors",
-          "id": "logging.monitoredResourceDescriptors.list",
-          "description": "Lists the descriptors for monitored resource types used by Stackdriver Logging."
-        }
-      }
-    },
-    "organizations": {
-      "resources": {
-        "logs": {
-          "methods": {
-            "delete": {
-              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
-              "parameterOrder": [
-                "logName"
-              ],
-              "response": {
-                "$ref": "Empty"
-              },
-              "httpMethod": "DELETE",
-              "parameters": {
-                "logName": {
-                  "pattern": "^organizations/[^/]+/logs/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/logging.admin"
-              ],
-              "flatPath": "v2beta1/organizations/{organizationsId}/logs/{logsId}",
-              "path": "v2beta1/{+logName}",
-              "id": "logging.organizations.logs.delete"
-            },
-            "list": {
-              "description": "Lists the logs in projects or organizations. Only logs that have entries are listed.",
-              "httpMethod": "GET",
-              "response": {
-                "$ref": "ListLogsResponse"
-              },
-              "parameterOrder": [
-                "parent"
-              ],
-              "parameters": {
-                "parent": {
-                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^organizations/[^/]+$",
-                  "location": "path"
-                },
-                "pageToken": {
-                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
-                  "type": "string",
-                  "location": "query"
-                },
-                "pageSize": {
-                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
-                  "format": "int32",
-                  "type": "integer",
-                  "location": "query"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/logging.admin",
-                "https://www.googleapis.com/auth/logging.read"
-              ],
-              "flatPath": "v2beta1/organizations/{organizationsId}/logs",
-              "id": "logging.organizations.logs.list",
-              "path": "v2beta1/{+parent}/logs"
-            }
-          }
-        }
-      }
-    },
-    "entries": {
-      "methods": {
-        "list": {
-          "request": {
-            "$ref": "ListLogEntriesRequest"
-          },
-          "description": "Lists log entries. Use this method to retrieve log entries from Stackdriver Logging. For ways to export log entries, see Exporting Logs.",
-          "response": {
-            "$ref": "ListLogEntriesResponse"
-          },
-          "parameterOrder": [],
-          "httpMethod": "POST",
-          "parameters": {},
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only",
-            "https://www.googleapis.com/auth/logging.admin",
-            "https://www.googleapis.com/auth/logging.read"
-          ],
-          "flatPath": "v2beta1/entries:list",
-          "path": "v2beta1/entries:list",
-          "id": "logging.entries.list"
-        },
-        "write": {
-          "id": "logging.entries.write",
-          "path": "v2beta1/entries:write",
-          "request": {
-            "$ref": "WriteLogEntriesRequest"
-          },
-          "description": "Writes log entries to Stackdriver Logging. All log entries are written by this method.",
-          "httpMethod": "POST",
-          "parameterOrder": [],
-          "response": {
-            "$ref": "WriteLogEntriesResponse"
-          },
-          "parameters": {},
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/logging.admin",
-            "https://www.googleapis.com/auth/logging.write"
-          ],
-          "flatPath": "v2beta1/entries:write"
-        }
-      }
-    }
-  },
-  "parameters": {
-    "key": {
-      "location": "query",
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string"
-    },
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "location": "query",
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "type": "boolean",
-      "default": "true",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "location": "query",
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "type": "boolean",
-      "default": "true",
-      "location": "query"
-    },
-    "fields": {
-      "location": "query",
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string"
-    },
-    "uploadType": {
-      "location": "query",
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "type": "string",
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "location": "query",
-      "enum": [
-        "1",
-        "2"
-      ]
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "type": "string",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "location": "query",
-      "description": "Data format for response.",
-      "default": "json"
-    }
-  },
-  "version": "v2beta1",
-  "baseUrl": "https://logging.googleapis.com/",
-  "servicePath": "",
-  "description": "Writes log entries and manages your Stackdriver Logging configuration.",
-  "kind": "discovery#restDescription",
   "basePath": "",
-  "revision": "20170114",
-  "documentationLink": "https://cloud.google.com/logging/docs/",
   "id": "logging:v2beta1",
+  "documentationLink": "https://cloud.google.com/logging/docs/",
+  "revision": "20170206",
   "discoveryVersion": "v1",
   "version_module": "True",
   "schemas": {
-    "MonitoredResourceDescriptor": {
-      "id": "MonitoredResourceDescriptor",
-      "description": "An object that describes the schema of a MonitoredResource object using a type name and a set of labels. For example, the monitored resource descriptor for Google Compute Engine VM instances has a type of \"gce_instance\" and specifies the use of the labels \"instance_id\" and \"zone\" to identify particular VM instances.Different APIs can support different monitored resource types. APIs generally provide a list method that returns the monitored resource descriptors used by the API.",
-      "type": "object",
-      "properties": {
-        "labels": {
-          "description": "Required. A set of labels used to describe instances of this monitored resource type. For example, an individual Google Cloud SQL database is identified by values for the labels \"database_id\" and \"zone\".",
-          "type": "array",
-          "items": {
-            "$ref": "LabelDescriptor"
-          }
-        },
-        "name": {
-          "description": "Optional. The resource name of the monitored resource descriptor: \"projects/{project_id}/monitoredResourceDescriptors/{type}\" where {type} is the value of the type field in this object and {project_id} is a project ID that provides API-specific context for accessing the type. APIs that do not use project information can use the resource name format \"monitoredResourceDescriptors/{type}\".",
-          "type": "string"
-        },
-        "displayName": {
-          "description": "Optional. A concise name for the monitored resource type that might be displayed in user interfaces. It should be a Title Cased Noun Phrase, without any article or other determiners. For example, \"Google Cloud SQL Database\".",
-          "type": "string"
-        },
-        "description": {
-          "description": "Optional. A detailed description of the monitored resource type that might be used in documentation.",
-          "type": "string"
-        },
-        "type": {
-          "description": "Required. The monitored resource type. For example, the type \"cloudsql_database\" represents databases in Google Cloud SQL. The maximum length of this value is 256 characters.",
-          "type": "string"
-        }
-      }
-    },
-    "LogEntrySourceLocation": {
-      "description": "Additional information about the source code location that produced the log entry.",
-      "type": "object",
-      "properties": {
-        "line": {
-          "description": "Optional. Line within the source file. 1-based; 0 indicates no line number available.",
-          "format": "int64",
-          "type": "string"
-        },
-        "file": {
-          "description": "Optional. Source file name. Depending on the runtime environment, this might be a simple name or a fully-qualified name.",
-          "type": "string"
-        },
-        "function": {
-          "description": "Optional. Human-readable name of the function or method being invoked, with optional context such as the class or package name. This information may be used in contexts such as the logs viewer, where a file and line number are less meaningful. The format can vary by language. For example: qual.if.ied.Class.method (Java), dir/package.func (Go), function (Python).",
-          "type": "string"
-        }
-      },
-      "id": "LogEntrySourceLocation"
-    },
-    "ListLogEntriesResponse": {
-      "id": "ListLogEntriesResponse",
-      "description": "Result returned from ListLogEntries.",
-      "type": "object",
-      "properties": {
-        "entries": {
-          "description": "A list of log entries.",
-          "type": "array",
-          "items": {
-            "$ref": "LogEntry"
-          }
-        },
-        "nextPageToken": {
-          "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.If a value for next_page_token appears and the entries field is empty, it means that the search found no log entries so far but it did not have time to search all the possible log entries. Retry the method with this value for page_token to continue the search. Alternatively, consider speeding up the search by changing your filter to specify a single log name or resource type, or to narrow the time range of the search.",
-          "type": "string"
-        }
-      }
-    },
     "LogLine": {
+      "id": "LogLine",
       "description": "Application log line emitted while processing a request.",
       "type": "object",
       "properties": {
+        "sourceLocation": {
+          "description": "Where in the source code this log message was written.",
+          "$ref": "SourceLocation"
+        },
+        "time": {
+          "type": "string",
+          "description": "Approximate time when this log entry was made.",
+          "format": "google-datetime"
+        },
         "severity": {
           "description": "Severity of this log entry.",
           "type": "string",
@@ -851,29 +49,19 @@
         "logMessage": {
           "description": "App-provided log message.",
           "type": "string"
-        },
-        "sourceLocation": {
-          "description": "Where in the source code this log message was written.",
-          "$ref": "SourceLocation"
-        },
-        "time": {
-          "description": "Approximate time when this log entry was made.",
-          "format": "google-datetime",
-          "type": "string"
         }
-      },
-      "id": "LogLine"
+      }
     },
     "ListLogMetricsResponse": {
       "description": "Result returned from ListLogMetrics.",
       "type": "object",
       "properties": {
         "metrics": {
-          "description": "A list of logs-based metrics.",
           "type": "array",
           "items": {
             "$ref": "LogMetric"
-          }
+          },
+          "description": "A list of logs-based metrics."
         },
         "nextPageToken": {
           "description": "If there might be more results than appear in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.",
@@ -882,14 +70,7 @@
       },
       "id": "ListLogMetricsResponse"
     },
-    "Empty": {
-      "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:\nservice Foo {\n  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n}\nThe JSON representation for Empty is empty JSON object {}.",
-      "type": "object",
-      "properties": {},
-      "id": "Empty"
-    },
     "LogEntry": {
-      "id": "LogEntry",
       "description": "An individual entry in a log.",
       "type": "object",
       "properties": {
@@ -897,14 +78,14 @@
           "description": "Required. The resource name of the log to which this log entry belongs:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded within log_name. Example: \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". [LOG_ID] must be less than 512 characters long and can only include the following characters: upper and lower case alphanumeric characters, forward-slash, underscore, hyphen, and period.For backward compatibility, if log_name begins with a forward-slash, such as /projects/..., then the log entry is ingested as usual but the forward-slash is removed. Listing the log entry will not show the leading slash and filtering for a log name with a leading slash will never return any results.",
           "type": "string"
         },
-        "httpRequest": {
-          "$ref": "HttpRequest",
-          "description": "Optional. Information about the HTTP request associated with this log entry, if applicable."
-        },
         "resource": {
           "$ref": "MonitoredResource",
           "description": "Required. The monitored resource associated with this log entry. Example: a log entry that reports a database error would be associated with the monitored resource designating the particular database that reported the error."
         },
+        "httpRequest": {
+          "description": "Optional. Information about the HTTP request associated with this log entry, if applicable.",
+          "$ref": "HttpRequest"
+        },
         "jsonPayload": {
           "description": "The log entry payload, represented as a structure that is expressed as a JSON object.",
           "type": "object",
@@ -918,20 +99,20 @@
           "type": "string"
         },
         "operation": {
-          "description": "Optional. Information about an operation associated with the log entry, if applicable.",
-          "$ref": "LogEntryOperation"
+          "$ref": "LogEntryOperation",
+          "description": "Optional. Information about an operation associated with the log entry, if applicable."
         },
         "textPayload": {
           "description": "The log entry payload, represented as a Unicode string (UTF-8).",
           "type": "string"
         },
         "protoPayload": {
+          "description": "The log entry payload, represented as a protocol buffer. Some Google Cloud Platform services use this field for their log entry payloads.",
+          "type": "object",
           "additionalProperties": {
             "description": "Properties of the object. Contains field @type with type URL.",
             "type": "any"
-          },
-          "description": "The log entry payload, represented as a protocol buffer. Some Google Cloud Platform services use this field for their log entry payloads.",
-          "type": "object"
+          }
         },
         "trace": {
           "description": "Optional. Resource name of the trace associated with the log entry, if any. If it contains a relative resource name, the name is assumed to be relative to //tracing.googleapis.com. Example: projects/my-projectid/traces/06796866738c859f2f19b7cfb3214824",
@@ -979,9 +160,17 @@
           "format": "google-datetime",
           "type": "string"
         }
-      }
+      },
+      "id": "LogEntry"
+    },
+    "Empty": {
+      "type": "object",
+      "properties": {},
+      "id": "Empty",
+      "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:\nservice Foo {\n  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n}\nThe JSON representation for Empty is empty JSON object {}."
     },
     "SourceLocation": {
+      "id": "SourceLocation",
       "description": "Specifies a location in a source code file.",
       "type": "object",
       "properties": {
@@ -998,17 +187,11 @@
           "format": "int64",
           "type": "string"
         }
-      },
-      "id": "SourceLocation"
+      }
     },
     "ListLogEntriesRequest": {
-      "description": "The parameters to ListLogEntries.",
       "type": "object",
       "properties": {
-        "orderBy": {
-          "description": "Optional. How the results should be sorted. Presently, the only permitted values are \"timestamp asc\" (default) and \"timestamp desc\". The first option returns entries in order of increasing values of LogEntry.timestamp (oldest first), and the second option returns entries in order of decreasing timestamps (newest first). Entries with equal timestamps are returned in order of LogEntry.insertId.",
-          "type": "string"
-        },
         "resourceNames": {
           "description": "Required. Names of one or more resources from which to retrieve log entries:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\nProjects listed in the project_ids field are added to this list.",
           "type": "array",
@@ -1016,17 +199,17 @@
             "type": "string"
           }
         },
-        "projectIds": {
-          "description": "Deprecated. Use resource_names instead. One or more project identifiers or project numbers from which to retrieve log entries. Example: \"my-project-1A\". If present, these project identifiers are converted to resource name format and added to the list of resources in resource_names.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
         "filter": {
           "description": "Optional. A filter that chooses which log entries to return. See Advanced Logs Filters. Only log entries that match the filter are returned. An empty filter matches all log entries in the resources listed in resource_names. Referencing a parent resource that is not listed in resource_names will cause the filter to return no results. The maximum length of the filter is 20000 characters.",
           "type": "string"
         },
+        "projectIds": {
+          "description": "Deprecated. Use resource_names instead. One or more project identifiers or project numbers from which to retrieve log entries. Example: \"my-project-1A\". If present, these project identifiers are converted to resource name format and added to the list of resources in resource_names.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
         "pageToken": {
           "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
           "type": "string"
@@ -1035,26 +218,79 @@
           "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
           "format": "int32",
           "type": "integer"
+        },
+        "orderBy": {
+          "description": "Optional. How the results should be sorted. Presently, the only permitted values are \"timestamp asc\" (default) and \"timestamp desc\". The first option returns entries in order of increasing values of LogEntry.timestamp (oldest first), and the second option returns entries in order of decreasing timestamps (newest first). Entries with equal timestamps are returned in order of LogEntry.insertId.",
+          "type": "string"
         }
       },
-      "id": "ListLogEntriesRequest"
+      "id": "ListLogEntriesRequest",
+      "description": "The parameters to ListLogEntries."
     },
     "RequestLog": {
-      "id": "RequestLog",
       "description": "Complete log information about a single HTTP request to an App Engine application.",
       "type": "object",
       "properties": {
-        "ip": {
-          "description": "Origin IP address.",
+        "status": {
+          "type": "integer",
+          "description": "HTTP response status code. Example: 200, 404.",
+          "format": "int32"
+        },
+        "resource": {
+          "description": "Contains the path and query portion of the URL that was requested. For example, if the URL was \"http://example.com/app?name=val\", the resource would be \"/app?name=val\". The fragment identifier, which is identified by the # character, is not included.",
           "type": "string"
         },
+        "pendingTime": {
+          "description": "Time this request spent in the pending request queue.",
+          "format": "google-duration",
+          "type": "string"
+        },
+        "taskName": {
+          "description": "Task name of the request, in the case of an offline request.",
+          "type": "string"
+        },
+        "urlMapEntry": {
+          "description": "File or class that handled the request.",
+          "type": "string"
+        },
+        "instanceIndex": {
+          "description": "If the instance processing this request belongs to a manually scaled module, then this is the 0-based index of the instance. Otherwise, this value is -1.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "finished": {
+          "description": "Whether this request is finished or active.",
+          "type": "boolean"
+        },
+        "host": {
+          "description": "Internet host and port number of the resource being requested.",
+          "type": "string"
+        },
+        "httpVersion": {
+          "type": "string",
+          "description": "HTTP version of request. Example: \"HTTP/1.1\"."
+        },
+        "startTime": {
+          "description": "Time when the request started.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "latency": {
+          "description": "Latency of the request.",
+          "format": "google-duration",
+          "type": "string"
+        },
+        "ip": {
+          "type": "string",
+          "description": "Origin IP address."
+        },
         "appId": {
           "description": "Application that handled this request.",
           "type": "string"
         },
         "appEngineRelease": {
-          "description": "App Engine release version.",
-          "type": "string"
+          "type": "string",
+          "description": "App Engine release version."
         },
         "method": {
           "description": "Request method. Example: \"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\".",
@@ -1066,8 +302,8 @@
           "type": "number"
         },
         "instanceId": {
-          "description": "An identifier for the instance that handled the request.",
-          "type": "string"
+          "type": "string",
+          "description": "An identifier for the instance that handled the request."
         },
         "megaCycles": {
           "description": "Number of CPU megacycles used to process request.",
@@ -1122,14 +358,14 @@
             "$ref": "LogLine"
           }
         },
-        "taskQueueName": {
-          "description": "Queue name of the request, in the case of an offline request.",
-          "type": "string"
-        },
         "referrer": {
           "description": "Referrer URL of request.",
           "type": "string"
         },
+        "taskQueueName": {
+          "description": "Queue name of the request, in the case of an offline request.",
+          "type": "string"
+        },
         "requestId": {
           "description": "Globally unique identifier for a request, which is based on the request start time. Request IDs for requests which started later will compare greater as strings than those for requests which started earlier.",
           "type": "string"
@@ -1137,78 +373,29 @@
         "nickname": {
           "description": "The logged-in user who made the request.Most likely, this is the part of the user's email before the @ sign. The field value is the same for different requests from the same user, but different users can have similar names. This information is also available to the application via the App Engine Users API.This field will be populated starting with App Engine 1.9.21.",
           "type": "string"
-        },
-        "status": {
-          "description": "HTTP response status code. Example: 200, 404.",
-          "format": "int32",
-          "type": "integer"
-        },
-        "pendingTime": {
-          "description": "Time this request spent in the pending request queue.",
-          "format": "google-duration",
-          "type": "string"
-        },
-        "resource": {
-          "description": "Contains the path and query portion of the URL that was requested. For example, if the URL was \"http://example.com/app?name=val\", the resource would be \"/app?name=val\". The fragment identifier, which is identified by the # character, is not included.",
-          "type": "string"
-        },
-        "taskName": {
-          "description": "Task name of the request, in the case of an offline request.",
-          "type": "string"
-        },
-        "urlMapEntry": {
-          "description": "File or class that handled the request.",
-          "type": "string"
-        },
-        "instanceIndex": {
-          "description": "If the instance processing this request belongs to a manually scaled module, then this is the 0-based index of the instance. Otherwise, this value is -1.",
-          "format": "int32",
-          "type": "integer"
-        },
-        "finished": {
-          "description": "Whether this request is finished or active.",
-          "type": "boolean"
-        },
-        "host": {
-          "description": "Internet host and port number of the resource being requested.",
-          "type": "string"
-        },
-        "httpVersion": {
-          "description": "HTTP version of request. Example: \"HTTP/1.1\".",
-          "type": "string"
-        },
-        "startTime": {
-          "description": "Time when the request started.",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "latency": {
-          "description": "Latency of the request.",
-          "format": "google-duration",
-          "type": "string"
         }
-      }
+      },
+      "id": "RequestLog"
     },
     "ListMonitoredResourceDescriptorsResponse": {
-      "id": "ListMonitoredResourceDescriptorsResponse",
       "description": "Result returned from ListMonitoredResourceDescriptors.",
       "type": "object",
       "properties": {
-        "nextPageToken": {
-          "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.",
-          "type": "string"
-        },
         "resourceDescriptors": {
           "description": "A list of resource descriptors.",
           "type": "array",
           "items": {
             "$ref": "MonitoredResourceDescriptor"
           }
+        },
+        "nextPageToken": {
+          "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.",
+          "type": "string"
         }
-      }
+      },
+      "id": "ListMonitoredResourceDescriptorsResponse"
     },
     "SourceReference": {
-      "id": "SourceReference",
       "description": "A reference to a particular snapshot of the source tree used to build and deploy an application.",
       "type": "object",
       "properties": {
@@ -1220,43 +407,23 @@
           "description": "The canonical and persistent identifier of the deployed revision. Example (git): \"0035781c50ec7aa23385dc841529ce8a4b70db1b\"",
           "type": "string"
         }
-      }
+      },
+      "id": "SourceReference"
     },
-    "LogMetric": {
-      "id": "LogMetric",
-      "description": "Describes a logs-based metric. The value of the metric is the number of log entries that match a logs filter in a given time interval.",
-      "type": "object",
-      "properties": {
-        "name": {
-          "description": "Required. The client-assigned metric identifier. Examples: \"error_count\", \"nginx/requests\".Metric identifiers are limited to 100 characters and can include only the following characters: A-Z, a-z, 0-9, and the special characters _-.,+!*',()%/. The forward-slash character (/) denotes a hierarchy of name pieces, and it cannot be the first character of the name.The metric identifier in this field must not be URL-encoded (https://en.wikipedia.org/wiki/Percent-encoding). However, when the metric identifier appears as the [METRIC_ID] part of a metric_name API parameter, then the metric identifier must be URL-encoded. Example: \"projects/my-project/metrics/nginx%2Frequests\".",
-          "type": "string"
-        },
-        "description": {
-          "description": "Optional. A description of this metric, which is used in documentation.",
-          "type": "string"
-        },
-        "version": {
-          "description": "Output only. The API version that created or updated this metric. The version also dictates the syntax of the filter expression. When a value for this field is missing, the default value of V2 should be assumed.",
-          "type": "string",
-          "enumDescriptions": [
-            "Stackdriver Logging API v2.",
-            "Stackdriver Logging API v1."
-          ],
-          "enum": [
-            "V2",
-            "V1"
-          ]
-        },
-        "filter": {
-          "description": "Required. An advanced logs filter which is used to match log entries. Example:\n\"resource.type=gae_app AND severity\u003e=ERROR\"\nThe maximum length of the filter is 20000 characters.",
-          "type": "string"
-        }
-      }
+    "WriteLogEntriesResponse": {
+      "properties": {},
+      "id": "WriteLogEntriesResponse",
+      "description": "Result returned from WriteLogEntries. empty",
+      "type": "object"
     },
     "LogEntryOperation": {
       "description": "Additional information about a potentially long-running operation with which a log entry is associated.",
       "type": "object",
       "properties": {
+        "last": {
+          "description": "Optional. Set this to True if this is the last log entry in the operation.",
+          "type": "boolean"
+        },
         "id": {
           "description": "Optional. An arbitrary operation identifier. Log entries with the same identifier are assumed to be part of the same operation.",
           "type": "string"
@@ -1268,41 +435,93 @@
         "first": {
           "description": "Optional. Set this to True if this is the first log entry in the operation.",
           "type": "boolean"
-        },
-        "last": {
-          "description": "Optional. Set this to True if this is the last log entry in the operation.",
-          "type": "boolean"
         }
       },
       "id": "LogEntryOperation"
     },
-    "WriteLogEntriesResponse": {
-      "id": "WriteLogEntriesResponse",
-      "description": "Result returned from WriteLogEntries. empty",
+    "LogMetric": {
+      "description": "Describes a logs-based metric. The value of the metric is the number of log entries that match a logs filter in a given time interval.",
       "type": "object",
-      "properties": {}
+      "properties": {
+        "version": {
+          "enumDescriptions": [
+            "Stackdriver Logging API v2.",
+            "Stackdriver Logging API v1."
+          ],
+          "enum": [
+            "V2",
+            "V1"
+          ],
+          "description": "Output only. The API version that created or updated this metric. The version also dictates the syntax of the filter expression. When a value for this field is missing, the default value of V2 should be assumed.",
+          "type": "string"
+        },
+        "filter": {
+          "description": "Required. An advanced logs filter which is used to match log entries. Example:\n\"resource.type=gae_app AND severity\u003e=ERROR\"\nThe maximum length of the filter is 20000 characters.",
+          "type": "string"
+        },
+        "name": {
+          "description": "Required. The client-assigned metric identifier. Examples: \"error_count\", \"nginx/requests\".Metric identifiers are limited to 100 characters and can include only the following characters: A-Z, a-z, 0-9, and the special characters _-.,+!*',()%/. The forward-slash character (/) denotes a hierarchy of name pieces, and it cannot be the first character of the name.The metric identifier in this field must not be URL-encoded (https://en.wikipedia.org/wiki/Percent-encoding). However, when the metric identifier appears as the [METRIC_ID] part of a metric_name API parameter, then the metric identifier must be URL-encoded. Example: \"projects/my-project/metrics/nginx%2Frequests\".",
+          "type": "string"
+        },
+        "description": {
+          "description": "Optional. A description of this metric, which is used in documentation.",
+          "type": "string"
+        }
+      },
+      "id": "LogMetric"
     },
     "MonitoredResource": {
       "description": "An object representing a resource that can be used for monitoring, logging, billing, or other purposes. Examples include virtual machine instances, databases, and storage devices such as disks. The type field identifies a MonitoredResourceDescriptor object that describes the resource's schema. Information in the labels field identifies the actual resource and its attributes according to the schema. For example, a particular Compute Engine VM instance could be represented by the following object, because the MonitoredResourceDescriptor for \"gce_instance\" has labels \"instance_id\" and \"zone\":\n{ \"type\": \"gce_instance\",\n  \"labels\": { \"instance_id\": \"12345678901234\",\n              \"zone\": \"us-central1-a\" }}\n",
       "type": "object",
       "properties": {
         "type": {
-          "description": "Required. The monitored resource type. This field must match the type field of a MonitoredResourceDescriptor object. For example, the type of a Cloud SQL database is \"cloudsql_database\".",
-          "type": "string"
+          "type": "string",
+          "description": "Required. The monitored resource type. This field must match the type field of a MonitoredResourceDescriptor object. For example, the type of a Cloud SQL database is \"cloudsql_database\"."
         },
         "labels": {
-          "description": "Required. Values for all of the labels listed in the associated monitored resource descriptor. For example, Cloud SQL databases use the labels \"database_id\" and \"zone\".",
-          "type": "object",
           "additionalProperties": {
             "type": "string"
-          }
+          },
+          "description": "Required. Values for all of the labels listed in the associated monitored resource descriptor. For example, Cloud SQL databases use the labels \"database_id\" and \"zone\".",
+          "type": "object"
         }
       },
       "id": "MonitoredResource"
     },
+    "WriteLogEntriesRequest": {
+      "description": "The parameters to WriteLogEntries.",
+      "type": "object",
+      "properties": {
+        "logName": {
+          "description": "Optional. A default log resource name that is assigned to all log entries in entries that do not specify a value for log_name:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\" or \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
+          "type": "string"
+        },
+        "entries": {
+          "description": "Required. The log entries to write. Values supplied for the fields log_name, resource, and labels in this entries.write request are added to those log entries that do not provide their own values for the fields.To improve throughput and to avoid exceeding the quota limit for calls to entries.write, you should write multiple log entries at once rather than calling this method for each individual log entry.",
+          "type": "array",
+          "items": {
+            "$ref": "LogEntry"
+          }
+        },
+        "partialSuccess": {
+          "description": "Optional. Whether valid entries should be written even if some other entries fail due to INVALID_ARGUMENT or PERMISSION_DENIED errors. If any entry is not written, the response status will be the error associated with one of the failed entries and include error details in the form of WriteLogEntriesPartialErrors.",
+          "type": "boolean"
+        },
+        "labels": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional. Default labels that are added to the labels field of all log entries in entries. If a log entry already has a label with the same key as a label in this parameter, then the log entry's label is not changed. See LogEntry.",
+          "type": "object"
+        },
+        "resource": {
+          "description": "Optional. A default monitored resource object that is assigned to all log entries in entries that do not specify a value for resource. Example:\n{ \"type\": \"gce_instance\",\n  \"labels\": {\n    \"zone\": \"us-central1-a\", \"instance_id\": \"00000000000000000000\" }}\nSee LogEntry.",
+          "$ref": "MonitoredResource"
+        }
+      },
+      "id": "WriteLogEntriesRequest"
+    },
     "LogSink": {
-      "id": "LogSink",
-      "description": "Describes a sink used to export log entries to one of the following destinations in any project: a Cloud Storage bucket, a BigQuery dataset, or a Cloud Pub/Sub topic. A logs filter controls which log entries are exported. The sink must be created within a project or organization.",
       "type": "object",
       "properties": {
         "name": {
@@ -1332,82 +551,63 @@
           "type": "string"
         },
         "outputVersionFormat": {
+          "enum": [
+            "VERSION_FORMAT_UNSPECIFIED",
+            "V2",
+            "V1"
+          ],
           "description": "Optional. The log entry format to use for this sink's exported log entries. The v2 format is used by default. The v1 format is deprecated and should be used only as part of a migration effort to v2. See Migration to the v2 API.",
           "type": "string",
           "enumDescriptions": [
             "An unspecified format version that will default to V2.",
             "LogEntry version 2 format.",
             "LogEntry version 1 format."
-          ],
-          "enum": [
-            "VERSION_FORMAT_UNSPECIFIED",
-            "V2",
-            "V1"
           ]
         }
-      }
-    },
-    "WriteLogEntriesRequest": {
-      "id": "WriteLogEntriesRequest",
-      "description": "The parameters to WriteLogEntries.",
-      "type": "object",
-      "properties": {
-        "labels": {
-          "additionalProperties": {
-            "type": "string"
-          },
-          "description": "Optional. Default labels that are added to the labels field of all log entries in entries. If a log entry already has a label with the same key as a label in this parameter, then the log entry's label is not changed. See LogEntry.",
-          "type": "object"
-        },
-        "resource": {
-          "$ref": "MonitoredResource",
-          "description": "Optional. A default monitored resource object that is assigned to all log entries in entries that do not specify a value for resource. Example:\n{ \"type\": \"gce_instance\",\n  \"labels\": {\n    \"zone\": \"us-central1-a\", \"instance_id\": \"00000000000000000000\" }}\nSee LogEntry."
-        },
-        "logName": {
-          "description": "Optional. A default log resource name that is assigned to all log entries in entries that do not specify a value for log_name:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\" or \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
-          "type": "string"
-        },
-        "entries": {
-          "description": "Required. The log entries to write. Values supplied for the fields log_name, resource, and labels in this entries.write request are added to those log entries that do not provide their own values for the fields.To improve throughput and to avoid exceeding the quota limit for calls to entries.write, you should write multiple log entries at once rather than calling this method for each individual log entry.",
-          "type": "array",
-          "items": {
-            "$ref": "LogEntry"
-          }
-        },
-        "partialSuccess": {
-          "description": "Optional. Whether valid entries should be written even if some other entries fail due to INVALID_ARGUMENT or PERMISSION_DENIED errors. If any entry is not written, the response status will be the error associated with one of the failed entries and include error details in the form of WriteLogEntriesPartialErrors.",
-          "type": "boolean"
-        }
-      }
+      },
+      "id": "LogSink",
+      "description": "Describes a sink used to export log entries to one of the following destinations in any project: a Cloud Storage bucket, a BigQuery dataset, or a Cloud Pub/Sub topic. A logs filter controls which log entries are exported. The sink must be created within a project or organization."
     },
     "ListLogsResponse": {
-      "description": "Result returned from ListLogs.",
-      "type": "object",
       "properties": {
+        "nextPageToken": {
+          "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.",
+          "type": "string"
+        },
         "logNames": {
           "description": "A list of log names. For example, \"projects/my-project/syslog\" or \"organizations/123/cloudresourcemanager.googleapis.com%2Factivity\".",
           "type": "array",
           "items": {
             "type": "string"
           }
-        },
-        "nextPageToken": {
-          "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.",
-          "type": "string"
         }
       },
-      "id": "ListLogsResponse"
+      "id": "ListLogsResponse",
+      "description": "Result returned from ListLogs.",
+      "type": "object"
     },
     "HttpRequest": {
-      "id": "HttpRequest",
       "description": "A common proto for logging HTTP requests. Only contains semantics defined by the HTTP specification. Product-specific logging information MUST be defined in a separate message.",
       "type": "object",
       "properties": {
-        "latency": {
-          "description": "The request processing latency on the server, from the time the request was received until the response was sent.",
-          "format": "google-duration",
+        "cacheValidatedWithOriginServer": {
+          "description": "Whether or not the response was validated with the origin server before being served from cache. This field is only meaningful if cache_hit is True.",
+          "type": "boolean"
+        },
+        "status": {
+          "description": "The response code indicating the status of response. Examples: 200, 404.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "referer": {
+          "description": "The referer URL of the request, as defined in HTTP/1.1 Header Field Definitions (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html).",
           "type": "string"
         },
+        "latency": {
+          "type": "string",
+          "description": "The request processing latency on the server, from the time the request was received until the response was sent.",
+          "format": "google-duration"
+        },
         "userAgent": {
           "description": "The user agent sent by the client. Example: \"Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Q312461; .NET CLR 1.0.3705)\".",
           "type": "string"
@@ -1421,13 +621,13 @@
           "description": "The request method. Examples: \"GET\", \"HEAD\", \"PUT\", \"POST\".",
           "type": "string"
         },
-        "responseSize": {
-          "description": "The size of the HTTP response message sent back to the client, in bytes, including the response headers and the response body.",
+        "requestSize": {
+          "description": "The size of the HTTP request message in bytes, including the request headers and the request body.",
           "format": "int64",
           "type": "string"
         },
-        "requestSize": {
-          "description": "The size of the HTTP request message in bytes, including the request headers and the request body.",
+        "responseSize": {
+          "description": "The size of the HTTP response message sent back to the client, in bytes, including the response headers and the response body.",
           "format": "int64",
           "type": "string"
         },
@@ -1450,53 +650,32 @@
         "cacheHit": {
           "description": "Whether or not an entity was served from cache (with or without validation).",
           "type": "boolean"
-        },
-        "cacheValidatedWithOriginServer": {
-          "description": "Whether or not the response was validated with the origin server before being served from cache. This field is only meaningful if cache_hit is True.",
-          "type": "boolean"
-        },
-        "status": {
-          "description": "The response code indicating the status of response. Examples: 200, 404.",
-          "format": "int32",
-          "type": "integer"
-        },
-        "referer": {
-          "description": "The referer URL of the request, as defined in HTTP/1.1 Header Field Definitions (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html).",
-          "type": "string"
         }
-      }
+      },
+      "id": "HttpRequest"
     },
     "ListSinksResponse": {
       "description": "Result returned from ListSinks.",
       "type": "object",
       "properties": {
-        "nextPageToken": {
-          "description": "If there might be more results than appear in this response, then nextPageToken is included. To get the next set of results, call the same method again using the value of nextPageToken as pageToken.",
-          "type": "string"
-        },
         "sinks": {
           "description": "A list of sinks.",
           "type": "array",
           "items": {
             "$ref": "LogSink"
           }
+        },
+        "nextPageToken": {
+          "description": "If there might be more results than appear in this response, then nextPageToken is included. To get the next set of results, call the same method again using the value of nextPageToken as pageToken.",
+          "type": "string"
         }
       },
       "id": "ListSinksResponse"
     },
     "LabelDescriptor": {
-      "id": "LabelDescriptor",
       "description": "A description of a label.",
       "type": "object",
       "properties": {
-        "key": {
-          "description": "The label key.",
-          "type": "string"
-        },
-        "description": {
-          "description": "A human-readable description for the label.",
-          "type": "string"
-        },
         "valueType": {
           "description": "The type of data that can be assigned to the label.",
           "type": "string",
@@ -1510,13 +689,834 @@
             "BOOL",
             "INT64"
           ]
+        },
+        "key": {
+          "description": "The label key.",
+          "type": "string"
+        },
+        "description": {
+          "description": "A human-readable description for the label.",
+          "type": "string"
+        }
+      },
+      "id": "LabelDescriptor"
+    },
+    "MonitoredResourceDescriptor": {
+      "id": "MonitoredResourceDescriptor",
+      "description": "An object that describes the schema of a MonitoredResource object using a type name and a set of labels. For example, the monitored resource descriptor for Google Compute Engine VM instances has a type of \"gce_instance\" and specifies the use of the labels \"instance_id\" and \"zone\" to identify particular VM instances.Different APIs can support different monitored resource types. APIs generally provide a list method that returns the monitored resource descriptors used by the API.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string",
+          "description": "Optional. The resource name of the monitored resource descriptor: \"projects/{project_id}/monitoredResourceDescriptors/{type}\" where {type} is the value of the type field in this object and {project_id} is a project ID that provides API-specific context for accessing the type. APIs that do not use project information can use the resource name format \"monitoredResourceDescriptors/{type}\"."
+        },
+        "displayName": {
+          "description": "Optional. A concise name for the monitored resource type that might be displayed in user interfaces. It should be a Title Cased Noun Phrase, without any article or other determiners. For example, \"Google Cloud SQL Database\".",
+          "type": "string"
+        },
+        "description": {
+          "description": "Optional. A detailed description of the monitored resource type that might be used in documentation.",
+          "type": "string"
+        },
+        "type": {
+          "description": "Required. The monitored resource type. For example, the type \"cloudsql_database\" represents databases in Google Cloud SQL. The maximum length of this value is 256 characters.",
+          "type": "string"
+        },
+        "labels": {
+          "description": "Required. A set of labels used to describe instances of this monitored resource type. For example, an individual Google Cloud SQL database is identified by values for the labels \"database_id\" and \"zone\".",
+          "type": "array",
+          "items": {
+            "$ref": "LabelDescriptor"
+          }
         }
       }
+    },
+    "LogEntrySourceLocation": {
+      "description": "Additional information about the source code location that produced the log entry.",
+      "type": "object",
+      "properties": {
+        "file": {
+          "description": "Optional. Source file name. Depending on the runtime environment, this might be a simple name or a fully-qualified name.",
+          "type": "string"
+        },
+        "function": {
+          "description": "Optional. Human-readable name of the function or method being invoked, with optional context such as the class or package name. This information may be used in contexts such as the logs viewer, where a file and line number are less meaningful. The format can vary by language. For example: qual.if.ied.Class.method (Java), dir/package.func (Go), function (Python).",
+          "type": "string"
+        },
+        "line": {
+          "description": "Optional. Line within the source file. 1-based; 0 indicates no line number available.",
+          "format": "int64",
+          "type": "string"
+        }
+      },
+      "id": "LogEntrySourceLocation"
+    },
+    "ListLogEntriesResponse": {
+      "description": "Result returned from ListLogEntries.",
+      "type": "object",
+      "properties": {
+        "entries": {
+          "description": "A list of log entries.",
+          "type": "array",
+          "items": {
+            "$ref": "LogEntry"
+          }
+        },
+        "nextPageToken": {
+          "description": "If there might be more results than those appearing in this response, then nextPageToken is included. To get the next set of results, call this method again using the value of nextPageToken as pageToken.If a value for next_page_token appears and the entries field is empty, it means that the search found no log entries so far but it did not have time to search all the possible log entries. Retry the method with this value for page_token to continue the search. Alternatively, consider speeding up the search by changing your filter to specify a single log name or resource type, or to narrow the time range of the search.",
+          "type": "string"
+        }
+      },
+      "id": "ListLogEntriesResponse"
     }
   },
   "protocol": "rest",
   "icons": {
-    "x16": "http://www.google.com/images/icons/product/search-16.gif",
-    "x32": "http://www.google.com/images/icons/product/search-32.gif"
-  }
+    "x32": "http://www.google.com/images/icons/product/search-32.gif",
+    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+  },
+  "canonicalName": "Logging",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform.read-only": {
+          "description": "View your data across Google Cloud Platform services"
+        },
+        "https://www.googleapis.com/auth/logging.admin": {
+          "description": "Administrate log data for your projects"
+        },
+        "https://www.googleapis.com/auth/logging.read": {
+          "description": "View log data for your projects"
+        },
+        "https://www.googleapis.com/auth/logging.write": {
+          "description": "Submit log data for your projects"
+        },
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
+    }
+  },
+  "rootUrl": "https://logging.googleapis.com/",
+  "ownerDomain": "google.com",
+  "name": "logging",
+  "batchPath": "batch",
+  "title": "Stackdriver Logging API",
+  "ownerName": "Google",
+  "resources": {
+    "projects": {
+      "resources": {
+        "logs": {
+          "methods": {
+            "delete": {
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "logName"
+              ],
+              "httpMethod": "DELETE",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "logName": {
+                  "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/logs/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v2beta1/projects/{projectsId}/logs/{logsId}",
+              "path": "v2beta1/{+logName}",
+              "id": "logging.projects.logs.delete",
+              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted."
+            },
+            "list": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "parent"
+              ],
+              "response": {
+                "$ref": "ListLogsResponse"
+              },
+              "parameters": {
+                "pageToken": {
+                  "type": "string",
+                  "location": "query",
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call."
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "parent": {
+                  "location": "path",
+                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "flatPath": "v2beta1/projects/{projectsId}/logs",
+              "id": "logging.projects.logs.list",
+              "path": "v2beta1/{+parent}/logs",
+              "description": "Lists the logs in projects or organizations. Only logs that have entries are listed."
+            }
+          }
+        },
+        "sinks": {
+          "methods": {
+            "create": {
+              "id": "logging.projects.sinks.create",
+              "path": "v2beta1/{+parent}/sinks",
+              "request": {
+                "$ref": "LogSink"
+              },
+              "description": "Creates a sink that exports specified log entries to a destination. The export of newly-ingested log entries begins immediately, unless the current time is outside the sink's start and end times or the sink's writer_identity is not permitted to write to the destination. A sink can export log entries only from the resource owning the sink.",
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "parent"
+              ],
+              "response": {
+                "$ref": "LogSink"
+              },
+              "parameters": {
+                "uniqueWriterIdentity": {
+                  "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@system.gserviceaccount.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
+                  "type": "boolean",
+                  "location": "query"
+                },
+                "parent": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The resource in which to create the sink:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\nExamples: \"projects/my-logging-project\", \"organizations/123456789\"."
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "flatPath": "v2beta1/projects/{projectsId}/sinks"
+            },
+            "delete": {
+              "description": "Deletes a sink. If the sink has a unique writer_identity, then that service account is also deleted.",
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "sinkName"
+              ],
+              "httpMethod": "DELETE",
+              "parameters": {
+                "sinkName": {
+                  "pattern": "^projects/[^/]+/sinks/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The full resource name of the sink to delete, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nIt is an error if the sink does not exist. Example: \"projects/my-project-id/sinks/my-sink-id\". It is an error if the sink does not exist.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "flatPath": "v2beta1/projects/{projectsId}/sinks/{sinksId}",
+              "path": "v2beta1/{+sinkName}",
+              "id": "logging.projects.sinks.delete"
+            },
+            "list": {
+              "id": "logging.projects.sinks.list",
+              "path": "v2beta1/{+parent}/sinks",
+              "description": "Lists sinks.",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "parent"
+              ],
+              "response": {
+                "$ref": "ListSinksResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "parameters": {
+                "parent": {
+                  "location": "path",
+                  "description": "Required. The parent resource whose sinks are to be listed. Examples: \"projects/my-logging-project\", \"organizations/123456789\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                },
+                "pageToken": {
+                  "location": "query",
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+                  "type": "string"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32",
+                  "type": "integer"
+                }
+              },
+              "flatPath": "v2beta1/projects/{projectsId}/sinks"
+            },
+            "get": {
+              "id": "logging.projects.sinks.get",
+              "path": "v2beta1/{+sinkName}",
+              "description": "Gets a sink.",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "sinkName"
+              ],
+              "response": {
+                "$ref": "LogSink"
+              },
+              "parameters": {
+                "sinkName": {
+                  "description": "Required. The parent resource name of the sink:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/sinks/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "flatPath": "v2beta1/projects/{projectsId}/sinks/{sinksId}"
+            },
+            "update": {
+              "response": {
+                "$ref": "LogSink"
+              },
+              "parameterOrder": [
+                "sinkName"
+              ],
+              "httpMethod": "PUT",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "sinkName": {
+                  "description": "Required. The full resource name of the sink to update, including the parent resource and the sink identifier:\n\"projects/[PROJECT_ID]/sinks/[SINK_ID]\"\n\"organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]\"\nExample: \"projects/my-project-id/sinks/my-sink-id\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/sinks/[^/]+$",
+                  "location": "path"
+                },
+                "uniqueWriterIdentity": {
+                  "location": "query",
+                  "description": "Optional. See sinks.create for a description of this field. When updating a sink, the effect of this field on the value of writer_identity in the updated sink depends on both the old and new values of this field:\nIf the old and new values of this field are both false or both true, then there is no change to the sink's writer_identity.\nIf the old value was false and the new value is true, then writer_identity is changed to a unique service account.\nIt is an error if the old value was true and the new value is false.",
+                  "type": "boolean"
+                }
+              },
+              "flatPath": "v2beta1/projects/{projectsId}/sinks/{sinksId}",
+              "path": "v2beta1/{+sinkName}",
+              "id": "logging.projects.sinks.update",
+              "description": "Updates a sink. If the named sink doesn't exist, then this method is identical to sinks.create. If the named sink does exist, then this method replaces the following fields in the existing sink with values from the new sink: destination, filter, output_version_format, start_time, and end_time. The updated filter might also have a new writer_identity; see the unique_writer_identity field.",
+              "request": {
+                "$ref": "LogSink"
+              }
+            }
+          }
+        },
+        "metrics": {
+          "methods": {
+            "delete": {
+              "flatPath": "v2beta1/projects/{projectsId}/metrics/{metricsId}",
+              "id": "logging.projects.metrics.delete",
+              "path": "v2beta1/{+metricName}",
+              "description": "Deletes a logs-based metric.",
+              "httpMethod": "DELETE",
+              "parameterOrder": [
+                "metricName"
+              ],
+              "response": {
+                "$ref": "Empty"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.write"
+              ],
+              "parameters": {
+                "metricName": {
+                  "description": "The resource name of the metric to delete:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\n",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/metrics/[^/]+$",
+                  "location": "path"
+                }
+              }
+            },
+            "list": {
+              "description": "Lists logs-based metrics.",
+              "response": {
+                "$ref": "ListLogMetricsResponse"
+              },
+              "parameterOrder": [
+                "parent"
+              ],
+              "httpMethod": "GET",
+              "parameters": {
+                "pageSize": {
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                },
+                "parent": {
+                  "location": "path",
+                  "description": "Required. The name of the project containing the metrics:\n\"projects/[PROJECT_ID]\"\n",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                },
+                "pageToken": {
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+                  "type": "string",
+                  "location": "query"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "flatPath": "v2beta1/projects/{projectsId}/metrics",
+              "path": "v2beta1/{+parent}/metrics",
+              "id": "logging.projects.metrics.list"
+            },
+            "get": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "metricName"
+              ],
+              "response": {
+                "$ref": "LogMetric"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "parameters": {
+                "metricName": {
+                  "location": "path",
+                  "description": "The resource name of the desired metric:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\n",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/metrics/[^/]+$"
+                }
+              },
+              "flatPath": "v2beta1/projects/{projectsId}/metrics/{metricsId}",
+              "id": "logging.projects.metrics.get",
+              "path": "v2beta1/{+metricName}",
+              "description": "Gets a logs-based metric."
+            },
+            "update": {
+              "description": "Creates or updates a logs-based metric.",
+              "request": {
+                "$ref": "LogMetric"
+              },
+              "httpMethod": "PUT",
+              "parameterOrder": [
+                "metricName"
+              ],
+              "response": {
+                "$ref": "LogMetric"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.write"
+              ],
+              "parameters": {
+                "metricName": {
+                  "pattern": "^projects/[^/]+/metrics/[^/]+$",
+                  "location": "path",
+                  "description": "The resource name of the metric to update:\n\"projects/[PROJECT_ID]/metrics/[METRIC_ID]\"\nThe updated metric must be provided in the request and it's name field must be the same as [METRIC_ID] If the metric does not exist in [PROJECT_ID], then a new metric is created.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v2beta1/projects/{projectsId}/metrics/{metricsId}",
+              "id": "logging.projects.metrics.update",
+              "path": "v2beta1/{+metricName}"
+            },
+            "create": {
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "parent"
+              ],
+              "response": {
+                "$ref": "LogMetric"
+              },
+              "parameters": {
+                "parent": {
+                  "description": "The resource name of the project in which to create the metric:\n\"projects/[PROJECT_ID]\"\nThe new metric must be provided in the request.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.write"
+              ],
+              "flatPath": "v2beta1/projects/{projectsId}/metrics",
+              "id": "logging.projects.metrics.create",
+              "path": "v2beta1/{+parent}/metrics",
+              "request": {
+                "$ref": "LogMetric"
+              },
+              "description": "Creates a logs-based metric."
+            }
+          }
+        }
+      }
+    },
+    "billingAccounts": {
+      "resources": {
+        "logs": {
+          "methods": {
+            "delete": {
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "logName"
+              ],
+              "httpMethod": "DELETE",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "logName": {
+                  "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^billingAccounts/[^/]+/logs/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v2beta1/billingAccounts/{billingAccountsId}/logs/{logsId}",
+              "path": "v2beta1/{+logName}",
+              "id": "logging.billingAccounts.logs.delete",
+              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted."
+            },
+            "list": {
+              "response": {
+                "$ref": "ListLogsResponse"
+              },
+              "parameterOrder": [
+                "parent"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "parameters": {
+                "pageToken": {
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "parent": {
+                  "pattern": "^billingAccounts/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v2beta1/billingAccounts/{billingAccountsId}/logs",
+              "path": "v2beta1/{+parent}/logs",
+              "id": "logging.billingAccounts.logs.list",
+              "description": "Lists the logs in projects or organizations. Only logs that have entries are listed."
+            }
+          }
+        }
+      }
+    },
+    "monitoredResourceDescriptors": {
+      "methods": {
+        "list": {
+          "description": "Lists the descriptors for monitored resource types used by Stackdriver Logging.",
+          "response": {
+            "$ref": "ListMonitoredResourceDescriptorsResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "GET",
+          "parameters": {
+            "pageToken": {
+              "location": "query",
+              "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+              "type": "string"
+            },
+            "pageSize": {
+              "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+              "format": "int32",
+              "type": "integer",
+              "location": "query"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only",
+            "https://www.googleapis.com/auth/logging.admin",
+            "https://www.googleapis.com/auth/logging.read"
+          ],
+          "flatPath": "v2beta1/monitoredResourceDescriptors",
+          "path": "v2beta1/monitoredResourceDescriptors",
+          "id": "logging.monitoredResourceDescriptors.list"
+        }
+      }
+    },
+    "organizations": {
+      "resources": {
+        "logs": {
+          "methods": {
+            "delete": {
+              "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted.",
+              "httpMethod": "DELETE",
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "logName"
+              ],
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/logging.admin"
+              ],
+              "parameters": {
+                "logName": {
+                  "description": "Required. The resource name of the log to delete:\n\"projects/[PROJECT_ID]/logs/[LOG_ID]\"\n\"organizations/[ORGANIZATION_ID]/logs/[LOG_ID]\"\n[LOG_ID] must be URL-encoded. For example, \"projects/my-project-id/logs/syslog\", \"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity\". For more information about log names, see LogEntry.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^organizations/[^/]+/logs/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v2beta1/organizations/{organizationsId}/logs/{logsId}",
+              "id": "logging.organizations.logs.delete",
+              "path": "v2beta1/{+logName}"
+            },
+            "list": {
+              "response": {
+                "$ref": "ListLogsResponse"
+              },
+              "parameterOrder": [
+                "parent"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/logging.admin",
+                "https://www.googleapis.com/auth/logging.read"
+              ],
+              "parameters": {
+                "parent": {
+                  "location": "path",
+                  "description": "Required. The resource name that owns the logs:\n\"projects/[PROJECT_ID]\"\n\"organizations/[ORGANIZATION_ID]\"\n",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^organizations/[^/]+$"
+                },
+                "pageToken": {
+                  "location": "query",
+                  "description": "Optional. If present, then retrieve the next batch of results from the preceding call to this method. pageToken must be the value of nextPageToken from the previous response. The values of other method parameters should be identical to those in the previous call.",
+                  "type": "string"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "Optional. The maximum number of results to return from this request. Non-positive values are ignored. The presence of nextPageToken in the response indicates that more results might be available.",
+                  "format": "int32",
+                  "type": "integer"
+                }
+              },
+              "flatPath": "v2beta1/organizations/{organizationsId}/logs",
+              "path": "v2beta1/{+parent}/logs",
+              "id": "logging.organizations.logs.list",
+              "description": "Lists the logs in projects or organizations. Only logs that have entries are listed."
+            }
+          }
+        }
+      }
+    },
+    "entries": {
+      "methods": {
+        "list": {
+          "request": {
+            "$ref": "ListLogEntriesRequest"
+          },
+          "description": "Lists log entries. Use this method to retrieve log entries from Stackdriver Logging. For ways to export log entries, see Exporting Logs.",
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "ListLogEntriesResponse"
+          },
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only",
+            "https://www.googleapis.com/auth/logging.admin",
+            "https://www.googleapis.com/auth/logging.read"
+          ],
+          "flatPath": "v2beta1/entries:list",
+          "id": "logging.entries.list",
+          "path": "v2beta1/entries:list"
+        },
+        "write": {
+          "path": "v2beta1/entries:write",
+          "id": "logging.entries.write",
+          "description": "Writes log entries to Stackdriver Logging. All log entries are written by this method.",
+          "request": {
+            "$ref": "WriteLogEntriesRequest"
+          },
+          "response": {
+            "$ref": "WriteLogEntriesResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/logging.admin",
+            "https://www.googleapis.com/auth/logging.write"
+          ],
+          "parameters": {},
+          "flatPath": "v2beta1/entries:write"
+        }
+      }
+    }
+  },
+  "parameters": {
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
+    },
+    "bearer_token": {
+      "location": "query",
+      "description": "OAuth bearer token.",
+      "type": "string"
+    },
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string",
+      "location": "query"
+    },
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "$.xgafv": {
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "alt": {
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string",
+      "location": "query"
+    },
+    "access_token": {
+      "description": "OAuth access token.",
+      "type": "string",
+      "location": "query"
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    }
+  },
+  "version": "v2beta1",
+  "baseUrl": "https://logging.googleapis.com/",
+  "kind": "discovery#restDescription",
+  "description": "Writes log entries and manages your Stackdriver Logging configuration.",
+  "servicePath": ""
 }
diff --git a/logging/v2beta1/logging-gen.go b/logging/v2beta1/logging-gen.go
index cb0fde1..12ce7b1 100644
--- a/logging/v2beta1/logging-gen.go
+++ b/logging/v2beta1/logging-gen.go
@@ -77,9 +77,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	BillingAccounts *BillingAccountsService
 
@@ -99,6 +100,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewBillingAccountsService(s *Service) *BillingAccountsService {
 	rs := &BillingAccountsService{s: s}
 	rs.Logs = NewBillingAccountsLogsService(s)
@@ -1459,7 +1464,8 @@
 }
 
 // Delete: Deletes all the log entries in a log. The log reappears if it
-// receives new entries.
+// receives new entries. Log entries written shortly before the delete
+// operation might not be deleted.
 func (r *BillingAccountsLogsService) Delete(logName string) *BillingAccountsLogsDeleteCall {
 	c := &BillingAccountsLogsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.logName = logName
@@ -1497,6 +1503,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2beta1/{+logName}")
@@ -1547,7 +1554,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
+	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted.",
 	//   "flatPath": "v2beta1/billingAccounts/{billingAccountsId}/logs/{logsId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "logging.billingAccounts.logs.delete",
@@ -1654,6 +1661,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1819,6 +1827,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.listlogentriesrequest)
 	if err != nil {
@@ -1964,6 +1973,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.writelogentriesrequest)
 	if err != nil {
@@ -2115,6 +2125,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2231,7 +2242,8 @@
 }
 
 // Delete: Deletes all the log entries in a log. The log reappears if it
-// receives new entries.
+// receives new entries. Log entries written shortly before the delete
+// operation might not be deleted.
 func (r *OrganizationsLogsService) Delete(logName string) *OrganizationsLogsDeleteCall {
 	c := &OrganizationsLogsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.logName = logName
@@ -2269,6 +2281,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2beta1/{+logName}")
@@ -2319,7 +2332,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
+	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted.",
 	//   "flatPath": "v2beta1/organizations/{organizationsId}/logs/{logsId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "logging.organizations.logs.delete",
@@ -2426,6 +2439,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2552,7 +2566,8 @@
 }
 
 // Delete: Deletes all the log entries in a log. The log reappears if it
-// receives new entries.
+// receives new entries. Log entries written shortly before the delete
+// operation might not be deleted.
 func (r *ProjectsLogsService) Delete(logName string) *ProjectsLogsDeleteCall {
 	c := &ProjectsLogsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.logName = logName
@@ -2590,6 +2605,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2beta1/{+logName}")
@@ -2640,7 +2656,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries.",
+	//   "description": "Deletes all the log entries in a log. The log reappears if it receives new entries. Log entries written shortly before the delete operation might not be deleted.",
 	//   "flatPath": "v2beta1/projects/{projectsId}/logs/{logsId}",
 	//   "httpMethod": "DELETE",
 	//   "id": "logging.projects.logs.delete",
@@ -2747,6 +2763,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2912,6 +2929,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logmetric)
 	if err != nil {
@@ -3047,6 +3065,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2beta1/{+metricName}")
@@ -3185,6 +3204,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3346,6 +3366,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3511,6 +3532,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logmetric)
 	if err != nil {
@@ -3626,11 +3648,11 @@
 // "uniqueWriterIdentity": Determines the kind of IAM identity returned
 // as writer_identity in the new sink. If this value is omitted or set
 // to false, and if the sink's parent is a project, then the value
-// returned as writer_identity is cloud-logs@google.com, the same
-// identity used before the addition of writer identities to this API.
-// The sink's destination must be in the same project as the sink
-// itself.If this field is set to true, or if the sink is owned by a
-// non-project resource such as an organization, then the value of
+// returned as writer_identity is cloud-logs@system.gserviceaccount.com,
+// the same identity used before the addition of writer identities to
+// this API. The sink's destination must be in the same project as the
+// sink itself.If this field is set to true, or if the sink is owned by
+// a non-project resource such as an organization, then the value of
 // writer_identity will be a unique service account used only for
 // exports from the new sink. For more information, see writer_identity
 // in LogSink.
@@ -3670,6 +3692,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink)
 	if err != nil {
@@ -3741,7 +3764,7 @@
 	//       "type": "string"
 	//     },
 	//     "uniqueWriterIdentity": {
-	//       "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@google.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
+	//       "description": "Optional. Determines the kind of IAM identity returned as writer_identity in the new sink. If this value is omitted or set to false, and if the sink's parent is a project, then the value returned as writer_identity is cloud-logs@system.gserviceaccount.com, the same identity used before the addition of writer identities to this API. The sink's destination must be in the same project as the sink itself.If this field is set to true, or if the sink is owned by a non-project resource such as an organization, then the value of writer_identity will be a unique service account used only for exports from the new sink. For more information, see writer_identity in LogSink.",
 	//       "location": "query",
 	//       "type": "boolean"
 	//     }
@@ -3810,6 +3833,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v2beta1/{+sinkName}")
@@ -3947,6 +3971,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4108,6 +4133,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4294,6 +4320,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink)
 	if err != nil {
diff --git a/manufacturers/v1/manufacturers-gen.go b/manufacturers/v1/manufacturers-gen.go
index 891c35b..020a763 100644
--- a/manufacturers/v1/manufacturers-gen.go
+++ b/manufacturers/v1/manufacturers-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Products = NewAccountsProductsService(s)
@@ -435,6 +440,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -598,6 +604,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/mirror/v1/mirror-gen.go b/mirror/v1/mirror-gen.go
index fb63974..198052a 100644
--- a/mirror/v1/mirror-gen.go
+++ b/mirror/v1/mirror-gen.go
@@ -69,9 +69,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 
@@ -93,6 +94,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	return rs
@@ -1305,6 +1310,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -1449,6 +1455,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "contacts/{id}")
@@ -1555,6 +1562,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1681,6 +1689,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.contact)
 	if err != nil {
@@ -1807,6 +1816,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1922,6 +1932,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.contact)
 	if err != nil {
@@ -2055,6 +2066,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.contact)
 	if err != nil {
@@ -2197,6 +2209,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2333,6 +2346,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2457,6 +2471,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2583,6 +2598,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "subscriptions/{id}")
@@ -2678,6 +2694,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscription)
 	if err != nil {
@@ -2805,6 +2822,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2919,6 +2937,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscription)
 	if err != nil {
@@ -3050,6 +3069,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "timeline/{id}")
@@ -3157,6 +3177,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3337,6 +3358,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.timelineitem)
 	if err != nil {
@@ -3586,6 +3608,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3769,6 +3792,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.timelineitem)
 	if err != nil {
@@ -3956,6 +3980,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.timelineitem)
 	if err != nil {
@@ -4157,6 +4182,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "timeline/{itemId}/attachments/{attachmentId}")
@@ -4274,6 +4300,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4478,6 +4505,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "timeline/{itemId}/attachments")
@@ -4679,6 +4707,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/ml/v1beta1/ml-api.json b/ml/v1beta1/ml-api.json
index b790eca..366f165 100644
--- a/ml/v1beta1/ml-api.json
+++ b/ml/v1beta1/ml-api.json
@@ -1,704 +1,27 @@
 {
-  "canonicalName": "Cloud Machine Learning",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        }
-      }
-    }
-  },
-  "rootUrl": "https://ml.googleapis.com/",
-  "ownerDomain": "google.com",
-  "name": "ml",
-  "batchPath": "batch",
-  "title": "Google Cloud Machine Learning",
-  "ownerName": "Google",
-  "resources": {
-    "projects": {
-      "resources": {
-        "operations": {
-          "methods": {
-            "list": {
-              "flatPath": "v1beta1/projects/{projectsId}/operations",
-              "id": "ml.projects.operations.list",
-              "path": "v1beta1/{+name}/operations",
-              "description": "Lists operations that match the specified filter in the request. If the\nserver doesn't support this method, it returns `UNIMPLEMENTED`.\n\nNOTE: the `name` binding below allows API services to override the binding\nto use different resource name schemes, such as `users/*/operations`.",
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "name"
-              ],
-              "response": {
-                "$ref": "GoogleLongrunning__ListOperationsResponse"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "parameters": {
-                "filter": {
-                  "location": "query",
-                  "description": "The standard list filter.",
-                  "type": "string"
-                },
-                "name": {
-                  "location": "path",
-                  "description": "The name of the operation collection.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$"
-                },
-                "pageToken": {
-                  "location": "query",
-                  "description": "The standard list page token.",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "description": "The standard list page size.",
-                  "format": "int32",
-                  "type": "integer",
-                  "location": "query"
-                }
-              }
-            },
-            "get": {
-              "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice.",
-              "response": {
-                "$ref": "GoogleLongrunning__Operation"
-              },
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "name"
-              ],
-              "parameters": {
-                "name": {
-                  "description": "The name of the operation resource.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/operations/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "flatPath": "v1beta1/projects/{projectsId}/operations/{operationsId}",
-              "path": "v1beta1/{+name}",
-              "id": "ml.projects.operations.get"
-            },
-            "cancel": {
-              "description": "Starts asynchronous cancellation on a long-running operation.  The server\nmakes a best effort to cancel the operation, but success is not\nguaranteed.  If the server doesn't support this method, it returns\n`google.rpc.Code.UNIMPLEMENTED`.  Clients can use\nOperations.GetOperation or\nother methods to check whether the cancellation succeeded or whether the\noperation completed despite cancellation. On successful cancellation,\nthe operation is not deleted; instead, it becomes an operation with\nan Operation.error value with a google.rpc.Status.code of 1,\ncorresponding to `Code.CANCELLED`.",
-              "parameterOrder": [
-                "name"
-              ],
-              "response": {
-                "$ref": "GoogleProtobuf__Empty"
-              },
-              "httpMethod": "POST",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "parameters": {
-                "name": {
-                  "description": "The name of the operation resource to be cancelled.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/operations/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/operations/{operationsId}:cancel",
-              "path": "v1beta1/{+name}:cancel",
-              "id": "ml.projects.operations.cancel"
-            },
-            "delete": {
-              "parameterOrder": [
-                "name"
-              ],
-              "httpMethod": "DELETE",
-              "response": {
-                "$ref": "GoogleProtobuf__Empty"
-              },
-              "parameters": {
-                "name": {
-                  "description": "The name of the operation resource to be deleted.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/operations/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "flatPath": "v1beta1/projects/{projectsId}/operations/{operationsId}",
-              "path": "v1beta1/{+name}",
-              "id": "ml.projects.operations.delete",
-              "description": "Deletes a long-running operation. This method indicates that the client is\nno longer interested in the operation result. It does not cancel the\noperation. If the server doesn't support this method, it returns\n`google.rpc.Code.UNIMPLEMENTED`."
-            }
-          }
-        },
-        "models": {
-          "methods": {
-            "delete": {
-              "httpMethod": "DELETE",
-              "response": {
-                "$ref": "GoogleLongrunning__Operation"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "parameters": {
-                "name": {
-                  "location": "path",
-                  "description": "Required. The name of the model.\n\nAuthorization: requires `Editor` role on the parent project.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/models/[^/]+$"
-                }
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}",
-              "id": "ml.projects.models.delete",
-              "path": "v1beta1/{+name}",
-              "description": "Deletes a model.\n\nYou can only delete a model if there are no versions in it. You can delete\nversions by calling\n[projects.models.versions.delete](/ml/reference/rest/v1beta1/projects.models.versions/delete)."
-            },
-            "list": {
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "parameters": {
-                "pageToken": {
-                  "description": "Optional. A page token to request the next page of results.\n\nYou get the token from the `next_page_token` field of the response from\nthe previous call.",
-                  "type": "string",
-                  "location": "query"
-                },
-                "pageSize": {
-                  "location": "query",
-                  "description": "Optional. The number of models to retrieve per \"page\" of results. If there\nare more remaining results than this number, the response message will\ncontain a valid value in the `next_page_token` field.\n\nThe default value is 20, and the maximum page size is 100.",
-                  "format": "int32",
-                  "type": "integer"
-                },
-                "parent": {
-                  "description": "Required. The name of the project whose models are to be listed.\n\nAuthorization: requires `Viewer` role on the specified project.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/models",
-              "path": "v1beta1/{+parent}/models",
-              "id": "ml.projects.models.list",
-              "description": "Lists the models in a project.\n\nEach project can contain multiple models, and each model can have multiple\nversions.",
-              "parameterOrder": [
-                "parent"
-              ],
-              "httpMethod": "GET",
-              "response": {
-                "$ref": "GoogleCloudMlV1beta1__ListModelsResponse"
-              }
-            },
-            "get": {
-              "httpMethod": "GET",
-              "response": {
-                "$ref": "GoogleCloudMlV1beta1__Model"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "parameters": {
-                "name": {
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/models/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The name of the model.\n\nAuthorization: requires `Viewer` role on the parent project."
-                }
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}",
-              "id": "ml.projects.models.get",
-              "path": "v1beta1/{+name}",
-              "description": "Gets information about a model, including its name, the description (if\nset), and the default version (if at least one version of the model has\nbeen deployed)."
-            },
-            "create": {
-              "response": {
-                "$ref": "GoogleCloudMlV1beta1__Model"
-              },
-              "parameterOrder": [
-                "parent"
-              ],
-              "httpMethod": "POST",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "parameters": {
-                "parent": {
-                  "location": "path",
-                  "description": "Required. The project name.\n\nAuthorization: requires `Editor` role on the specified project.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$"
-                }
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/models",
-              "path": "v1beta1/{+parent}/models",
-              "id": "ml.projects.models.create",
-              "description": "Creates a model which will later contain one or more versions.\n\nYou must add at least one version before you can request predictions from\nthe model. Add versions by calling\n[projects.models.versions.create](/ml/reference/rest/v1beta1/projects.models.versions/create).",
-              "request": {
-                "$ref": "GoogleCloudMlV1beta1__Model"
-              }
-            }
-          },
-          "resources": {
-            "versions": {
-              "methods": {
-                "delete": {
-                  "description": "Deletes a model version.\n\nEach model can have multiple versions deployed and in use at any given\ntime. Use this method to remove a single version.\n\nNote: You cannot delete the version that is set as the default version\nof the model unless it is the only remaining version.",
-                  "response": {
-                    "$ref": "GoogleLongrunning__Operation"
-                  },
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "httpMethod": "DELETE",
-                  "parameters": {
-                    "name": {
-                      "location": "path",
-                      "description": "Required. The name of the version. You can get the names of all the\nversions of a model by calling\n[projects.models.versions.list](/ml/reference/rest/v1beta1/projects.models.versions/list).\n\nAuthorization: requires `Editor` role on the parent project.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/models/[^/]+/versions/[^/]+$"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}",
-                  "path": "v1beta1/{+name}",
-                  "id": "ml.projects.models.versions.delete"
-                },
-                "list": {
-                  "path": "v1beta1/{+parent}/versions",
-                  "id": "ml.projects.models.versions.list",
-                  "description": "Gets basic information about all the versions of a model.\n\nIf you expect that a model has a lot of versions, or if you need to handle\nonly a limited number of results at a time, you can request that the list\nbe retrieved in batches (called pages):",
-                  "parameterOrder": [
-                    "parent"
-                  ],
-                  "httpMethod": "GET",
-                  "response": {
-                    "$ref": "GoogleCloudMlV1beta1__ListVersionsResponse"
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform"
-                  ],
-                  "parameters": {
-                    "pageToken": {
-                      "location": "query",
-                      "description": "Optional. A page token to request the next page of results.\n\nYou get the token from the `next_page_token` field of the response from\nthe previous call.",
-                      "type": "string"
-                    },
-                    "pageSize": {
-                      "description": "Optional. The number of versions to retrieve per \"page\" of results. If\nthere are more remaining results than this number, the response message\nwill contain a valid value in the `next_page_token` field.\n\nThe default value is 20, and the maximum page size is 100.",
-                      "format": "int32",
-                      "type": "integer",
-                      "location": "query"
-                    },
-                    "parent": {
-                      "location": "path",
-                      "description": "Required. The name of the model for which to list the version.\n\nAuthorization: requires `Viewer` role on the parent project.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/models/[^/]+$"
-                    }
-                  },
-                  "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}/versions"
-                },
-                "get": {
-                  "httpMethod": "GET",
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "response": {
-                    "$ref": "GoogleCloudMlV1beta1__Version"
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform"
-                  ],
-                  "parameters": {
-                    "name": {
-                      "location": "path",
-                      "description": "Required. The name of the version.\n\nAuthorization: requires `Viewer` role on the parent project.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/models/[^/]+/versions/[^/]+$"
-                    }
-                  },
-                  "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}",
-                  "id": "ml.projects.models.versions.get",
-                  "path": "v1beta1/{+name}",
-                  "description": "Gets information about a model version.\n\nModels can have multiple versions. You can call\n[projects.models.versions.list](/ml/reference/rest/v1beta1/projects.models.versions/list)\nto get the same information that this method returns for all of the\nversions of a model."
-                },
-                "create": {
-                  "description": "Creates a new version of a model from a trained TensorFlow model.\n\nIf the version created in the cloud by this call is the first deployed\nversion of the specified model, it will be made the default version of the\nmodel. When you add a version to a model that already has one or more\nversions, the default version does not automatically change. If you want a\nnew version to be the default, you must call\n[projects.models.versions.setDefault](/ml/reference/rest/v1beta1/projects.models.versions/setDefault).",
-                  "request": {
-                    "$ref": "GoogleCloudMlV1beta1__Version"
-                  },
-                  "httpMethod": "POST",
-                  "parameterOrder": [
-                    "parent"
-                  ],
-                  "response": {
-                    "$ref": "GoogleLongrunning__Operation"
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform"
-                  ],
-                  "parameters": {
-                    "parent": {
-                      "pattern": "^projects/[^/]+/models/[^/]+$",
-                      "location": "path",
-                      "description": "Required. The name of the model.\n\nAuthorization: requires `Editor` role on the parent project.",
-                      "required": true,
-                      "type": "string"
-                    }
-                  },
-                  "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}/versions",
-                  "id": "ml.projects.models.versions.create",
-                  "path": "v1beta1/{+parent}/versions"
-                },
-                "setDefault": {
-                  "httpMethod": "POST",
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "response": {
-                    "$ref": "GoogleCloudMlV1beta1__Version"
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform"
-                  ],
-                  "parameters": {
-                    "name": {
-                      "pattern": "^projects/[^/]+/models/[^/]+/versions/[^/]+$",
-                      "location": "path",
-                      "description": "Required. The name of the version to make the default for the model. You\ncan get the names of all the versions of a model by calling\n[projects.models.versions.list](/ml/reference/rest/v1beta1/projects.models.versions/list).\n\nAuthorization: requires `Editor` role on the parent project.",
-                      "required": true,
-                      "type": "string"
-                    }
-                  },
-                  "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}:setDefault",
-                  "id": "ml.projects.models.versions.setDefault",
-                  "path": "v1beta1/{+name}:setDefault",
-                  "description": "Designates a version to be the default for the model.\n\nThe default version is used for prediction requests made against the model\nthat don't specify a version.\n\nThe first version to be created for a model is automatically set as the\ndefault. You must make any subsequent changes to the default version\nsetting manually using this method.",
-                  "request": {
-                    "$ref": "GoogleCloudMlV1beta1__SetDefaultVersionRequest"
-                  }
-                }
-              }
-            }
-          }
-        },
-        "jobs": {
-          "methods": {
-            "cancel": {
-              "flatPath": "v1beta1/projects/{projectsId}/jobs/{jobsId}:cancel",
-              "id": "ml.projects.jobs.cancel",
-              "path": "v1beta1/{+name}:cancel",
-              "description": "Cancels a running job.",
-              "request": {
-                "$ref": "GoogleCloudMlV1beta1__CancelJobRequest"
-              },
-              "httpMethod": "POST",
-              "parameterOrder": [
-                "name"
-              ],
-              "response": {
-                "$ref": "GoogleProtobuf__Empty"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "parameters": {
-                "name": {
-                  "description": "Required. The name of the job to cancel.\n\nAuthorization: requires `Editor` role on the parent project.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/jobs/[^/]+$",
-                  "location": "path"
-                }
-              }
-            },
-            "list": {
-              "httpMethod": "GET",
-              "response": {
-                "$ref": "GoogleCloudMlV1beta1__ListJobsResponse"
-              },
-              "parameterOrder": [
-                "parent"
-              ],
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "parameters": {
-                "parent": {
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The name of the project for which to list jobs.\n\nAuthorization: requires `Viewer` role on the specified project.",
-                  "required": true,
-                  "type": "string"
-                },
-                "filter": {
-                  "location": "query",
-                  "description": "Optional. Specifies the subset of jobs to retrieve.",
-                  "type": "string"
-                },
-                "pageToken": {
-                  "type": "string",
-                  "location": "query",
-                  "description": "Optional. A page token to request the next page of results.\n\nYou get the token from the `next_page_token` field of the response from\nthe previous call."
-                },
-                "pageSize": {
-                  "description": "Optional. The number of jobs to retrieve per \"page\" of results. If there\nare more remaining results than this number, the response message will\ncontain a valid value in the `next_page_token` field.\n\nThe default value is 20, and the maximum page size is 100.",
-                  "format": "int32",
-                  "type": "integer",
-                  "location": "query"
-                }
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/jobs",
-              "id": "ml.projects.jobs.list",
-              "path": "v1beta1/{+parent}/jobs",
-              "description": "Lists the jobs in the project."
-            },
-            "get": {
-              "description": "Describes a job.",
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "name"
-              ],
-              "response": {
-                "$ref": "GoogleCloudMlV1beta1__Job"
-              },
-              "parameters": {
-                "name": {
-                  "location": "path",
-                  "description": "Required. The name of the job to get the description of.\n\nAuthorization: requires `Viewer` role on the parent project.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/jobs/[^/]+$"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "flatPath": "v1beta1/projects/{projectsId}/jobs/{jobsId}",
-              "id": "ml.projects.jobs.get",
-              "path": "v1beta1/{+name}"
-            },
-            "create": {
-              "id": "ml.projects.jobs.create",
-              "path": "v1beta1/{+parent}/jobs",
-              "request": {
-                "$ref": "GoogleCloudMlV1beta1__Job"
-              },
-              "description": "Creates a training or a batch prediction job.",
-              "httpMethod": "POST",
-              "parameterOrder": [
-                "parent"
-              ],
-              "response": {
-                "$ref": "GoogleCloudMlV1beta1__Job"
-              },
-              "parameters": {
-                "parent": {
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "description": "Required. The project name.\n\nAuthorization: requires `Editor` role on the specified project.",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform"
-              ],
-              "flatPath": "v1beta1/projects/{projectsId}/jobs"
-            }
-          }
-        }
-      },
-      "methods": {
-        "predict": {
-          "response": {
-            "$ref": "GoogleApi__HttpBody"
-          },
-          "parameterOrder": [
-            "name"
-          ],
-          "httpMethod": "POST",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ],
-          "parameters": {
-            "name": {
-              "location": "path",
-              "description": "Required. The resource name of a model or a version.\n\nAuthorization: requires `Viewer` role on the parent project.",
-              "required": true,
-              "type": "string",
-              "pattern": "^projects/.+$"
-            }
-          },
-          "flatPath": "v1beta1/projects/{projectsId}:predict",
-          "path": "v1beta1/{+name}:predict",
-          "id": "ml.projects.predict",
-          "description": "Performs prediction on the data in the request.\n\nResponses are very similar to requests. There are two top-level fields,\neach of which are JSON lists:\n\n\u003cdl\u003e\n  \u003cdt\u003epredictions\u003c/dt\u003e\n  \u003cdd\u003eThe list of predictions, one per instance in the request.\u003c/dd\u003e\n  \u003cdt\u003eerror\u003c/dt\u003e\n  \u003cdd\u003eAn error message returned instead of a prediction list if any\n      instance produced an error.\u003c/dd\u003e\n\u003c/dl\u003e\n\nIf the call is successful, the response body will contain one prediction\nentry per instance in the request body. If prediction fails for any\ninstance, the response body will contain no predictions and will contian\na single error entry instead.\n\nEven though there is one prediction per instance, the format of a\nprediction is not directly related to the format of an instance.\nPredictions take whatever format is specified in the outputs collection\ndefined in the model. The collection of predictions is returned in a JSON\nlist. Each member of the list can be a simple value, a list, or a JSON\nobject of any complexity. If your model has more than one output tensor,\neach prediction will be a JSON object containing a name/value pair for each\noutput. The names identify the output aliases in the graph.\n\nThe following examples show some possible responses:\n\nA simple set of predictions for three input instances, where each\nprediction is an integer value:\n\u003cpre\u003e\n{\"predictions\": [5, 4, 3]}\n\u003c/pre\u003e\nA more complex set of predictions, each containing two named values that\ncorrespond to output tensors, named **label** and **scores** respectively.\nThe value of **label** is the predicted category (\"car\" or \"beach\") and\n**scores** contains a list of probabilities for that instance across the\npossible categories.\n\u003cpre\u003e\n{\"predictions\": [{\"label\": \"beach\", \"scores\": [0.1, 0.9]},\n                 {\"label\": \"car\", \"scores\": [0.75, 0.25]}]}\n\u003c/pre\u003e\nA response when there is an error processing an input instance:\n\u003cpre\u003e\n{\"error\": \"Divide by zero\"}\n\u003c/pre\u003e",
-          "request": {
-            "$ref": "GoogleCloudMlV1beta1__PredictRequest"
-          }
-        },
-        "getConfig": {
-          "httpMethod": "GET",
-          "parameterOrder": [
-            "name"
-          ],
-          "response": {
-            "$ref": "GoogleCloudMlV1beta1__GetConfigResponse"
-          },
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform"
-          ],
-          "parameters": {
-            "name": {
-              "location": "path",
-              "description": "Required. The project name.\n\nAuthorization: requires `Viewer` role on the specified project.",
-              "required": true,
-              "type": "string",
-              "pattern": "^projects/[^/]+$"
-            }
-          },
-          "flatPath": "v1beta1/projects/{projectsId}:getConfig",
-          "id": "ml.projects.getConfig",
-          "path": "v1beta1/{+name}:getConfig",
-          "description": "Get the service account information associated with your project. You need\nthis information in order to grant the service account persmissions for\nthe Google Cloud Storage location where you put your model training code\nfor training the model with Google Cloud Machine Learning."
-        }
-      }
-    }
-  },
-  "parameters": {
-    "pp": {
-      "description": "Pretty-print response.",
-      "type": "boolean",
-      "default": "true",
-      "location": "query"
-    },
-    "oauth_token": {
-      "location": "query",
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string"
-    },
-    "bearer_token": {
-      "location": "query",
-      "description": "OAuth bearer token.",
-      "type": "string"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "location": "query",
-      "description": "Returns response with indentations and line breaks.",
-      "type": "boolean",
-      "default": "true"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "fields": {
-      "location": "query",
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "type": "string",
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "location": "query",
-      "enum": [
-        "1",
-        "2"
-      ]
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "type": "string",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "location": "query",
-      "description": "Data format for response.",
-      "default": "json",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ]
-    },
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "type": "string",
-      "location": "query",
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters."
-    }
-  },
-  "version": "v1beta1",
-  "baseUrl": "https://ml.googleapis.com/",
-  "kind": "discovery#restDescription",
-  "servicePath": "",
-  "description": "An API to enable creating and using machine learning models.",
-  "basePath": "",
-  "revision": "20170111",
   "documentationLink": "https://cloud.google.com/ml/",
   "id": "ml:v1beta1",
+  "revision": "20170207",
   "discoveryVersion": "v1",
   "version_module": "True",
   "schemas": {
     "GoogleCloudMlV1beta1__TrainingOutput": {
+      "description": "Represents results of a training job. Output only.",
       "type": "object",
       "properties": {
+        "completedTrialCount": {
+          "description": "The number of hyperparameter tuning trials that completed successfully.\nOnly set for hyperparameter tuning jobs.",
+          "format": "int64",
+          "type": "string"
+        },
         "isHyperparameterTuningJob": {
           "description": "Whether this job is a hyperparameter tuning job.",
           "type": "boolean"
         },
         "consumedMLUnits": {
+          "type": "number",
           "description": "The amount of ML units consumed by the job.",
-          "format": "double",
-          "type": "number"
+          "format": "double"
         },
         "trials": {
           "description": "Results for individual Hyperparameter trials.\nOnly set for hyperparameter tuning jobs.",
@@ -706,38 +29,68 @@
           "items": {
             "$ref": "GoogleCloudMlV1beta1__HyperparameterOutput"
           }
+        }
+      },
+      "id": "GoogleCloudMlV1beta1__TrainingOutput"
+    },
+    "GoogleCloudMlV1__Version": {
+      "properties": {
+        "runtimeVersion": {
+          "description": "Optional. The Google Cloud ML runtime version to use for this deployment.\nIf not set, Google Cloud ML will choose a version.",
+          "type": "string"
         },
-        "completedTrialCount": {
-          "description": "The number of hyperparameter tuning trials that completed successfully.\nOnly set for hyperparameter tuning jobs.",
-          "format": "int64",
+        "lastUseTime": {
+          "description": "Output only. The time the version was last used for prediction.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "description": {
+          "description": "Optional. The description specified for the version when it was created.",
+          "type": "string"
+        },
+        "deploymentUri": {
+          "description": "Required. The Google Cloud Storage location of the trained model used to\ncreate the version. See the\n[overview of model deployment](/ml/docs/concepts/deployment-overview) for\nmore informaiton.\n\nWhen passing Version to\n[projects.models.versions.create](/ml/reference/rest/v1/projects.models.versions/create)\nthe model service uses the specified location as the source of the model.\nOnce deployed, the model version is hosted by the prediction service, so\nthis location is useful only as a historical record.",
+          "type": "string"
+        },
+        "isDefault": {
+          "description": "Output only. If true, this version will be used to handle prediction\nrequests that do not specify a version.\n\nYou can change the default version by calling\n[projects.methods.versions.setDefault](/ml/reference/rest/v1/projects.models.versions/setDefault).",
+          "type": "boolean"
+        },
+        "createTime": {
+          "description": "Output only. The time the version was created.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "name": {
+          "description": "Required.The name specified for the version when it was created.\n\nThe version name must be unique within the model it is created in.",
           "type": "string"
         }
       },
-      "id": "GoogleCloudMlV1beta1__TrainingOutput",
-      "description": "Represents results of a training job. Output only."
+      "id": "GoogleCloudMlV1__Version",
+      "description": "Represents a version of the model.\n\nEach version is a trained model deployed in the cloud, ready to handle\nprediction requests. A model can have multiple versions. You can get\ninformation about all of the versions of a given model by calling\n[projects.models.versions.list](/ml/reference/rest/v1/projects.models.versions/list).",
+      "type": "object"
     },
     "GoogleCloudMlV1beta1__HyperparameterSpec": {
       "description": "Represents a set of hyperparameters to optimize.",
       "type": "object",
       "properties": {
-        "maxParallelTrials": {
-          "description": "Optional. The number of training trials to run concurrently.\nYou can reduce the time it takes to perform hyperparameter tuning by adding\ntrials in parallel. However, each trail only benefits from the information\ngained in completed trials. That means that a trial does not get access to\nthe results of trials running at the same time, which could reduce the\nquality of the overall optimization.\n\nEach trial will use the same scale tier and machine types.\n\nDefaults to one.",
-          "format": "int32",
-          "type": "integer"
-        },
         "goal": {
-          "enum": [
-            "GOAL_TYPE_UNSPECIFIED",
-            "MAXIMIZE",
-            "MINIMIZE"
-          ],
-          "description": "Required. The type of goal to use for tuning. Available types are\n`MAXIMIZE` and `MINIMIZE`.\n\nDefaults to `MAXIMIZE`.",
           "type": "string",
           "enumDescriptions": [
             "Goal Type will default to maximize.",
             "Maximize the goal metric.",
             "Minimize the goal metric."
-          ]
+          ],
+          "enum": [
+            "GOAL_TYPE_UNSPECIFIED",
+            "MAXIMIZE",
+            "MINIMIZE"
+          ],
+          "description": "Required. The type of goal to use for tuning. Available types are\n`MAXIMIZE` and `MINIMIZE`.\n\nDefaults to `MAXIMIZE`."
+        },
+        "hyperparameterMetricTag": {
+          "description": "Optional. The Tensorflow summary tag name to use for optimizing trials. For\ncurrent versions of Tensorflow, this tag name should exactly match what is\nshown in Tensorboard, including all scopes.  For versions of Tensorflow\nprior to 0.12, this should be only the tag passed to tf.Summary.\nBy default, \"training/hptuning/metric\" will be used.",
+          "type": "string"
         },
         "params": {
           "description": "Required. The set of parameters to tune.",
@@ -750,14 +103,51 @@
           "description": "Optional. How many training trials should be attempted to optimize\nthe specified hyperparameters.\n\nDefaults to one.",
           "format": "int32",
           "type": "integer"
+        },
+        "maxParallelTrials": {
+          "description": "Optional. The number of training trials to run concurrently.\nYou can reduce the time it takes to perform hyperparameter tuning by adding\ntrials in parallel. However, each trail only benefits from the information\ngained in completed trials. That means that a trial does not get access to\nthe results of trials running at the same time, which could reduce the\nquality of the overall optimization.\n\nEach trial will use the same scale tier and machine types.\n\nDefaults to one.",
+          "format": "int32",
+          "type": "integer"
         }
       },
       "id": "GoogleCloudMlV1beta1__HyperparameterSpec"
     },
     "GoogleCloudMlV1beta1__OperationMetadata": {
-      "description": "Represents the metadata of the long-running operation.",
-      "type": "object",
       "properties": {
+        "createTime": {
+          "description": "The time the operation was submitted.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "modelName": {
+          "description": "Contains the name of the model associated with the operation.",
+          "type": "string"
+        },
+        "version": {
+          "$ref": "GoogleCloudMlV1beta1__Version",
+          "description": "Contains the version associated with the operation."
+        },
+        "endTime": {
+          "description": "The time operation processing completed.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "operationType": {
+          "description": "The operation type.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified operation type.",
+            "An operation to create a new version.",
+            "An operation to delete an existing version.",
+            "An operation to delete an existing model."
+          ],
+          "enum": [
+            "OPERATION_TYPE_UNSPECIFIED",
+            "CREATE_VERSION",
+            "DELETE_VERSION",
+            "DELETE_MODEL"
+          ]
+        },
         "startTime": {
           "description": "The time operation processing started.",
           "format": "google-datetime",
@@ -766,18 +156,18 @@
         "isCancellationRequested": {
           "description": "Indicates whether a request to cancel this operation has been made.",
           "type": "boolean"
-        },
-        "createTime": {
-          "type": "string",
-          "description": "The time the operation was submitted.",
-          "format": "google-datetime"
-        },
-        "modelName": {
-          "description": "Contains the name of the model associated with the operation.",
-          "type": "string"
-        },
+        }
+      },
+      "id": "GoogleCloudMlV1beta1__OperationMetadata",
+      "description": "Represents the metadata of the long-running operation.",
+      "type": "object"
+    },
+    "GoogleCloudMlV1__OperationMetadata": {
+      "description": "Represents the metadata of the long-running operation.",
+      "type": "object",
+      "properties": {
         "version": {
-          "$ref": "GoogleCloudMlV1beta1__Version",
+          "$ref": "GoogleCloudMlV1__Version",
           "description": "Contains the version associated with the operation."
         },
         "endTime": {
@@ -800,9 +190,27 @@
           ],
           "description": "The operation type.",
           "type": "string"
+        },
+        "startTime": {
+          "description": "The time operation processing started.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "isCancellationRequested": {
+          "description": "Indicates whether a request to cancel this operation has been made.",
+          "type": "boolean"
+        },
+        "createTime": {
+          "description": "The time the operation was submitted.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "modelName": {
+          "description": "Contains the name of the model associated with the operation.",
+          "type": "string"
         }
       },
-      "id": "GoogleCloudMlV1beta1__OperationMetadata"
+      "id": "GoogleCloudMlV1__OperationMetadata"
     },
     "GoogleCloudMlV1beta1__ListModelsResponse": {
       "description": "Response message for the ListModels method.",
@@ -823,41 +231,42 @@
       "id": "GoogleCloudMlV1beta1__ListModelsResponse"
     },
     "GoogleLongrunning__Operation": {
-      "description": "This resource represents a long-running operation that is the result of a\nnetwork API call.",
       "type": "object",
       "properties": {
-        "done": {
-          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
-          "type": "boolean"
+        "error": {
+          "description": "The error result of the operation in case of failure or cancellation.",
+          "$ref": "GoogleRpc__Status"
         },
-        "response": {
-          "description": "The normal response of the operation in case of success.  If the original\nmethod returns no data on success, such as `Delete`, the response is\n`google.protobuf.Empty`.  If the original method is standard\n`Get`/`Create`/`Update`, the response should be the resource.  For other\nmethods, the response should have the type `XxxResponse`, where `Xxx`\nis the original method name.  For example, if the original method name\nis `TakeSnapshot()`, the inferred response type is\n`TakeSnapshotResponse`.",
+        "metadata": {
+          "description": "Service-specific metadata associated with the operation.  It typically\ncontains progress information and common metadata such as create time.\nSome services might not provide such metadata.  Any method that returns a\nlong-running operation should document the metadata type, if any.",
           "type": "object",
           "additionalProperties": {
             "description": "Properties of the object. Contains field @type with type URL.",
             "type": "any"
           }
         },
-        "name": {
-          "description": "The server-assigned name, which is only unique within the same service that\noriginally returns it. If you use the default HTTP mapping, the\n`name` should have the format of `operations/some/unique/name`.",
-          "type": "string"
+        "done": {
+          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
+          "type": "boolean"
         },
-        "error": {
-          "$ref": "GoogleRpc__Status",
-          "description": "The error result of the operation in case of failure or cancellation."
-        },
-        "metadata": {
-          "type": "object",
+        "response": {
           "additionalProperties": {
             "description": "Properties of the object. Contains field @type with type URL.",
             "type": "any"
           },
-          "description": "Service-specific metadata associated with the operation.  It typically\ncontains progress information and common metadata such as create time.\nSome services might not provide such metadata.  Any method that returns a\nlong-running operation should document the metadata type, if any."
+          "description": "The normal response of the operation in case of success.  If the original\nmethod returns no data on success, such as `Delete`, the response is\n`google.protobuf.Empty`.  If the original method is standard\n`Get`/`Create`/`Update`, the response should be the resource.  For other\nmethods, the response should have the type `XxxResponse`, where `Xxx`\nis the original method name.  For example, if the original method name\nis `TakeSnapshot()`, the inferred response type is\n`TakeSnapshotResponse`.",
+          "type": "object"
+        },
+        "name": {
+          "description": "The server-assigned name, which is only unique within the same service that\noriginally returns it. If you use the default HTTP mapping, the\n`name` should have the format of `operations/some/unique/name`.",
+          "type": "string"
         }
       },
-      "id": "GoogleLongrunning__Operation"
+      "id": "GoogleLongrunning__Operation",
+      "description": "This resource represents a long-running operation that is the result of a\nnetwork API call."
     },
     "GoogleCloudMlV1beta1__HyperparameterOutput": {
+      "id": "GoogleCloudMlV1beta1__HyperparameterOutput",
       "description": "Represents the result of a single hyperparameter tuning trial from a\ntraining job. The TrainingOutput object that is returned on successful\ncompletion of a training job with hyperparameter tuning includes a list\nof HyperparameterOutput objects, one for each successful trial.",
       "type": "object",
       "properties": {
@@ -883,43 +292,43 @@
           "description": "The trial id for these results.",
           "type": "string"
         }
-      },
-      "id": "GoogleCloudMlV1beta1__HyperparameterOutput"
+      }
     },
     "GoogleProtobuf__Empty": {
-      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
       "type": "object",
       "properties": {},
-      "id": "GoogleProtobuf__Empty"
+      "id": "GoogleProtobuf__Empty",
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`."
     },
     "GoogleRpc__Status": {
+      "id": "GoogleRpc__Status",
+      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
+      "type": "object",
       "properties": {
-        "message": {
-          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
-          "type": "string"
-        },
         "details": {
+          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
           "type": "array",
           "items": {
+            "type": "object",
             "additionalProperties": {
               "description": "Properties of the object. Contains field @type with type URL.",
               "type": "any"
-            },
-            "type": "object"
-          },
-          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use."
+            }
+          }
         },
         "code": {
-          "type": "integer",
           "description": "The status code, which should be an enum value of google.rpc.Code.",
-          "format": "int32"
+          "format": "int32",
+          "type": "integer"
+        },
+        "message": {
+          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
+          "type": "string"
         }
-      },
-      "id": "GoogleRpc__Status",
-      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
-      "type": "object"
+      }
     },
     "GoogleCloudMlV1beta1__PredictRequest": {
+      "type": "object",
       "properties": {
         "httpBody": {
           "description": "\nRequired. The prediction request body.",
@@ -927,15 +336,46 @@
         }
       },
       "id": "GoogleCloudMlV1beta1__PredictRequest",
-      "description": "Request for predictions to be issued against a trained model.\n\nThe body of the request is a single JSON object with a single top-level\nfield:\n\n\u003cdl\u003e\n  \u003cdt\u003einstances\u003c/dt\u003e\n  \u003cdd\u003eA JSON array containing values representing the instances to use for\n      prediction.\u003c/dd\u003e\n\u003c/dl\u003e\n\nThe structure of each element of the instances list is determined by your\nmodel's input definition. Instances can include named inputs or can contain\nonly unlabeled values.\n\nMost data does not include named inputs. Some instances will be simple\nJSON values (boolean, number, or string). However, instances are often lists\nof simple values, or complex nested lists. Here are some examples of request\nbodies:\n\nCSV data with each row encoded as a string value:\n\u003cpre\u003e\n{\"instances\": [\"1.0,true,\\\\\"x\\\\\"\", \"-2.0,false,\\\\\"y\\\\\"\"]}\n\u003c/pre\u003e\nPlain text:\n\u003cpre\u003e\n{\"instances\": [\"the quick brown fox\", \"la bruja le dio\"]}\n\u003c/pre\u003e\nSentences encoded as lists of words (vectors of strings):\n\u003cpre\u003e\n{\"instances\": [[\"the\",\"quick\",\"brown\"], [\"la\",\"bruja\",\"le\"]]}\n\u003c/pre\u003e\nFloating point scalar values:\n\u003cpre\u003e\n{\"instances\": [0.0, 1.1, 2.2]}\n\u003c/pre\u003e\nVectors of integers:\n\u003cpre\u003e\n{\"instances\": [[0, 1, 2], [3, 4, 5],...]}\n\u003c/pre\u003e\nTensors (in this case, two-dimensional tensors):\n\u003cpre\u003e\n{\"instances\": [[[0, 1, 2], [3, 4, 5]], ...]}\n\u003c/pre\u003e\nImages represented as a three-dimensional list. In this encoding scheme the\nfirst two dimensions represent the rows and columns of the image, and the\nthird contains the R, G, and B values for each pixel.\n\u003cpre\u003e\n{\"instances\": [[[[138, 30, 66], [130, 20, 56], ...]]]]}\n\u003c/pre\u003e\nData must be encoded as UTF-8. If your data uses another character encoding,\nyou must base64 encode the data and mark it as binary. To mark a JSON string\nas binary, replace it with an object with a single attribute named `b`:\n\u003cpre\u003e{\"b\": \"...\"} \u003c/pre\u003e\nFor example:\n\nTwo Serialized tf.Examples (fake data, for illustrative purposes only):\n\u003cpre\u003e\n{\"instances\": [{\"b64\": \"X5ad6u\"}, {\"b64\": \"IA9j4nx\"}]}\n\u003c/pre\u003e\nTwo JPEG image byte strings (fake data, for illustrative purposes only):\n\u003cpre\u003e\n{\"instances\": [{\"b64\": \"ASa8asdf\"}, {\"b64\": \"JLK7ljk3\"}]}\n\u003c/pre\u003e\nIf your data includes named references, format each instance as a JSON object\nwith the named references as the keys:\n\nJSON input data to be preprocessed:\n\u003cpre\u003e\n{\"instances\": [{\"a\": 1.0,  \"b\": true,  \"c\": \"x\"},\n               {\"a\": -2.0, \"b\": false, \"c\": \"y\"}]}\n\u003c/pre\u003e\nSome models have an underlying TensorFlow graph that accepts multiple input\ntensors. In this case, you should use the names of JSON name/value pairs to\nidentify the input tensors, as shown in the following exmaples:\n\nFor a graph with input tensor aliases \"tag\" (string) and \"image\"\n(base64-encoded string):\n\u003cpre\u003e\n{\"instances\": [{\"tag\": \"beach\", \"image\": {\"b64\": \"ASa8asdf\"}},\n               {\"tag\": \"car\", \"image\": {\"b64\": \"JLK7ljk3\"}}]}\n\u003c/pre\u003e\nFor a graph with input tensor aliases \"tag\" (string) and \"image\"\n(3-dimensional array of 8-bit ints):\n\u003cpre\u003e\n{\"instances\": [{\"tag\": \"beach\", \"image\": [[[263, 1, 10], [262, 2, 11], ...]]},\n               {\"tag\": \"car\", \"image\": [[[10, 11, 24], [23, 10, 15], ...]]}]}\n\u003c/pre\u003e\nIf the call is successful, the response body will contain one prediction\nentry per instance in the request body. If prediction fails for any\ninstance, the response body will contain no predictions and will contian\na single error entry instead.",
-      "type": "object"
+      "description": "Request for predictions to be issued against a trained model.\n\nThe body of the request is a single JSON object with a single top-level\nfield:\n\n\u003cdl\u003e\n  \u003cdt\u003einstances\u003c/dt\u003e\n  \u003cdd\u003eA JSON array containing values representing the instances to use for\n      prediction.\u003c/dd\u003e\n\u003c/dl\u003e\n\nThe structure of each element of the instances list is determined by your\nmodel's input definition. Instances can include named inputs or can contain\nonly unlabeled values.\n\nNot all data includes named inputs. Some instances will be simple\nJSON values (boolean, number, or string). However, instances are often lists\nof simple values, or complex nested lists. Here are some examples of request\nbodies:\n\nCSV data with each row encoded as a string value:\n\u003cpre\u003e\n{\"instances\": [\"1.0,true,\\\\\"x\\\\\"\", \"-2.0,false,\\\\\"y\\\\\"\"]}\n\u003c/pre\u003e\nPlain text:\n\u003cpre\u003e\n{\"instances\": [\"the quick brown fox\", \"la bruja le dio\"]}\n\u003c/pre\u003e\nSentences encoded as lists of words (vectors of strings):\n\u003cpre\u003e\n{\n  \"instances\": [\n    [\"the\",\"quick\",\"brown\"],\n    [\"la\",\"bruja\",\"le\"],\n    ...\n  ]\n}\n\u003c/pre\u003e\nFloating point scalar values:\n\u003cpre\u003e\n{\"instances\": [0.0, 1.1, 2.2]}\n\u003c/pre\u003e\nVectors of integers:\n\u003cpre\u003e\n{\n  \"instances\": [\n    [0, 1, 2],\n    [3, 4, 5],\n    ...\n  ]\n}\n\u003c/pre\u003e\nTensors (in this case, two-dimensional tensors):\n\u003cpre\u003e\n{\n  \"instances\": [\n    [\n      [0, 1, 2],\n      [3, 4, 5]\n    ],\n    ...\n  ]\n}\n\u003c/pre\u003e\nImages can be represented different ways. In this encoding scheme the first\ntwo dimensions represent the rows and columns of the image, and the third\ncontains lists (vectors) of the R, G, and B values for each pixel.\n\u003cpre\u003e\n{\n  \"instances\": [\n    [\n      [\n        [138, 30, 66],\n        [130, 20, 56],\n        ...\n      ],\n      [\n        [126, 38, 61],\n        [122, 24, 57],\n        ...\n      ],\n      ...\n    ],\n    ...\n  ]\n}\n\u003c/pre\u003e\nJSON strings must be encoded as UTF-8. To send binary data, you must\nbase64-encode the data and mark it as binary. To mark a JSON string\nas binary, replace it with a JSON object with a single attribute named `b64`:\n\u003cpre\u003e{\"b64\": \"...\"} \u003c/pre\u003e\nFor example:\n\nTwo Serialized tf.Examples (fake data, for illustrative purposes only):\n\u003cpre\u003e\n{\"instances\": [{\"b64\": \"X5ad6u\"}, {\"b64\": \"IA9j4nx\"}]}\n\u003c/pre\u003e\nTwo JPEG image byte strings (fake data, for illustrative purposes only):\n\u003cpre\u003e\n{\"instances\": [{\"b64\": \"ASa8asdf\"}, {\"b64\": \"JLK7ljk3\"}]}\n\u003c/pre\u003e\nIf your data includes named references, format each instance as a JSON object\nwith the named references as the keys:\n\nJSON input data to be preprocessed:\n\u003cpre\u003e\n{\n  \"instances\": [\n    {\n      \"a\": 1.0,\n      \"b\": true,\n      \"c\": \"x\"\n    },\n    {\n      \"a\": -2.0,\n      \"b\": false,\n      \"c\": \"y\"\n    }\n  ]\n}\n\u003c/pre\u003e\nSome models have an underlying TensorFlow graph that accepts multiple input\ntensors. In this case, you should use the names of JSON name/value pairs to\nidentify the input tensors, as shown in the following exmaples:\n\nFor a graph with input tensor aliases \"tag\" (string) and \"image\"\n(base64-encoded string):\n\u003cpre\u003e\n{\n  \"instances\": [\n    {\n      \"tag\": \"beach\",\n      \"image\": {\"b64\": \"ASa8asdf\"}\n    },\n    {\n      \"tag\": \"car\",\n      \"image\": {\"b64\": \"JLK7ljk3\"}\n    }\n  ]\n}\n\u003c/pre\u003e\nFor a graph with input tensor aliases \"tag\" (string) and \"image\"\n(3-dimensional array of 8-bit ints):\n\u003cpre\u003e\n{\n  \"instances\": [\n    {\n      \"tag\": \"beach\",\n      \"image\": [\n        [\n          [138, 30, 66],\n          [130, 20, 56],\n          ...\n        ],\n        [\n          [126, 38, 61],\n          [122, 24, 57],\n          ...\n        ],\n        ...\n      ]\n    },\n    {\n      \"tag\": \"car\",\n      \"image\": [\n        [\n          [255, 0, 102],\n          [255, 0, 97],\n          ...\n        ],\n        [\n          [254, 1, 101],\n          [254, 2, 93],\n          ...\n        ],\n        ...\n      ]\n    },\n    ...\n  ]\n}\n\u003c/pre\u003e\nIf the call is successful, the response body will contain one prediction\nentry per instance in the request body. If prediction fails for any\ninstance, the response body will contain no predictions and will contian\na single error entry instead."
+    },
+    "GoogleApi__HttpBody": {
+      "type": "object",
+      "properties": {
+        "data": {
+          "type": "string",
+          "description": "HTTP body binary data.",
+          "format": "byte"
+        },
+        "contentType": {
+          "description": "The HTTP Content-Type string representing the content type of the body.",
+          "type": "string"
+        }
+      },
+      "id": "GoogleApi__HttpBody",
+      "description": "Message that represents an arbitrary HTTP body. It should only be used for\npayload formats that can't be represented as JSON, such as raw binary or\nan HTML page.\n\n\nThis message can be used both in streaming and non-streaming API methods in\nthe request as well as the response.\n\nIt can be used as a top-level request field, which is convenient if one\nwants to extract parameters from either the URL or HTTP template into the\nrequest fields and also want access to the raw HTTP body.\n\nExample:\n\n    message GetResourceRequest {\n      // A unique request id.\n      string request_id = 1;\n\n      // The raw HTTP body is bound to this field.\n      google.api.HttpBody http_body = 2;\n    }\n\n    service ResourceService {\n      rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);\n      rpc UpdateResource(google.api.HttpBody) returns (google.protobuf.Empty);\n    }\n\nExample with streaming methods:\n\n    service CaldavService {\n      rpc GetCalendar(stream google.api.HttpBody)\n        returns (stream google.api.HttpBody);\n      rpc UpdateCalendar(stream google.api.HttpBody)\n        returns (stream google.api.HttpBody);\n    }\n\nUse of this type only changes how the request and response bodies are\nhandled, all other features will continue to work unchanged."
     },
     "GoogleCloudMlV1beta1__PredictionInput": {
       "description": "Represents input parameters for a prediction job.",
       "type": "object",
       "properties": {
+        "dataFormat": {
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified format.",
+            "The source file is a text file with instances separated by the\nnew-line character.",
+            "The source file is a TFRecord file.",
+            "The source file is a GZIP-compressed TFRecord file."
+          ],
+          "enum": [
+            "DATA_FORMAT_UNSPECIFIED",
+            "TEXT",
+            "TF_RECORD",
+            "TF_RECORD_GZIP"
+          ],
+          "description": "Required. The format of the input data files."
+        },
         "runtimeVersion": {
-          "description": "Optional. The Google Cloud ML runtime version to use for this batch\nprediction. If not set, Google Cloud ML will choose a version.",
+          "description": "Optional. The Google Cloud ML runtime version to use for this batch\nprediction. If not set, Google Cloud ML will pick the runtime version used\nduring the CreateVersion request for this model version, or choose the\nlatest stable version when model version information is not available\nsuch as when the model is specified by uri.",
           "type": "string"
         },
         "inputPaths": {
@@ -966,76 +406,55 @@
           "format": "int64",
           "type": "string"
         },
-        "dataFormat": {
-          "enumDescriptions": [
-            "Unspecified format.",
-            "The source file is a text file with instances separated by the\nnew-line character.",
-            "The source file is a TFRecord file.",
-            "The source file is a GZIP-compressed TFRecord file."
-          ],
-          "enum": [
-            "DATA_FORMAT_UNSPECIFIED",
-            "TEXT",
-            "TF_RECORD",
-            "TF_RECORD_GZIP"
-          ],
-          "description": "Required. The format of the input data files.",
-          "type": "string"
+        "uri": {
+          "type": "string",
+          "description": "Use this field if you want to specify a GCS path to the model to use."
         }
       },
       "id": "GoogleCloudMlV1beta1__PredictionInput"
     },
-    "GoogleApi__HttpBody": {
+    "GoogleCloudMlV1beta1__ListVersionsResponse": {
+      "description": "Response message for the ListVersions method.",
       "type": "object",
       "properties": {
-        "data": {
-          "description": "HTTP body binary data.",
-          "format": "byte",
-          "type": "string"
+        "versions": {
+          "description": "The list of versions.",
+          "type": "array",
+          "items": {
+            "$ref": "GoogleCloudMlV1beta1__Version"
+          }
         },
-        "contentType": {
-          "description": "The HTTP Content-Type string representing the content type of the body.",
+        "nextPageToken": {
+          "description": "Optional. Pass this token as the `page_token` field of the request for a\nsubsequent call.",
           "type": "string"
         }
       },
-      "id": "GoogleApi__HttpBody",
-      "description": "Message that represents an arbitrary HTTP body. It should only be used for\npayload formats that can't be represented as JSON, such as raw binary or\nan HTML page.\n\n\nThis message can be used both in streaming and non-streaming API methods in\nthe request as well as the response.\n\nIt can be used as a top-level request field, which is convenient if one\nwants to extract parameters from either the URL or HTTP template into the\nrequest fields and also want access to the raw HTTP body.\n\nExample:\n\n    message GetResourceRequest {\n      // A unique request id.\n      string request_id = 1;\n\n      // The raw HTTP body is bound to this field.\n      google.api.HttpBody http_body = 2;\n    }\n\n    service ResourceService {\n      rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);\n      rpc UpdateResource(google.api.HttpBody) returns (google.protobuf.Empty);\n    }\n\nExample with streaming methods:\n\n    service CaldavService {\n      rpc GetCalendar(stream google.api.HttpBody)\n        returns (stream google.api.HttpBody);\n      rpc UpdateCalendar(stream google.api.HttpBody)\n        returns (stream google.api.HttpBody);\n    }\n\nUse of this type only changes how the request and response bodies are\nhandled, all other features will continue to work unchanged."
+      "id": "GoogleCloudMlV1beta1__ListVersionsResponse"
     },
     "GoogleCloudMlV1beta1__ListJobsResponse": {
       "description": "Response message for the ListJobs method.",
       "type": "object",
       "properties": {
-        "nextPageToken": {
-          "description": "Optional. Pass this token as the `page_token` field of the request for a\nsubsequent call.",
-          "type": "string"
-        },
         "jobs": {
           "description": "The list of jobs.",
           "type": "array",
           "items": {
             "$ref": "GoogleCloudMlV1beta1__Job"
           }
+        },
+        "nextPageToken": {
+          "description": "Optional. Pass this token as the `page_token` field of the request for a\nsubsequent call.",
+          "type": "string"
         }
       },
       "id": "GoogleCloudMlV1beta1__ListJobsResponse"
     },
     "GoogleCloudMlV1beta1__Version": {
-      "id": "GoogleCloudMlV1beta1__Version",
-      "description": "Represents a version of the model.\n\nEach version is a trained model deployed in the cloud, ready to handle\nprediction requests. A model can have multiple versions. You can get\ninformation about all of the versions of a given model by calling\n[projects.models.versions.list](/ml/reference/rest/v1beta1/projects.models.versions/list).",
-      "type": "object",
       "properties": {
-        "description": {
-          "description": "Optional. The description specified for the version when it was created.",
-          "type": "string"
-        },
         "deploymentUri": {
           "description": "Required. The Google Cloud Storage location of the trained model used to\ncreate the version. See the\n[overview of model deployment](/ml/docs/concepts/deployment-overview) for\nmore informaiton.\n\nWhen passing Version to\n[projects.models.versions.create](/ml/reference/rest/v1beta1/projects.models.versions/create)\nthe model service uses the specified location as the source of the model.\nOnce deployed, the model version is hosted by the prediction service, so\nthis location is useful only as a historical record.",
           "type": "string"
         },
-        "onlinePredictionLogging": {
-          "description": "Optional. If true, enables StackDriver Logging for online prediction.\nDefault is false.",
-          "type": "boolean"
-        },
         "isDefault": {
           "description": "Output only. If true, this version will be used to handle prediction\nrequests that do not specify a version.\n\nYou can change the default version by calling\n[projects.methods.versions.setDefault](/ml/reference/rest/v1beta1/projects.models.versions/setDefault).",
           "type": "boolean"
@@ -1049,37 +468,25 @@
           "description": "Required.The name specified for the version when it was created.\n\nThe version name must be unique within the model it is created in.",
           "type": "string"
         },
+        "runtimeVersion": {
+          "type": "string",
+          "description": "Optional. The Google Cloud ML runtime version to use for this deployment.\nIf not set, Google Cloud ML will choose a version."
+        },
         "lastUseTime": {
           "description": "Output only. The time the version was last used for prediction.",
           "format": "google-datetime",
           "type": "string"
         },
-        "runtimeVersion": {
-          "description": "Optional. The Google Cloud ML runtime version to use for this deployment.\nIf not set, Google Cloud ML will choose a version.",
+        "description": {
+          "description": "Optional. The description specified for the version when it was created.",
           "type": "string"
         }
-      }
-    },
-    "GoogleCloudMlV1beta1__ListVersionsResponse": {
-      "id": "GoogleCloudMlV1beta1__ListVersionsResponse",
-      "description": "Response message for the ListVersions method.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "Optional. Pass this token as the `page_token` field of the request for a\nsubsequent call.",
-          "type": "string"
-        },
-        "versions": {
-          "type": "array",
-          "items": {
-            "$ref": "GoogleCloudMlV1beta1__Version"
-          },
-          "description": "The list of versions."
-        }
-      }
+      },
+      "id": "GoogleCloudMlV1beta1__Version",
+      "description": "Represents a version of the model.\n\nEach version is a trained model deployed in the cloud, ready to handle\nprediction requests. A model can have multiple versions. You can get\ninformation about all of the versions of a given model by calling\n[projects.models.versions.list](/ml/reference/rest/v1beta1/projects.models.versions/list).",
+      "type": "object"
     },
     "GoogleCloudMlV1beta1__Model": {
-      "id": "GoogleCloudMlV1beta1__Model",
       "description": "Represents a machine learning solution.\n\nA model can have multiple versions, each of which is a deployed, trained\nmodel ready to receive prediction requests. The model itself is just a\ncontainer.",
       "type": "object",
       "properties": {
@@ -1098,19 +505,25 @@
           "description": "Optional. The description specified for the model when it was created.",
           "type": "string"
         },
+        "onlinePredictionLogging": {
+          "description": "Optional. If true, enables StackDriver Logging for online prediction.\nDefault is false.",
+          "type": "boolean"
+        },
         "defaultVersion": {
           "$ref": "GoogleCloudMlV1beta1__Version",
           "description": "Output only. The default version of the model. This version will be used to\nhandle prediction requests that do not specify a version.\n\nYou can change the default version by calling\n[projects.methods.versions.setDefault](/ml/reference/rest/v1beta1/projects.models.versions/setDefault)."
         }
-      }
+      },
+      "id": "GoogleCloudMlV1beta1__Model"
     },
     "GoogleCloudMlV1beta1__CancelJobRequest": {
+      "description": "Request message for the CancelJob method.",
       "type": "object",
       "properties": {},
-      "id": "GoogleCloudMlV1beta1__CancelJobRequest",
-      "description": "Request message for the CancelJob method."
+      "id": "GoogleCloudMlV1beta1__CancelJobRequest"
     },
     "GoogleCloudMlV1beta1__Job": {
+      "id": "GoogleCloudMlV1beta1__Job",
       "description": "Represents a training or prediction job.",
       "type": "object",
       "properties": {
@@ -1125,8 +538,8 @@
           "type": "string"
         },
         "predictionOutput": {
-          "$ref": "GoogleCloudMlV1beta1__PredictionOutput",
-          "description": "The current prediction job result."
+          "description": "The current prediction job result.",
+          "$ref": "GoogleCloudMlV1beta1__PredictionOutput"
         },
         "trainingOutput": {
           "$ref": "GoogleCloudMlV1beta1__TrainingOutput",
@@ -1141,10 +554,6 @@
           "$ref": "GoogleCloudMlV1beta1__TrainingInput",
           "description": "Input parameters to create a training job."
         },
-        "predictionInput": {
-          "description": "Input parameters to create a prediction job.",
-          "$ref": "GoogleCloudMlV1beta1__PredictionInput"
-        },
         "state": {
           "enumDescriptions": [
             "The job state is unspecified.",
@@ -1169,27 +578,30 @@
           "description": "Output only. The detailed state of a job.",
           "type": "string"
         },
-        "jobId": {
-          "description": "Required. The user-specified id of the job.",
-          "type": "string"
+        "predictionInput": {
+          "description": "Input parameters to create a prediction job.",
+          "$ref": "GoogleCloudMlV1beta1__PredictionInput"
         },
         "errorMessage": {
           "type": "string",
           "description": "Output only. The details of a failure or a cancellation."
+        },
+        "jobId": {
+          "description": "Required. The user-specified id of the job.",
+          "type": "string"
         }
-      },
-      "id": "GoogleCloudMlV1beta1__Job"
+      }
     },
     "GoogleLongrunning__ListOperationsResponse": {
       "description": "The response message for Operations.ListOperations.",
       "type": "object",
       "properties": {
         "operations": {
+          "description": "A list of operations that matches the specified filter in the request.",
           "type": "array",
           "items": {
             "$ref": "GoogleLongrunning__Operation"
-          },
-          "description": "A list of operations that matches the specified filter in the request."
+          }
         },
         "nextPageToken": {
           "description": "The standard List next-page token.",
@@ -1211,6 +623,10 @@
           "description": "Required. The Python module name to run after installing the packages.",
           "type": "string"
         },
+        "workerType": {
+          "description": "Optional. Specifies the type of virtual machine to use for your training\njob's worker nodes.\n\nThe supported values are the same as those described in the entry for\n`masterType`.\n\nThis value must be present when `scaleTier` is set to `CUSTOM` and\n`workerCount` is greater than zero.",
+          "type": "string"
+        },
         "region": {
           "description": "Required. The Google Compute Engine region to run the training job in.",
           "type": "string"
@@ -1222,29 +638,31 @@
             "type": "string"
           }
         },
-        "workerType": {
-          "description": "Optional. Specifies the type of virtual machine to use for your training\njob's worker nodes.\n\nThe supported values are the same as those described in the entry for\n`masterType`.\n\nThis value must be present when `scaleTier` is set to `CUSTOM` and\n`workerCount` is greater than zero.",
-          "type": "string"
-        },
         "parameterServerType": {
           "description": "Optional. Specifies the type of virtual machine to use for your training\njob's parameter server.\n\nThe supported values are the same as those described in the entry for\n`master_type`.\n\nThis value must be present when `scaleTier` is set to `CUSTOM` and\n`parameter_server_count` is greater than zero.",
           "type": "string"
         },
         "scaleTier": {
-          "type": "string",
           "enumDescriptions": [
             "A single worker instance. This tier is suitable for learning how to use\nCloud ML, and for experimenting with new models using small datasets.",
             "Many workers and a few parameter servers.",
             "A large number of workers with many parameter servers.",
+            "A single worker instance with a GPU.",
             "The CUSTOM tier is not a set tier, but rather enables you to use your\nown cluster specification. When you use this tier, set values to\nconfigure your processing cluster according to these guidelines:\n\n*   You _must_ set `TrainingInput.masterType` to specify the type\n    of machine to use for your master node. This is the only required\n    setting.\n\n*   You _may_ set `TrainingInput.workerCount` to specify the number of\n    workers to use. If you specify one or more workers, you _must_ also\n    set `TrainingInput.workerType` to specify the type of machine to use\n    for your worker nodes.\n\n*   You _may_ set `TrainingInput.parameterServerCount` to specify the\n    number of parameter servers to use. If you specify one or more\n    parameter servers, you _must_ also set\n    `TrainingInput.parameterServerType` to specify the type of machine to\n    use for your parameter servers.\n\nNote that all of your workers must use the same machine type, which can\nbe different from your parameter server type and master type. Your\nparameter servers must likewise use the same machine type, which can be\ndifferent from your worker type and master type."
           ],
           "enum": [
             "BASIC",
             "STANDARD_1",
             "PREMIUM_1",
+            "BASIC_GPU",
             "CUSTOM"
           ],
-          "description": "Required. Specifies the machine types, the number of replicas for workers\nand parameter servers."
+          "description": "Required. Specifies the machine types, the number of replicas for workers\nand parameter servers.",
+          "type": "string"
+        },
+        "jobDir": {
+          "description": "Optional. A GCS path in which to store training outputs and other data\nneeded for training. This path will be passed to your TensorFlow program as\nthe 'job_dir' command-line arg. The benefit of specifying this field is that\nCloud ML will validate the path for use in training.",
+          "type": "string"
         },
         "hyperparameters": {
           "$ref": "GoogleCloudMlV1beta1__HyperparameterSpec",
@@ -1263,9 +681,9 @@
           }
         },
         "workerCount": {
+          "type": "string",
           "description": "Optional. The number of worker replicas to use for the training job. Each\nreplica in the cluster will be of the type specified in `worker_type`.\n\nThis value can only be used when `scale_tier` is set to `CUSTOM`. If you\nset this value, you must also set `worker_type`.",
-          "format": "int64",
-          "type": "string"
+          "format": "int64"
         },
         "masterType": {
           "description": "Optional. Specifies the type of virtual machine to use for your training\njob's master worker.\n\nThe following types are supported:\n\n\u003cdl\u003e\n  \u003cdt\u003estandard\u003c/dt\u003e\n  \u003cdd\u003e\n  A basic machine configuration suitable for training simple models with\n  small to moderate datasets.\n  \u003c/dd\u003e\n  \u003cdt\u003elarge_model\u003c/dt\u003e\n  \u003cdd\u003e\n  A machine with a lot of memory, specially suited for parameter servers\n  when your model is large (having many hidden layers or layers with very\n  large numbers of nodes).\n  \u003c/dd\u003e\n  \u003cdt\u003ecomplex_model_s\u003c/dt\u003e\n  \u003cdd\u003e\n  A machine suitable for the master and workers of the cluster when your\n  model requires more computation than the standard machine can handle\n  satisfactorily.\n  \u003c/dd\u003e\n  \u003cdt\u003ecomplex_model_m\u003c/dt\u003e\n  \u003cdd\u003e\n  A machine with roughly twice the number of cores and roughly double the\n  memory of \u003ccode suppresswarning=\"true\"\u003ecomplex_model_s\u003c/code\u003e.\n  \u003c/dd\u003e\n  \u003cdt\u003ecomplex_model_l\u003c/dt\u003e\n  \u003cdd\u003e\n  A machine with roughly twice the number of cores and roughly double the\n  memory of \u003ccode suppresswarning=\"true\"\u003ecomplex_model_m\u003c/code\u003e.\n  \u003c/dd\u003e\n\u003c/dl\u003e\n\nYou must set this value when `scaleTier` is set to `CUSTOM`.",
@@ -1274,7 +692,6 @@
       }
     },
     "GoogleCloudMlV1beta1__GetConfigResponse": {
-      "id": "GoogleCloudMlV1beta1__GetConfigResponse",
       "description": "Returns service account information associated with a project.",
       "type": "object",
       "properties": {
@@ -1287,15 +704,18 @@
           "description": "The service account Cloud ML uses to access resources in the project.",
           "type": "string"
         }
-      }
+      },
+      "id": "GoogleCloudMlV1beta1__GetConfigResponse"
     },
     "GoogleCloudMlV1beta1__SetDefaultVersionRequest": {
+      "id": "GoogleCloudMlV1beta1__SetDefaultVersionRequest",
       "description": "Request message for the SetDefaultVersion request.",
       "type": "object",
-      "properties": {},
-      "id": "GoogleCloudMlV1beta1__SetDefaultVersionRequest"
+      "properties": {}
     },
     "GoogleCloudMlV1beta1_HyperparameterOutput_HyperparameterMetric": {
+      "description": "An observed value of a metric.",
+      "type": "object",
       "properties": {
         "trainingStep": {
           "description": "The global training step for this metric.",
@@ -1308,61 +728,11 @@
           "type": "number"
         }
       },
-      "id": "GoogleCloudMlV1beta1_HyperparameterOutput_HyperparameterMetric",
-      "description": "An observed value of a metric.",
-      "type": "object"
+      "id": "GoogleCloudMlV1beta1_HyperparameterOutput_HyperparameterMetric"
     },
     "GoogleCloudMlV1beta1__ParameterSpec": {
-      "description": "Represents a single hyperparameter to optimize.",
       "type": "object",
       "properties": {
-        "type": {
-          "description": "Required. The type of the parameter.",
-          "type": "string",
-          "enumDescriptions": [
-            "You must specify a valid type. Using this unspecified type will result in\nan error.",
-            "Type for real-valued parameters.",
-            "Type for integral parameters.",
-            "The parameter is categorical, with a value chosen from the categories\nfield.",
-            "The parameter is real valued, with a fixed set of feasible points. If\n`type==DISCRETE`, feasible_points must be provided, and\n{`min_value`, `max_value`} will be ignored."
-          ],
-          "enum": [
-            "PARAMETER_TYPE_UNSPECIFIED",
-            "DOUBLE",
-            "INTEGER",
-            "CATEGORICAL",
-            "DISCRETE"
-          ]
-        },
-        "parameterName": {
-          "description": "Required. The parameter name must be unique amongst all ParameterConfigs in\na HyperparameterSpec message. E.g., \"learning_rate\".",
-          "type": "string"
-        },
-        "categoricalValues": {
-          "description": "Required if type is `CATEGORICAL`. The list of possible categories.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "minValue": {
-          "description": "Required if type is `DOUBLE` or `INTEGER`. This field\nshould be unset if type is `CATEGORICAL`. This value should be integers if\ntype is INTEGER.",
-          "format": "double",
-          "type": "number"
-        },
-        "discreteValues": {
-          "description": "Required if type is `DISCRETE`.\nA list of feasible points.\nThe list should be in strictly increasing order. For instance, this\nparameter might have possible settings of 1.5, 2.5, and 4.0. This list\nshould not contain more than 1,000 values.",
-          "type": "array",
-          "items": {
-            "format": "double",
-            "type": "number"
-          }
-        },
-        "maxValue": {
-          "description": "Required if typeis `DOUBLE` or `INTEGER`. This field\nshould be unset if type is `CATEGORICAL`. This value should be integers if\ntype is `INTEGER`.",
-          "format": "double",
-          "type": "number"
-        },
         "scaleType": {
           "enum": [
             "NONE",
@@ -1378,9 +748,57 @@
             "Scales the feasible space logarithmically to (0, 1). The entire feasible\nspace must be strictly positive.",
             "Scales the feasible space \"reverse\" logarithmically to (0, 1). The result\nis that values close to the top of the feasible space are spread out more\nthan points near the bottom. The entire feasible space must be strictly\npositive."
           ]
+        },
+        "maxValue": {
+          "description": "Required if typeis `DOUBLE` or `INTEGER`. This field\nshould be unset if type is `CATEGORICAL`. This value should be integers if\ntype is `INTEGER`.",
+          "format": "double",
+          "type": "number"
+        },
+        "type": {
+          "type": "string",
+          "enumDescriptions": [
+            "You must specify a valid type. Using this unspecified type will result in\nan error.",
+            "Type for real-valued parameters.",
+            "Type for integral parameters.",
+            "The parameter is categorical, with a value chosen from the categories\nfield.",
+            "The parameter is real valued, with a fixed set of feasible points. If\n`type==DISCRETE`, feasible_points must be provided, and\n{`min_value`, `max_value`} will be ignored."
+          ],
+          "enum": [
+            "PARAMETER_TYPE_UNSPECIFIED",
+            "DOUBLE",
+            "INTEGER",
+            "CATEGORICAL",
+            "DISCRETE"
+          ],
+          "description": "Required. The type of the parameter."
+        },
+        "categoricalValues": {
+          "description": "Required if type is `CATEGORICAL`. The list of possible categories.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "parameterName": {
+          "description": "Required. The parameter name must be unique amongst all ParameterConfigs in\na HyperparameterSpec message. E.g., \"learning_rate\".",
+          "type": "string"
+        },
+        "minValue": {
+          "description": "Required if type is `DOUBLE` or `INTEGER`. This field\nshould be unset if type is `CATEGORICAL`. This value should be integers if\ntype is INTEGER.",
+          "format": "double",
+          "type": "number"
+        },
+        "discreteValues": {
+          "description": "Required if type is `DISCRETE`.\nA list of feasible points.\nThe list should be in strictly increasing order. For instance, this\nparameter might have possible settings of 1.5, 2.5, and 4.0. This list\nshould not contain more than 1,000 values.",
+          "type": "array",
+          "items": {
+            "format": "double",
+            "type": "number"
+          }
         }
       },
-      "id": "GoogleCloudMlV1beta1__ParameterSpec"
+      "id": "GoogleCloudMlV1beta1__ParameterSpec",
+      "description": "Represents a single hyperparameter to optimize."
     },
     "GoogleCloudMlV1beta1__PredictionOutput": {
       "description": "Represents results of a prediction job.",
@@ -1392,13 +810,13 @@
           "type": "string"
         },
         "outputPath": {
-          "description": "The output Google Cloud Storage location provided at the job creation time.",
-          "type": "string"
+          "type": "string",
+          "description": "The output Google Cloud Storage location provided at the job creation time."
         },
         "nodeHours": {
+          "type": "number",
           "description": "Node hours used by the batch prediction job.",
-          "format": "double",
-          "type": "number"
+          "format": "double"
         },
         "predictionCount": {
           "description": "The number of generated predictions.",
@@ -1410,8 +828,691 @@
     }
   },
   "icons": {
-    "x32": "http://www.google.com/images/icons/product/search-32.gif",
-    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
   },
-  "protocol": "rest"
+  "protocol": "rest",
+  "canonicalName": "Cloud Machine Learning",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
+    }
+  },
+  "rootUrl": "https://ml.googleapis.com/",
+  "ownerDomain": "google.com",
+  "name": "ml",
+  "batchPath": "batch",
+  "title": "Google Cloud Machine Learning",
+  "ownerName": "Google",
+  "resources": {
+    "projects": {
+      "methods": {
+        "getConfig": {
+          "httpMethod": "GET",
+          "parameterOrder": [
+            "name"
+          ],
+          "response": {
+            "$ref": "GoogleCloudMlV1beta1__GetConfigResponse"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "parameters": {
+            "name": {
+              "location": "path",
+              "description": "Required. The project name.\n\nAuthorization: requires `Viewer` role on the specified project.",
+              "required": true,
+              "type": "string",
+              "pattern": "^projects/[^/]+$"
+            }
+          },
+          "flatPath": "v1beta1/projects/{projectsId}:getConfig",
+          "id": "ml.projects.getConfig",
+          "path": "v1beta1/{+name}:getConfig",
+          "description": "Get the service account information associated with your project. You need\nthis information in order to grant the service account persmissions for\nthe Google Cloud Storage location where you put your model training code\nfor training the model with Google Cloud Machine Learning."
+        },
+        "predict": {
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "name"
+          ],
+          "response": {
+            "$ref": "GoogleApi__HttpBody"
+          },
+          "parameters": {
+            "name": {
+              "description": "Required. The resource name of a model or a version.\n\nAuthorization: requires `Viewer` role on the parent project.",
+              "required": true,
+              "type": "string",
+              "pattern": "^projects/.+$",
+              "location": "path"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform"
+          ],
+          "flatPath": "v1beta1/projects/{projectsId}:predict",
+          "id": "ml.projects.predict",
+          "path": "v1beta1/{+name}:predict",
+          "request": {
+            "$ref": "GoogleCloudMlV1beta1__PredictRequest"
+          },
+          "description": "Performs prediction on the data in the request.\n\n**** REMOVE FROM GENERATED DOCUMENTATION"
+        }
+      },
+      "resources": {
+        "operations": {
+          "methods": {
+            "cancel": {
+              "response": {
+                "$ref": "GoogleProtobuf__Empty"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "name": {
+                  "location": "path",
+                  "description": "The name of the operation resource to be cancelled.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/operations/[^/]+$"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectsId}/operations/{operationsId}:cancel",
+              "path": "v1beta1/{+name}:cancel",
+              "id": "ml.projects.operations.cancel",
+              "description": "Starts asynchronous cancellation on a long-running operation.  The server\nmakes a best effort to cancel the operation, but success is not\nguaranteed.  If the server doesn't support this method, it returns\n`google.rpc.Code.UNIMPLEMENTED`.  Clients can use\nOperations.GetOperation or\nother methods to check whether the cancellation succeeded or whether the\noperation completed despite cancellation. On successful cancellation,\nthe operation is not deleted; instead, it becomes an operation with\nan Operation.error value with a google.rpc.Status.code of 1,\ncorresponding to `Code.CANCELLED`."
+            },
+            "delete": {
+              "description": "Deletes a long-running operation. This method indicates that the client is\nno longer interested in the operation result. It does not cancel the\noperation. If the server doesn't support this method, it returns\n`google.rpc.Code.UNIMPLEMENTED`.",
+              "response": {
+                "$ref": "GoogleProtobuf__Empty"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "DELETE",
+              "parameters": {
+                "name": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/operations/[^/]+$",
+                  "location": "path",
+                  "description": "The name of the operation resource to be deleted."
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1beta1/projects/{projectsId}/operations/{operationsId}",
+              "path": "v1beta1/{+name}",
+              "id": "ml.projects.operations.delete"
+            },
+            "list": {
+              "description": "Lists operations that match the specified filter in the request. If the\nserver doesn't support this method, it returns `UNIMPLEMENTED`.\n\nNOTE: the `name` binding below allows API services to override the binding\nto use different resource name schemes, such as `users/*/operations`.",
+              "response": {
+                "$ref": "GoogleLongrunning__ListOperationsResponse"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "GET",
+              "parameters": {
+                "name": {
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path",
+                  "description": "The name of the operation collection.",
+                  "required": true,
+                  "type": "string"
+                },
+                "pageToken": {
+                  "location": "query",
+                  "description": "The standard list page token.",
+                  "type": "string"
+                },
+                "pageSize": {
+                  "type": "integer",
+                  "location": "query",
+                  "description": "The standard list page size.",
+                  "format": "int32"
+                },
+                "filter": {
+                  "type": "string",
+                  "location": "query",
+                  "description": "The standard list filter."
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1beta1/projects/{projectsId}/operations",
+              "path": "v1beta1/{+name}/operations",
+              "id": "ml.projects.operations.list"
+            },
+            "get": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "GoogleLongrunning__Operation"
+              },
+              "parameters": {
+                "name": {
+                  "description": "The name of the operation resource.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/operations/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1beta1/projects/{projectsId}/operations/{operationsId}",
+              "id": "ml.projects.operations.get",
+              "path": "v1beta1/{+name}",
+              "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice."
+            }
+          }
+        },
+        "models": {
+          "resources": {
+            "versions": {
+              "methods": {
+                "delete": {
+                  "path": "v1beta1/{+name}",
+                  "id": "ml.projects.models.versions.delete",
+                  "description": "Deletes a model version.\n\nEach model can have multiple versions deployed and in use at any given\ntime. Use this method to remove a single version.\n\nNote: You cannot delete the version that is set as the default version\nof the model unless it is the only remaining version.",
+                  "response": {
+                    "$ref": "GoogleLongrunning__Operation"
+                  },
+                  "httpMethod": "DELETE",
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "pattern": "^projects/[^/]+/models/[^/]+/versions/[^/]+$",
+                      "location": "path",
+                      "description": "Required. The name of the version. You can get the names of all the\nversions of a model by calling\n[projects.models.versions.list](/ml/reference/rest/v1beta1/projects.models.versions/list).\n\nAuthorization: requires `Editor` role on the parent project.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}"
+                },
+                "list": {
+                  "httpMethod": "GET",
+                  "parameterOrder": [
+                    "parent"
+                  ],
+                  "response": {
+                    "$ref": "GoogleCloudMlV1beta1__ListVersionsResponse"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "parent": {
+                      "pattern": "^projects/[^/]+/models/[^/]+$",
+                      "location": "path",
+                      "description": "Required. The name of the model for which to list the version.\n\nAuthorization: requires `Viewer` role on the parent project.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "pageToken": {
+                      "type": "string",
+                      "location": "query",
+                      "description": "Optional. A page token to request the next page of results.\n\nYou get the token from the `next_page_token` field of the response from\nthe previous call."
+                    },
+                    "pageSize": {
+                      "location": "query",
+                      "description": "Optional. The number of versions to retrieve per \"page\" of results. If\nthere are more remaining results than this number, the response message\nwill contain a valid value in the `next_page_token` field.\n\nThe default value is 20, and the maximum page size is 100.",
+                      "format": "int32",
+                      "type": "integer"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}/versions",
+                  "id": "ml.projects.models.versions.list",
+                  "path": "v1beta1/{+parent}/versions",
+                  "description": "Gets basic information about all the versions of a model.\n\nIf you expect that a model has a lot of versions, or if you need to handle\nonly a limited number of results at a time, you can request that the list\nbe retrieved in batches (called pages):"
+                },
+                "get": {
+                  "response": {
+                    "$ref": "GoogleCloudMlV1beta1__Version"
+                  },
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "httpMethod": "GET",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "pattern": "^projects/[^/]+/models/[^/]+/versions/[^/]+$",
+                      "location": "path",
+                      "description": "Required. The name of the version.\n\nAuthorization: requires `Viewer` role on the parent project.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}",
+                  "path": "v1beta1/{+name}",
+                  "id": "ml.projects.models.versions.get",
+                  "description": "Gets information about a model version.\n\nModels can have multiple versions. You can call\n[projects.models.versions.list](/ml/reference/rest/v1beta1/projects.models.versions/list)\nto get the same information that this method returns for all of the\nversions of a model."
+                },
+                "create": {
+                  "response": {
+                    "$ref": "GoogleLongrunning__Operation"
+                  },
+                  "parameterOrder": [
+                    "parent"
+                  ],
+                  "httpMethod": "POST",
+                  "parameters": {
+                    "parent": {
+                      "location": "path",
+                      "description": "Required. The name of the model.\n\nAuthorization: requires `Editor` role on the parent project.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/models/[^/]+$"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}/versions",
+                  "path": "v1beta1/{+parent}/versions",
+                  "id": "ml.projects.models.versions.create",
+                  "request": {
+                    "$ref": "GoogleCloudMlV1beta1__Version"
+                  },
+                  "description": "Creates a new version of a model from a trained TensorFlow model.\n\nIf the version created in the cloud by this call is the first deployed\nversion of the specified model, it will be made the default version of the\nmodel. When you add a version to a model that already has one or more\nversions, the default version does not automatically change. If you want a\nnew version to be the default, you must call\n[projects.models.versions.setDefault](/ml/reference/rest/v1beta1/projects.models.versions/setDefault)."
+                },
+                "setDefault": {
+                  "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}:setDefault",
+                  "id": "ml.projects.models.versions.setDefault",
+                  "path": "v1beta1/{+name}:setDefault",
+                  "description": "Designates a version to be the default for the model.\n\nThe default version is used for prediction requests made against the model\nthat don't specify a version.\n\nThe first version to be created for a model is automatically set as the\ndefault. You must make any subsequent changes to the default version\nsetting manually using this method.",
+                  "request": {
+                    "$ref": "GoogleCloudMlV1beta1__SetDefaultVersionRequest"
+                  },
+                  "httpMethod": "POST",
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "response": {
+                    "$ref": "GoogleCloudMlV1beta1__Version"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "pattern": "^projects/[^/]+/models/[^/]+/versions/[^/]+$",
+                      "location": "path",
+                      "description": "Required. The name of the version to make the default for the model. You\ncan get the names of all the versions of a model by calling\n[projects.models.versions.list](/ml/reference/rest/v1beta1/projects.models.versions/list).\n\nAuthorization: requires `Editor` role on the parent project.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  }
+                }
+              }
+            }
+          },
+          "methods": {
+            "delete": {
+              "description": "Deletes a model.\n\nYou can only delete a model if there are no versions in it. You can delete\nversions by calling\n[projects.models.versions.delete](/ml/reference/rest/v1beta1/projects.models.versions/delete).",
+              "httpMethod": "DELETE",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "GoogleLongrunning__Operation"
+              },
+              "parameters": {
+                "name": {
+                  "description": "Required. The name of the model.\n\nAuthorization: requires `Editor` role on the parent project.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/models/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}",
+              "id": "ml.projects.models.delete",
+              "path": "v1beta1/{+name}"
+            },
+            "list": {
+              "description": "Lists the models in a project.\n\nEach project can contain multiple models, and each model can have multiple\nversions.",
+              "response": {
+                "$ref": "GoogleCloudMlV1beta1__ListModelsResponse"
+              },
+              "parameterOrder": [
+                "parent"
+              ],
+              "httpMethod": "GET",
+              "parameters": {
+                "pageSize": {
+                  "location": "query",
+                  "description": "Optional. The number of models to retrieve per \"page\" of results. If there\nare more remaining results than this number, the response message will\ncontain a valid value in the `next_page_token` field.\n\nThe default value is 20, and the maximum page size is 100.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "parent": {
+                  "location": "path",
+                  "description": "Required. The name of the project whose models are to be listed.\n\nAuthorization: requires `Viewer` role on the specified project.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                },
+                "pageToken": {
+                  "location": "query",
+                  "description": "Optional. A page token to request the next page of results.\n\nYou get the token from the `next_page_token` field of the response from\nthe previous call.",
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "flatPath": "v1beta1/projects/{projectsId}/models",
+              "path": "v1beta1/{+parent}/models",
+              "id": "ml.projects.models.list"
+            },
+            "get": {
+              "description": "Gets information about a model, including its name, the description (if\nset), and the default version (if at least one version of the model has\nbeen deployed).",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "GoogleCloudMlV1beta1__Model"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "Required. The name of the model.\n\nAuthorization: requires `Viewer` role on the parent project.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/models/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectsId}/models/{modelsId}",
+              "id": "ml.projects.models.get",
+              "path": "v1beta1/{+name}"
+            },
+            "create": {
+              "path": "v1beta1/{+parent}/models",
+              "id": "ml.projects.models.create",
+              "description": "Creates a model which will later contain one or more versions.\n\nYou must add at least one version before you can request predictions from\nthe model. Add versions by calling\n[projects.models.versions.create](/ml/reference/rest/v1beta1/projects.models.versions/create).",
+              "request": {
+                "$ref": "GoogleCloudMlV1beta1__Model"
+              },
+              "response": {
+                "$ref": "GoogleCloudMlV1beta1__Model"
+              },
+              "parameterOrder": [
+                "parent"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "parent": {
+                  "description": "Required. The project name.\n\nAuthorization: requires `Editor` role on the specified project.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectsId}/models"
+            }
+          }
+        },
+        "jobs": {
+          "methods": {
+            "cancel": {
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "GoogleProtobuf__Empty"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "Required. The name of the job to cancel.\n\nAuthorization: requires `Editor` role on the parent project.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/jobs/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectsId}/jobs/{jobsId}:cancel",
+              "id": "ml.projects.jobs.cancel",
+              "path": "v1beta1/{+name}:cancel",
+              "description": "Cancels a running job.",
+              "request": {
+                "$ref": "GoogleCloudMlV1beta1__CancelJobRequest"
+              }
+            },
+            "list": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "parent"
+              ],
+              "response": {
+                "$ref": "GoogleCloudMlV1beta1__ListJobsResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "pageSize": {
+                  "type": "integer",
+                  "location": "query",
+                  "description": "Optional. The number of jobs to retrieve per \"page\" of results. If there\nare more remaining results than this number, the response message will\ncontain a valid value in the `next_page_token` field.\n\nThe default value is 20, and the maximum page size is 100.",
+                  "format": "int32"
+                },
+                "parent": {
+                  "description": "Required. The name of the project for which to list jobs.\n\nAuthorization: requires `Viewer` role on the specified project.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path"
+                },
+                "filter": {
+                  "location": "query",
+                  "description": "Optional. Specifies the subset of jobs to retrieve.",
+                  "type": "string"
+                },
+                "pageToken": {
+                  "description": "Optional. A page token to request the next page of results.\n\nYou get the token from the `next_page_token` field of the response from\nthe previous call.",
+                  "type": "string",
+                  "location": "query"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectsId}/jobs",
+              "id": "ml.projects.jobs.list",
+              "path": "v1beta1/{+parent}/jobs",
+              "description": "Lists the jobs in the project."
+            },
+            "get": {
+              "flatPath": "v1beta1/projects/{projectsId}/jobs/{jobsId}",
+              "id": "ml.projects.jobs.get",
+              "path": "v1beta1/{+name}",
+              "description": "Describes a job.",
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "GET",
+              "response": {
+                "$ref": "GoogleCloudMlV1beta1__Job"
+              },
+              "parameters": {
+                "name": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/jobs/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The name of the job to get the description of.\n\nAuthorization: requires `Viewer` role on the parent project."
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ]
+            },
+            "create": {
+              "path": "v1beta1/{+parent}/jobs",
+              "id": "ml.projects.jobs.create",
+              "description": "Creates a training or a batch prediction job.",
+              "request": {
+                "$ref": "GoogleCloudMlV1beta1__Job"
+              },
+              "response": {
+                "$ref": "GoogleCloudMlV1beta1__Job"
+              },
+              "parameterOrder": [
+                "parent"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform"
+              ],
+              "parameters": {
+                "parent": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path",
+                  "description": "Required. The project name.\n\nAuthorization: requires `Editor` role on the specified project."
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectsId}/jobs"
+            }
+          }
+        }
+      }
+    }
+  },
+  "parameters": {
+    "alt": {
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string",
+      "location": "query"
+    },
+    "pp": {
+      "type": "boolean",
+      "default": "true",
+      "location": "query",
+      "description": "Pretty-print response."
+    },
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    },
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
+    },
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "callback": {
+      "description": "JSONP",
+      "type": "string",
+      "location": "query"
+    }
+  },
+  "version": "v1beta1",
+  "baseUrl": "https://ml.googleapis.com/",
+  "servicePath": "",
+  "description": "An API to enable creating and using machine learning models.",
+  "kind": "discovery#restDescription",
+  "basePath": ""
 }
diff --git a/ml/v1beta1/ml-gen.go b/ml/v1beta1/ml-gen.go
index 04296cc..f3ce20e 100644
--- a/ml/v1beta1/ml-gen.go
+++ b/ml/v1beta1/ml-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Jobs = NewProjectsJobsService(s)
@@ -213,6 +218,145 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// GoogleCloudMlV1__OperationMetadata: Represents the metadata of the
+// long-running operation.
+type GoogleCloudMlV1__OperationMetadata struct {
+	// CreateTime: The time the operation was submitted.
+	CreateTime string `json:"createTime,omitempty"`
+
+	// EndTime: The time operation processing completed.
+	EndTime string `json:"endTime,omitempty"`
+
+	// IsCancellationRequested: Indicates whether a request to cancel this
+	// operation has been made.
+	IsCancellationRequested bool `json:"isCancellationRequested,omitempty"`
+
+	// ModelName: Contains the name of the model associated with the
+	// operation.
+	ModelName string `json:"modelName,omitempty"`
+
+	// OperationType: The operation type.
+	//
+	// Possible values:
+	//   "OPERATION_TYPE_UNSPECIFIED" - Unspecified operation type.
+	//   "CREATE_VERSION" - An operation to create a new version.
+	//   "DELETE_VERSION" - An operation to delete an existing version.
+	//   "DELETE_MODEL" - An operation to delete an existing model.
+	OperationType string `json:"operationType,omitempty"`
+
+	// StartTime: The time operation processing started.
+	StartTime string `json:"startTime,omitempty"`
+
+	// Version: Contains the version associated with the operation.
+	Version *GoogleCloudMlV1__Version `json:"version,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "CreateTime") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "CreateTime") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *GoogleCloudMlV1__OperationMetadata) MarshalJSON() ([]byte, error) {
+	type noMethod GoogleCloudMlV1__OperationMetadata
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// GoogleCloudMlV1__Version: Represents a version of the model.
+//
+// Each version is a trained model deployed in the cloud, ready to
+// handle
+// prediction requests. A model can have multiple versions. You can
+// get
+// information about all of the versions of a given model by
+// calling
+// [projects.models.versions.list](/ml/reference/rest/v1/projects
+// .models.versions/list).
+type GoogleCloudMlV1__Version struct {
+	// CreateTime: Output only. The time the version was created.
+	CreateTime string `json:"createTime,omitempty"`
+
+	// DeploymentUri: Required. The Google Cloud Storage location of the
+	// trained model used to
+	// create the version. See the
+	// [overview of model deployment](/ml/docs/concepts/deployment-overview)
+	// for
+	// more informaiton.
+	//
+	// When passing Version
+	// to
+	// [projects.models.versions.create](/ml/reference/rest/v1/projects.mo
+	// dels.versions/create)
+	// the model service uses the specified location as the source of the
+	// model.
+	// Once deployed, the model version is hosted by the prediction service,
+	// so
+	// this location is useful only as a historical record.
+	DeploymentUri string `json:"deploymentUri,omitempty"`
+
+	// Description: Optional. The description specified for the version when
+	// it was created.
+	Description string `json:"description,omitempty"`
+
+	// IsDefault: Output only. If true, this version will be used to handle
+	// prediction
+	// requests that do not specify a version.
+	//
+	// You can change the default version by
+	// calling
+	// [projects.methods.versions.setDefault](/ml/reference/rest/v1/p
+	// rojects.models.versions/setDefault).
+	IsDefault bool `json:"isDefault,omitempty"`
+
+	// LastUseTime: Output only. The time the version was last used for
+	// prediction.
+	LastUseTime string `json:"lastUseTime,omitempty"`
+
+	// Name: Required.The name specified for the version when it was
+	// created.
+	//
+	// The version name must be unique within the model it is created in.
+	Name string `json:"name,omitempty"`
+
+	// RuntimeVersion: Optional. The Google Cloud ML runtime version to use
+	// for this deployment.
+	// If not set, Google Cloud ML will choose a version.
+	RuntimeVersion string `json:"runtimeVersion,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "CreateTime") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "CreateTime") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *GoogleCloudMlV1__Version) MarshalJSON() ([]byte, error) {
+	type noMethod GoogleCloudMlV1__Version
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // GoogleCloudMlV1beta1HyperparameterOutputHyperparameterMetric: An
 // observed value of a metric.
 type GoogleCloudMlV1beta1HyperparameterOutputHyperparameterMetric struct {
@@ -361,6 +505,16 @@
 	//   "MINIMIZE" - Minimize the goal metric.
 	Goal string `json:"goal,omitempty"`
 
+	// HyperparameterMetricTag: Optional. The Tensorflow summary tag name to
+	// use for optimizing trials. For
+	// current versions of Tensorflow, this tag name should exactly match
+	// what is
+	// shown in Tensorboard, including all scopes.  For versions of
+	// Tensorflow
+	// prior to 0.12, this should be only the tag passed to tf.Summary.
+	// By default, "training/hptuning/metric" will be used.
+	HyperparameterMetricTag string `json:"hyperparameterMetricTag,omitempty"`
+
 	// MaxParallelTrials: Optional. The number of training trials to run
 	// concurrently.
 	// You can reduce the time it takes to perform hyperparameter tuning by
@@ -628,6 +782,11 @@
 	// The model name must be unique within the project it is created in.
 	Name string `json:"name,omitempty"`
 
+	// OnlinePredictionLogging: Optional. If true, enables StackDriver
+	// Logging for online prediction.
+	// Default is false.
+	OnlinePredictionLogging bool `json:"onlinePredictionLogging,omitempty"`
+
 	// Regions: Optional. The list of regions where the model is going to be
 	// deployed.
 	// Currently only one region per model is supported.
@@ -850,7 +1009,7 @@
 // contain
 // only unlabeled values.
 //
-// Most data does not include named inputs. Some instances will be
+// Not all data includes named inputs. Some instances will be
 // simple
 // JSON values (boolean, number, or string). However, instances are
 // often lists
@@ -868,11 +1027,15 @@
 // {"instances": ["the quick brown fox", "la bruja le
 // dio"]}
 // </pre>
-// Sentences encoded as lists of words (vectors of
-// strings):
+// Sentences encoded as lists of words (vectors of strings):
 // <pre>
-// {"instances": [["the","quick","brown"],
-// ["la","bruja","le"]]}
+// {
+//   "instances": [
+//     ["the","quick","brown"],
+//     ["la","bruja","le"],
+//     ...
+//   ]
+// }
 // </pre>
 // Floating point scalar values:
 // <pre>
@@ -880,28 +1043,59 @@
 // </pre>
 // Vectors of integers:
 // <pre>
-// {"instances": [[0, 1, 2], [3, 4, 5],...]}
+// {
+//   "instances": [
+//     [0, 1, 2],
+//     [3, 4, 5],
+//     ...
+//   ]
+// }
 // </pre>
 // Tensors (in this case, two-dimensional tensors):
 // <pre>
-// {"instances": [[[0, 1, 2], [3, 4, 5]], ...]}
+// {
+//   "instances": [
+//     [
+//       [0, 1, 2],
+//       [3, 4, 5]
+//     ],
+//     ...
+//   ]
+// }
 // </pre>
-// Images represented as a three-dimensional list. In this encoding
-// scheme the
-// first two dimensions represent the rows and columns of the image, and
-// the
-// third contains the R, G, and B values for each
+// Images can be represented different ways. In this encoding scheme the
+// first
+// two dimensions represent the rows and columns of the image, and the
+// third
+// contains lists (vectors) of the R, G, and B values for each
 // pixel.
 // <pre>
-// {"instances": [[[[138, 30, 66], [130, 20, 56], ...]]]]}
+// {
+//   "instances": [
+//     [
+//       [
+//         [138, 30, 66],
+//         [130, 20, 56],
+//         ...
+//       ],
+//       [
+//         [126, 38, 61],
+//         [122, 24, 57],
+//         ...
+//       ],
+//       ...
+//     ],
+//     ...
+//   ]
+// }
 // </pre>
-// Data must be encoded as UTF-8. If your data uses another character
-// encoding,
-// you must base64 encode the data and mark it as binary. To mark a JSON
+// JSON strings must be encoded as UTF-8. To send binary data, you
+// must
+// base64-encode the data and mark it as binary. To mark a JSON
 // string
-// as binary, replace it with an object with a single attribute named
-// `b`:
-// <pre>{"b": "..."} </pre>
+// as binary, replace it with a JSON object with a single attribute
+// named `b64`:
+// <pre>{"b64": "..."} </pre>
 // For example:
 //
 // Two Serialized tf.Examples (fake data, for illustrative purposes
@@ -920,8 +1114,20 @@
 //
 // JSON input data to be preprocessed:
 // <pre>
-// {"instances": [{"a": 1.0,  "b": true,  "c": "x"},
-//                {"a": -2.0, "b": false, "c": "y"}]}
+// {
+//   "instances": [
+//     {
+//       "a": 1.0,
+//       "b": true,
+//       "c": "x"
+//     },
+//     {
+//       "a": -2.0,
+//       "b": false,
+//       "c": "y"
+//     }
+//   ]
+// }
 // </pre>
 // Some models have an underlying TensorFlow graph that accepts multiple
 // input
@@ -933,18 +1139,60 @@
 // "image"
 // (base64-encoded string):
 // <pre>
-// {"instances": [{"tag": "beach", "image": {"b64": "ASa8asdf"}},
-//                {"tag": "car", "image": {"b64":
-// "JLK7ljk3"}}]}
+// {
+//   "instances": [
+//     {
+//       "tag": "beach",
+//       "image": {"b64": "ASa8asdf"}
+//     },
+//     {
+//       "tag": "car",
+//       "image": {"b64": "JLK7ljk3"}
+//     }
+//   ]
+// }
 // </pre>
 // For a graph with input tensor aliases "tag" (string) and
 // "image"
 // (3-dimensional array of 8-bit ints):
 // <pre>
-// {"instances": [{"tag": "beach", "image": [[[263, 1, 10], [262, 2,
-// 11], ...]]},
-//                {"tag": "car", "image": [[[10, 11, 24], [23, 10, 15],
-// ...]]}]}
+// {
+//   "instances": [
+//     {
+//       "tag": "beach",
+//       "image": [
+//         [
+//           [138, 30, 66],
+//           [130, 20, 56],
+//           ...
+//         ],
+//         [
+//           [126, 38, 61],
+//           [122, 24, 57],
+//           ...
+//         ],
+//         ...
+//       ]
+//     },
+//     {
+//       "tag": "car",
+//       "image": [
+//         [
+//           [255, 0, 102],
+//           [255, 0, 97],
+//           ...
+//         ],
+//         [
+//           [254, 1, 101],
+//           [254, 2, 93],
+//           ...
+//         ],
+//         ...
+//       ]
+//     },
+//     ...
+//   ]
+// }
 // </pre>
 // If the call is successful, the response body will contain one
 // prediction
@@ -1024,9 +1272,19 @@
 
 	// RuntimeVersion: Optional. The Google Cloud ML runtime version to use
 	// for this batch
-	// prediction. If not set, Google Cloud ML will choose a version.
+	// prediction. If not set, Google Cloud ML will pick the runtime version
+	// used
+	// during the CreateVersion request for this model version, or choose
+	// the
+	// latest stable version when model version information is not
+	// available
+	// such as when the model is specified by uri.
 	RuntimeVersion string `json:"runtimeVersion,omitempty"`
 
+	// Uri: Use this field if you want to specify a GCS path to the model to
+	// use.
+	Uri string `json:"uri,omitempty"`
+
 	// VersionName: Use this field if you want to specify a version of the
 	// model to use. The
 	// string is formatted the same way as `model_version`, with the
@@ -1128,6 +1386,15 @@
 	// Hyperparameters: Optional. The set of Hyperparameters to tune.
 	Hyperparameters *GoogleCloudMlV1beta1__HyperparameterSpec `json:"hyperparameters,omitempty"`
 
+	// JobDir: Optional. A GCS path in which to store training outputs and
+	// other data
+	// needed for training. This path will be passed to your TensorFlow
+	// program as
+	// the 'job_dir' command-line arg. The benefit of specifying this field
+	// is that
+	// Cloud ML will validate the path for use in training.
+	JobDir string `json:"jobDir,omitempty"`
+
 	// MasterType: Optional. Specifies the type of virtual machine to use
 	// for your training
 	// job's master worker.
@@ -1227,6 +1494,7 @@
 	//   "STANDARD_1" - Many workers and a few parameter servers.
 	//   "PREMIUM_1" - A large number of workers with many parameter
 	// servers.
+	//   "BASIC_GPU" - A single worker instance with a GPU.
 	//   "CUSTOM" - The CUSTOM tier is not a set tier, but rather enables
 	// you to use your
 	// own cluster specification. When you use this tier, set values
@@ -1423,11 +1691,6 @@
 	// The version name must be unique within the model it is created in.
 	Name string `json:"name,omitempty"`
 
-	// OnlinePredictionLogging: Optional. If true, enables StackDriver
-	// Logging for online prediction.
-	// Default is false.
-	OnlinePredictionLogging bool `json:"onlinePredictionLogging,omitempty"`
-
 	// RuntimeVersion: Optional. The Google Cloud ML runtime version to use
 	// for this deployment.
 	// If not set, Google Cloud ML will choose a version.
@@ -1774,6 +2037,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1868,68 +2132,7 @@
 
 // Predict: Performs prediction on the data in the request.
 //
-// Responses are very similar to requests. There are two top-level
-// fields,
-// each of which are JSON lists:
-//
-// <dl>
-//   <dt>predictions</dt>
-//   <dd>The list of predictions, one per instance in the request.</dd>
-//   <dt>error</dt>
-//   <dd>An error message returned instead of a prediction list if any
-//       instance produced an error.</dd>
-// </dl>
-//
-// If the call is successful, the response body will contain one
-// prediction
-// entry per instance in the request body. If prediction fails for
-// any
-// instance, the response body will contain no predictions and will
-// contian
-// a single error entry instead.
-//
-// Even though there is one prediction per instance, the format of
-// a
-// prediction is not directly related to the format of an
-// instance.
-// Predictions take whatever format is specified in the outputs
-// collection
-// defined in the model. The collection of predictions is returned in a
-// JSON
-// list. Each member of the list can be a simple value, a list, or a
-// JSON
-// object of any complexity. If your model has more than one output
-// tensor,
-// each prediction will be a JSON object containing a name/value pair
-// for each
-// output. The names identify the output aliases in the graph.
-//
-// The following examples show some possible responses:
-//
-// A simple set of predictions for three input instances, where
-// each
-// prediction is an integer value:
-// <pre>
-// {"predictions": [5, 4, 3]}
-// </pre>
-// A more complex set of predictions, each containing two named values
-// that
-// correspond to output tensors, named **label** and **scores**
-// respectively.
-// The value of **label** is the predicted category ("car" or "beach")
-// and
-// **scores** contains a list of probabilities for that instance across
-// the
-// possible categories.
-// <pre>
-// {"predictions": [{"label": "beach", "scores": [0.1, 0.9]},
-//                  {"label": "car", "scores": [0.75, 0.25]}]}
-// </pre>
-// A response when there is an error processing an input
-// instance:
-// <pre>
-// {"error": "Divide by zero"}
-// </pre>
+// **** REMOVE FROM GENERATED DOCUMENTATION
 func (r *ProjectsService) Predict(name string, googlecloudmlv1beta1__predictrequest *GoogleCloudMlV1beta1__PredictRequest) *ProjectsPredictCall {
 	c := &ProjectsPredictCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.name = name
@@ -1968,6 +2171,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.googlecloudmlv1beta1__predictrequest)
 	if err != nil {
@@ -2023,7 +2227,7 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Performs prediction on the data in the request.\n\nResponses are very similar to requests. There are two top-level fields,\neach of which are JSON lists:\n\n\u003cdl\u003e\n  \u003cdt\u003epredictions\u003c/dt\u003e\n  \u003cdd\u003eThe list of predictions, one per instance in the request.\u003c/dd\u003e\n  \u003cdt\u003eerror\u003c/dt\u003e\n  \u003cdd\u003eAn error message returned instead of a prediction list if any\n      instance produced an error.\u003c/dd\u003e\n\u003c/dl\u003e\n\nIf the call is successful, the response body will contain one prediction\nentry per instance in the request body. If prediction fails for any\ninstance, the response body will contain no predictions and will contian\na single error entry instead.\n\nEven though there is one prediction per instance, the format of a\nprediction is not directly related to the format of an instance.\nPredictions take whatever format is specified in the outputs collection\ndefined in the model. The collection of predictions is returned in a JSON\nlist. Each member of the list can be a simple value, a list, or a JSON\nobject of any complexity. If your model has more than one output tensor,\neach prediction will be a JSON object containing a name/value pair for each\noutput. The names identify the output aliases in the graph.\n\nThe following examples show some possible responses:\n\nA simple set of predictions for three input instances, where each\nprediction is an integer value:\n\u003cpre\u003e\n{\"predictions\": [5, 4, 3]}\n\u003c/pre\u003e\nA more complex set of predictions, each containing two named values that\ncorrespond to output tensors, named **label** and **scores** respectively.\nThe value of **label** is the predicted category (\"car\" or \"beach\") and\n**scores** contains a list of probabilities for that instance across the\npossible categories.\n\u003cpre\u003e\n{\"predictions\": [{\"label\": \"beach\", \"scores\": [0.1, 0.9]},\n                 {\"label\": \"car\", \"scores\": [0.75, 0.25]}]}\n\u003c/pre\u003e\nA response when there is an error processing an input instance:\n\u003cpre\u003e\n{\"error\": \"Divide by zero\"}\n\u003c/pre\u003e",
+	//   "description": "Performs prediction on the data in the request.\n\n**** REMOVE FROM GENERATED DOCUMENTATION",
 	//   "flatPath": "v1beta1/projects/{projectsId}:predict",
 	//   "httpMethod": "POST",
 	//   "id": "ml.projects.predict",
@@ -2103,6 +2307,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.googlecloudmlv1beta1__canceljobrequest)
 	if err != nil {
@@ -2238,6 +2443,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.googlecloudmlv1beta1__job)
 	if err != nil {
@@ -2382,6 +2588,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2551,6 +2758,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2727,6 +2935,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.googlecloudmlv1beta1__model)
 	if err != nil {
@@ -2867,6 +3076,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+name}")
@@ -3007,6 +3217,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3173,6 +3384,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3351,6 +3563,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.googlecloudmlv1beta1__version)
 	if err != nil {
@@ -3492,6 +3705,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+name}")
@@ -3636,6 +3850,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3804,6 +4019,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3979,6 +4195,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.googlecloudmlv1beta1__setdefaultversionrequest)
 	if err != nil {
@@ -4129,6 +4346,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+name}:cancel")
@@ -4260,6 +4478,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+name}")
@@ -4400,6 +4619,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4567,6 +4787,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/monitoring/v3/monitoring-api.json b/monitoring/v3/monitoring-api.json
index c4f7290..c0b162f 100644
--- a/monitoring/v3/monitoring-api.json
+++ b/monitoring/v3/monitoring-api.json
@@ -1,1118 +1,7 @@
 {
-  "ownerName": "Google",
-  "resources": {
-    "projects": {
-      "resources": {
-        "monitoredResourceDescriptors": {
-          "methods": {
-            "list": {
-              "description": "Lists monitored resource descriptors that match a filter. This method does not require a Stackdriver account.",
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "name"
-              ],
-              "response": {
-                "$ref": "ListMonitoredResourceDescriptorsResponse"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring",
-                "https://www.googleapis.com/auth/monitoring.read",
-                "https://www.googleapis.com/auth/monitoring.write"
-              ],
-              "parameters": {
-                "name": {
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".",
-                  "required": true,
-                  "type": "string"
-                },
-                "pageToken": {
-                  "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-                  "type": "string",
-                  "location": "query"
-                },
-                "pageSize": {
-                  "location": "query",
-                  "description": "A positive number that is the maximum number of results to return.",
-                  "format": "int32",
-                  "type": "integer"
-                },
-                "filter": {
-                  "type": "string",
-                  "location": "query",
-                  "description": "An optional filter describing the descriptors to be returned. The filter can reference the descriptor's type and labels. For example, the following filter returns only Google Compute Engine descriptors that have an id label:\nresource.type = starts_with(\"gce_\") AND resource.label:id\n"
-                }
-              },
-              "flatPath": "v3/projects/{projectsId}/monitoredResourceDescriptors",
-              "id": "monitoring.projects.monitoredResourceDescriptors.list",
-              "path": "v3/{+name}/monitoredResourceDescriptors"
-            },
-            "get": {
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "name"
-              ],
-              "response": {
-                "$ref": "MonitoredResourceDescriptor"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring",
-                "https://www.googleapis.com/auth/monitoring.read",
-                "https://www.googleapis.com/auth/monitoring.write"
-              ],
-              "parameters": {
-                "name": {
-                  "pattern": "^projects/[^/]+/monitoredResourceDescriptors/[^/]+$",
-                  "location": "path",
-                  "description": "The monitored resource descriptor to get. The format is \"projects/{project_id_or_number}/monitoredResourceDescriptors/{resource_type}\". The {resource_type} is a predefined type, such as cloudsql_database.",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "flatPath": "v3/projects/{projectsId}/monitoredResourceDescriptors/{monitoredResourceDescriptorsId}",
-              "id": "monitoring.projects.monitoredResourceDescriptors.get",
-              "path": "v3/{+name}",
-              "description": "Gets a single monitored resource descriptor. This method does not require a Stackdriver account."
-            }
-          }
-        },
-        "groups": {
-          "methods": {
-            "update": {
-              "httpMethod": "PUT",
-              "parameterOrder": [
-                "name"
-              ],
-              "response": {
-                "$ref": "Group"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring"
-              ],
-              "parameters": {
-                "name": {
-                  "description": "Output only. The name of this group. The format is \"projects/{project_id_or_number}/groups/{group_id}\". When creating a group, this field is ignored and a new name is created consisting of the project specified in the call to CreateGroup and a unique {group_id} that is generated automatically.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/groups/[^/]+$",
-                  "location": "path"
-                },
-                "validateOnly": {
-                  "location": "query",
-                  "description": "If true, validate this request but do not update the existing group.",
-                  "type": "boolean"
-                }
-              },
-              "flatPath": "v3/projects/{projectsId}/groups/{groupsId}",
-              "id": "monitoring.projects.groups.update",
-              "path": "v3/{+name}",
-              "description": "Updates an existing group. You can change any group attributes except name.",
-              "request": {
-                "$ref": "Group"
-              }
-            },
-            "create": {
-              "request": {
-                "$ref": "Group"
-              },
-              "description": "Creates a new group.",
-              "response": {
-                "$ref": "Group"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "httpMethod": "POST",
-              "parameters": {
-                "name": {
-                  "description": "The project in which to create the group. The format is \"projects/{project_id_or_number}\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path"
-                },
-                "validateOnly": {
-                  "description": "If true, validate this request but do not create the group.",
-                  "type": "boolean",
-                  "location": "query"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring"
-              ],
-              "flatPath": "v3/projects/{projectsId}/groups",
-              "path": "v3/{+name}/groups",
-              "id": "monitoring.projects.groups.create"
-            },
-            "delete": {
-              "description": "Deletes an existing group.",
-              "httpMethod": "DELETE",
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "parameters": {
-                "name": {
-                  "location": "path",
-                  "description": "The group to delete. The format is \"projects/{project_id_or_number}/groups/{group_id}\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/groups/[^/]+$"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring"
-              ],
-              "flatPath": "v3/projects/{projectsId}/groups/{groupsId}",
-              "id": "monitoring.projects.groups.delete",
-              "path": "v3/{+name}"
-            },
-            "list": {
-              "description": "Lists the existing groups.",
-              "httpMethod": "GET",
-              "response": {
-                "$ref": "ListGroupsResponse"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring",
-                "https://www.googleapis.com/auth/monitoring.read"
-              ],
-              "parameters": {
-                "pageToken": {
-                  "location": "query",
-                  "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "location": "query",
-                  "description": "A positive number that is the maximum number of results to return.",
-                  "format": "int32",
-                  "type": "integer"
-                },
-                "ancestorsOfGroup": {
-                  "description": "A group name: \"projects/{project_id_or_number}/groups/{group_id}\". Returns groups that are ancestors of the specified group. The groups are returned in order, starting with the immediate parent and ending with the most distant ancestor. If the specified group has no immediate parent, the results are empty.",
-                  "type": "string",
-                  "location": "query"
-                },
-                "name": {
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "description": "The project whose groups are to be listed. The format is \"projects/{project_id_or_number}\".",
-                  "required": true,
-                  "type": "string"
-                },
-                "childrenOfGroup": {
-                  "description": "A group name: \"projects/{project_id_or_number}/groups/{group_id}\". Returns groups whose parentName field contains the group name. If no groups have this parent, the results are empty.",
-                  "type": "string",
-                  "location": "query"
-                },
-                "descendantsOfGroup": {
-                  "type": "string",
-                  "location": "query",
-                  "description": "A group name: \"projects/{project_id_or_number}/groups/{group_id}\". Returns the descendants of the specified group. This is a superset of the results returned by the childrenOfGroup filter, and includes children-of-children, and so forth."
-                }
-              },
-              "flatPath": "v3/projects/{projectsId}/groups",
-              "id": "monitoring.projects.groups.list",
-              "path": "v3/{+name}/groups"
-            },
-            "get": {
-              "description": "Gets a single group.",
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "name"
-              ],
-              "response": {
-                "$ref": "Group"
-              },
-              "parameters": {
-                "name": {
-                  "description": "The group to retrieve. The format is \"projects/{project_id_or_number}/groups/{group_id}\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/groups/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring",
-                "https://www.googleapis.com/auth/monitoring.read"
-              ],
-              "flatPath": "v3/projects/{projectsId}/groups/{groupsId}",
-              "id": "monitoring.projects.groups.get",
-              "path": "v3/{+name}"
-            }
-          },
-          "resources": {
-            "members": {
-              "methods": {
-                "list": {
-                  "description": "Lists the monitored resources that are members of a group.",
-                  "httpMethod": "GET",
-                  "response": {
-                    "$ref": "ListGroupMembersResponse"
-                  },
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "parameters": {
-                    "interval.startTime": {
-                      "location": "query",
-                      "description": "Optional. The beginning of the time interval. The default value for the start time is the end time. The start time must not be later than the end time.",
-                      "format": "google-datetime",
-                      "type": "string"
-                    },
-                    "pageSize": {
-                      "description": "A positive number that is the maximum number of results to return.",
-                      "format": "int32",
-                      "type": "integer",
-                      "location": "query"
-                    },
-                    "name": {
-                      "description": "The group whose members are listed. The format is \"projects/{project_id_or_number}/groups/{group_id}\".",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/groups/[^/]+$",
-                      "location": "path"
-                    },
-                    "interval.endTime": {
-                      "location": "query",
-                      "description": "Required. The end of the time interval.",
-                      "format": "google-datetime",
-                      "type": "string"
-                    },
-                    "filter": {
-                      "type": "string",
-                      "location": "query",
-                      "description": "An optional list filter describing the members to be returned. The filter may reference the type, labels, and metadata of monitored resources that comprise the group. For example, to return only resources representing Compute Engine VM instances, use this filter:\nresource.type = \"gce_instance\"\n"
-                    },
-                    "pageToken": {
-                      "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-                      "type": "string",
-                      "location": "query"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/monitoring",
-                    "https://www.googleapis.com/auth/monitoring.read"
-                  ],
-                  "flatPath": "v3/projects/{projectsId}/groups/{groupsId}/members",
-                  "id": "monitoring.projects.groups.members.list",
-                  "path": "v3/{+name}/members"
-                }
-              }
-            }
-          }
-        },
-        "collectdTimeSeries": {
-          "methods": {
-            "create": {
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "httpMethod": "POST",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring",
-                "https://www.googleapis.com/auth/monitoring.write"
-              ],
-              "parameters": {
-                "name": {
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "description": "The project in which to create the time series. The format is \"projects/PROJECT_ID_OR_NUMBER\".",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "flatPath": "v3/projects/{projectsId}/collectdTimeSeries",
-              "path": "v3/{+name}/collectdTimeSeries",
-              "id": "monitoring.projects.collectdTimeSeries.create",
-              "description": "Stackdriver Monitoring Agent only: Creates a new time series.\u003caside class=\"caution\"\u003eThis method is only for use by the Stackdriver Monitoring Agent. Use projects.timeSeries.create instead.\u003c/aside\u003e",
-              "request": {
-                "$ref": "CreateCollectdTimeSeriesRequest"
-              }
-            }
-          }
-        },
-        "metricDescriptors": {
-          "methods": {
-            "create": {
-              "request": {
-                "$ref": "MetricDescriptor"
-              },
-              "description": "Creates a new metric descriptor. User-created metric descriptors define custom metrics.",
-              "response": {
-                "$ref": "MetricDescriptor"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "httpMethod": "POST",
-              "parameters": {
-                "name": {
-                  "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring",
-                "https://www.googleapis.com/auth/monitoring.write"
-              ],
-              "flatPath": "v3/projects/{projectsId}/metricDescriptors",
-              "path": "v3/{+name}/metricDescriptors",
-              "id": "monitoring.projects.metricDescriptors.create"
-            },
-            "delete": {
-              "flatPath": "v3/projects/{projectsId}/metricDescriptors/{metricDescriptorsId}",
-              "path": "v3/{+name}",
-              "id": "monitoring.projects.metricDescriptors.delete",
-              "description": "Deletes a metric descriptor. Only user-created custom metrics can be deleted.",
-              "response": {
-                "$ref": "Empty"
-              },
-              "httpMethod": "DELETE",
-              "parameterOrder": [
-                "name"
-              ],
-              "parameters": {
-                "name": {
-                  "description": "The metric descriptor on which to execute the request. The format is \"projects/{project_id_or_number}/metricDescriptors/{metric_id}\". An example of {metric_id} is: \"custom.googleapis.com/my_test_metric\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/metricDescriptors/.+$",
-                  "location": "path"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring"
-              ]
-            },
-            "list": {
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "name"
-              ],
-              "response": {
-                "$ref": "ListMetricDescriptorsResponse"
-              },
-              "parameters": {
-                "filter": {
-                  "description": "If this field is empty, all custom and system-defined metric descriptors are returned. Otherwise, the filter specifies which metric descriptors are to be returned. For example, the following filter matches all custom metrics:\nmetric.type = starts_with(\"custom.googleapis.com/\")\n",
-                  "type": "string",
-                  "location": "query"
-                },
-                "name": {
-                  "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path"
-                },
-                "pageToken": {
-                  "location": "query",
-                  "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "description": "A positive number that is the maximum number of results to return.",
-                  "format": "int32",
-                  "type": "integer",
-                  "location": "query"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring",
-                "https://www.googleapis.com/auth/monitoring.read",
-                "https://www.googleapis.com/auth/monitoring.write"
-              ],
-              "flatPath": "v3/projects/{projectsId}/metricDescriptors",
-              "id": "monitoring.projects.metricDescriptors.list",
-              "path": "v3/{+name}/metricDescriptors",
-              "description": "Lists metric descriptors that match a filter. This method does not require a Stackdriver account."
-            },
-            "get": {
-              "parameterOrder": [
-                "name"
-              ],
-              "response": {
-                "$ref": "MetricDescriptor"
-              },
-              "httpMethod": "GET",
-              "parameters": {
-                "name": {
-                  "description": "The metric descriptor on which to execute the request. The format is \"projects/{project_id_or_number}/metricDescriptors/{metric_id}\". An example value of {metric_id} is \"compute.googleapis.com/instance/disk/read_bytes_count\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/metricDescriptors/.+$",
-                  "location": "path"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring",
-                "https://www.googleapis.com/auth/monitoring.read",
-                "https://www.googleapis.com/auth/monitoring.write"
-              ],
-              "flatPath": "v3/projects/{projectsId}/metricDescriptors/{metricDescriptorsId}",
-              "path": "v3/{+name}",
-              "id": "monitoring.projects.metricDescriptors.get",
-              "description": "Gets a single metric descriptor. This method does not require a Stackdriver account."
-            }
-          }
-        },
-        "timeSeries": {
-          "methods": {
-            "list": {
-              "response": {
-                "$ref": "ListTimeSeriesResponse"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "httpMethod": "GET",
-              "parameters": {
-                "aggregation.groupByFields": {
-                  "repeated": true,
-                  "location": "query",
-                  "description": "The set of fields to preserve when crossSeriesReducer is specified. The groupByFields determine how the time series are partitioned into subsets prior to applying the aggregation function. Each subset contains time series that have the same value for each of the grouping fields. Each individual time series is a member of exactly one subset. The crossSeriesReducer is applied to each subset of time series. It is not possible to reduce across different resource types, so this field implicitly contains resource.type. Fields not specified in groupByFields are aggregated away. If groupByFields is not specified and all the time series have the same resource type, then the time series are aggregated into a single output time series. If crossSeriesReducer is not defined, this field is ignored.",
-                  "type": "string"
-                },
-                "name": {
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".",
-                  "required": true,
-                  "type": "string"
-                },
-                "interval.endTime": {
-                  "location": "query",
-                  "description": "Required. The end of the time interval.",
-                  "format": "google-datetime",
-                  "type": "string"
-                },
-                "aggregation.alignmentPeriod": {
-                  "location": "query",
-                  "description": "The alignment period for per-time series alignment. If present, alignmentPeriod must be at least 60 seconds. After per-time series alignment, each time series will contain data points only on the period boundaries. If perSeriesAligner is not specified or equals ALIGN_NONE, then this field is ignored. If perSeriesAligner is specified and does not equal ALIGN_NONE, then this field must be defined; otherwise an error is returned.",
-                  "format": "google-duration",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "description": "A positive number that is the maximum number of results to return. When view field sets to FULL, it limits the number of Points server will return; if view field is HEADERS, it limits the number of TimeSeries server will return.",
-                  "format": "int32",
-                  "type": "integer",
-                  "location": "query"
-                },
-                "orderBy": {
-                  "location": "query",
-                  "description": "Specifies the order in which the points of the time series should be returned. By default, results are not ordered. Currently, this field must be left blank.",
-                  "type": "string"
-                },
-                "aggregation.crossSeriesReducer": {
-                  "location": "query",
-                  "enum": [
-                    "REDUCE_NONE",
-                    "REDUCE_MEAN",
-                    "REDUCE_MIN",
-                    "REDUCE_MAX",
-                    "REDUCE_SUM",
-                    "REDUCE_STDDEV",
-                    "REDUCE_COUNT",
-                    "REDUCE_COUNT_TRUE",
-                    "REDUCE_FRACTION_TRUE",
-                    "REDUCE_PERCENTILE_99",
-                    "REDUCE_PERCENTILE_95",
-                    "REDUCE_PERCENTILE_50",
-                    "REDUCE_PERCENTILE_05"
-                  ],
-                  "description": "The approach to be used to combine time series. Not all reducer functions may be applied to all time series, depending on the metric type and the value type of the original time series. Reduction may change the metric type of value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.",
-                  "type": "string"
-                },
-                "filter": {
-                  "location": "query",
-                  "description": "A monitoring filter that specifies which time series should be returned. The filter must specify a single metric type, and can additionally specify metric labels and other information. For example:\nmetric.type = \"compute.googleapis.com/instance/cpu/usage_time\" AND\n    metric.label.instance_name = \"my-instance-name\"\n",
-                  "type": "string"
-                },
-                "aggregation.perSeriesAligner": {
-                  "description": "The approach to be used to align individual time series. Not all alignment functions may be applied to all time series, depending on the metric type and value type of the original time series. Alignment may change the metric type or the value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.",
-                  "type": "string",
-                  "location": "query",
-                  "enum": [
-                    "ALIGN_NONE",
-                    "ALIGN_DELTA",
-                    "ALIGN_RATE",
-                    "ALIGN_INTERPOLATE",
-                    "ALIGN_NEXT_OLDER",
-                    "ALIGN_MIN",
-                    "ALIGN_MAX",
-                    "ALIGN_MEAN",
-                    "ALIGN_COUNT",
-                    "ALIGN_SUM",
-                    "ALIGN_STDDEV",
-                    "ALIGN_COUNT_TRUE",
-                    "ALIGN_FRACTION_TRUE",
-                    "ALIGN_PERCENTILE_99",
-                    "ALIGN_PERCENTILE_95",
-                    "ALIGN_PERCENTILE_50",
-                    "ALIGN_PERCENTILE_05"
-                  ]
-                },
-                "pageToken": {
-                  "location": "query",
-                  "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-                  "type": "string"
-                },
-                "interval.startTime": {
-                  "description": "Optional. The beginning of the time interval. The default value for the start time is the end time. The start time must not be later than the end time.",
-                  "format": "google-datetime",
-                  "type": "string",
-                  "location": "query"
-                },
-                "view": {
-                  "enum": [
-                    "FULL",
-                    "HEADERS"
-                  ],
-                  "description": "Specifies which information is returned about the time series.",
-                  "type": "string",
-                  "location": "query"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring",
-                "https://www.googleapis.com/auth/monitoring.read"
-              ],
-              "flatPath": "v3/projects/{projectsId}/timeSeries",
-              "path": "v3/{+name}/timeSeries",
-              "id": "monitoring.projects.timeSeries.list",
-              "description": "Lists time series that match a filter. This method does not require a Stackdriver account."
-            },
-            "create": {
-              "path": "v3/{+name}/timeSeries",
-              "id": "monitoring.projects.timeSeries.create",
-              "description": "Creates or adds data to one or more time series. The response is empty if all time series in the request were written. If any time series could not be written, a corresponding failure message is included in the error response.",
-              "request": {
-                "$ref": "CreateTimeSeriesRequest"
-              },
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "httpMethod": "POST",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring",
-                "https://www.googleapis.com/auth/monitoring.write"
-              ],
-              "parameters": {
-                "name": {
-                  "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "flatPath": "v3/projects/{projectsId}/timeSeries"
-            }
-          }
-        },
-        "categories": {
-          "methods": {
-            "list": {
-              "id": "monitoring.projects.categories.list",
-              "path": "v3/{+parent}/categories",
-              "description": "List all Categories for a host project.",
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "parent"
-              ],
-              "response": {
-                "$ref": "ListCategoriesResponse"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring",
-                "https://www.googleapis.com/auth/monitoring.read"
-              ],
-              "parameters": {
-                "parent": {
-                  "description": "Resource parent of the project to get. Resource parent form is projects/{project_id_or_number}.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path"
-                },
-                "filter": {
-                  "description": "A filter that specifies what Categories to return.",
-                  "type": "string",
-                  "location": "query"
-                },
-                "pageToken": {
-                  "location": "query",
-                  "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "description": "A positive number that is the maximum number of results to return. When 0, use default page size.",
-                  "format": "int32",
-                  "type": "integer",
-                  "location": "query"
-                }
-              },
-              "flatPath": "v3/projects/{projectsId}/categories"
-            },
-            "create": {
-              "request": {
-                "$ref": "Category"
-              },
-              "description": "Create a new Category.",
-              "response": {
-                "$ref": "Category"
-              },
-              "parameterOrder": [
-                "parent"
-              ],
-              "httpMethod": "POST",
-              "parameters": {
-                "parent": {
-                  "description": "Resource parent of the project to get. Resource parent form is projects/{project_id_or_number}.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring"
-              ],
-              "flatPath": "v3/projects/{projectsId}/categories",
-              "path": "v3/{+parent}/categories",
-              "id": "monitoring.projects.categories.create"
-            },
-            "delete": {
-              "httpMethod": "DELETE",
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring"
-              ],
-              "parameters": {
-                "name": {
-                  "location": "path",
-                  "description": "Resource name of category to delete. Resource name form is projects/{project_id_or_number}/categories/{short_name}.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/categories/[^/]+$"
-                }
-              },
-              "flatPath": "v3/projects/{projectsId}/categories/{categoriesId}",
-              "id": "monitoring.projects.categories.delete",
-              "path": "v3/{+name}",
-              "description": "Delete a Category."
-            }
-          },
-          "resources": {
-            "metricAssociations": {
-              "methods": {
-                "list": {
-                  "httpMethod": "GET",
-                  "parameterOrder": [
-                    "parent"
-                  ],
-                  "response": {
-                    "$ref": "ListMetricAssociationsResponse"
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/monitoring",
-                    "https://www.googleapis.com/auth/monitoring.read"
-                  ],
-                  "parameters": {
-                    "pageToken": {
-                      "location": "query",
-                      "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-                      "type": "string"
-                    },
-                    "pageSize": {
-                      "location": "query",
-                      "description": "A positive number that is the maximum number of results to return. When 0, use default page size.",
-                      "format": "int32",
-                      "type": "integer"
-                    },
-                    "parent": {
-                      "description": "Resource parent of the category to get. Resource parent form is projects/{project_id_or_number}/categories/{short_name}.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/categories/[^/]+$",
-                      "location": "path"
-                    },
-                    "filter": {
-                      "location": "query",
-                      "description": "A filter that specifies what MetricAssociations to return.",
-                      "type": "string"
-                    }
-                  },
-                  "flatPath": "v3/projects/{projectsId}/categories/{categoriesId}/metricAssociations",
-                  "id": "monitoring.projects.categories.metricAssociations.list",
-                  "path": "v3/{+parent}/metricAssociations",
-                  "description": "List the MetricAssociations in a given Category."
-                },
-                "create": {
-                  "response": {
-                    "$ref": "MetricAssociation"
-                  },
-                  "parameterOrder": [
-                    "parent"
-                  ],
-                  "httpMethod": "POST",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/monitoring"
-                  ],
-                  "parameters": {
-                    "parent": {
-                      "description": "Resource parent of the category to get. Resource parent form is projects/{project_id_or_number}/categories/{short_name}.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/categories/[^/]+$",
-                      "location": "path"
-                    }
-                  },
-                  "flatPath": "v3/projects/{projectsId}/categories/{categoriesId}/metricAssociations",
-                  "path": "v3/{+parent}/metricAssociations",
-                  "id": "monitoring.projects.categories.metricAssociations.create",
-                  "description": "Create a MetricAssociation.",
-                  "request": {
-                    "$ref": "MetricAssociation"
-                  }
-                },
-                "delete": {
-                  "description": "Delete a MetricAssociation.",
-                  "response": {
-                    "$ref": "Empty"
-                  },
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "httpMethod": "DELETE",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/monitoring"
-                  ],
-                  "parameters": {
-                    "name": {
-                      "pattern": "^projects/[^/]+/categories/[^/]+/metricAssociations/[^/]+$",
-                      "location": "path",
-                      "description": "Resource name of metric association to delete. Resource name form is projects/{project_id_or_number}/\n    categories/{short_name}/metricAssociations/{metric_name}.",
-                      "required": true,
-                      "type": "string"
-                    }
-                  },
-                  "flatPath": "v3/projects/{projectsId}/categories/{categoriesId}/metricAssociations/{metricAssociationsId}",
-                  "path": "v3/{+name}",
-                  "id": "monitoring.projects.categories.metricAssociations.delete"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "categories": {
-      "methods": {
-        "list": {
-          "response": {
-            "$ref": "ListCategoriesResponse"
-          },
-          "parameterOrder": [],
-          "httpMethod": "GET",
-          "parameters": {
-            "pageToken": {
-              "location": "query",
-              "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-              "type": "string"
-            },
-            "pageSize": {
-              "location": "query",
-              "description": "A positive number that is the maximum number of results to return. When 0, use default page size.",
-              "format": "int32",
-              "type": "integer"
-            },
-            "parent": {
-              "location": "query",
-              "description": "Resource parent of the project to get. Resource parent form is projects/{project_id_or_number}.",
-              "type": "string"
-            },
-            "filter": {
-              "type": "string",
-              "location": "query",
-              "description": "A filter that specifies what Categories to return."
-            }
-          },
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/monitoring",
-            "https://www.googleapis.com/auth/monitoring.read"
-          ],
-          "flatPath": "v3/categories",
-          "path": "v3/categories",
-          "id": "monitoring.categories.list",
-          "description": "List all Categories for a host project."
-        }
-      },
-      "resources": {
-        "metricAssociations": {
-          "methods": {
-            "list": {
-              "id": "monitoring.categories.metricAssociations.list",
-              "path": "v3/{+parent}/metricAssociations",
-              "description": "List the MetricAssociations in a given Category.",
-              "httpMethod": "GET",
-              "parameterOrder": [
-                "parent"
-              ],
-              "response": {
-                "$ref": "ListMetricAssociationsResponse"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/monitoring",
-                "https://www.googleapis.com/auth/monitoring.read"
-              ],
-              "parameters": {
-                "filter": {
-                  "location": "query",
-                  "description": "A filter that specifies what MetricAssociations to return.",
-                  "type": "string"
-                },
-                "pageToken": {
-                  "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-                  "type": "string",
-                  "location": "query"
-                },
-                "pageSize": {
-                  "description": "A positive number that is the maximum number of results to return. When 0, use default page size.",
-                  "format": "int32",
-                  "type": "integer",
-                  "location": "query"
-                },
-                "parent": {
-                  "description": "Resource parent of the category to get. Resource parent form is projects/{project_id_or_number}/categories/{short_name}.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^categories/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "flatPath": "v3/categories/{categoriesId}/metricAssociations"
-            }
-          }
-        }
-      }
-    }
-  },
-  "parameters": {
-    "callback": {
-      "location": "query",
-      "description": "JSONP",
-      "type": "string"
-    },
-    "$.xgafv": {
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "location": "query",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "description": "V1 error format.",
-      "type": "string"
-    },
-    "alt": {
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "type": "string",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "location": "query",
-      "description": "Data format for response.",
-      "default": "json"
-    },
-    "access_token": {
-      "location": "query",
-      "description": "OAuth access token.",
-      "type": "string"
-    },
-    "key": {
-      "location": "query",
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "location": "query",
-      "description": "Pretty-print response.",
-      "type": "boolean",
-      "default": "true"
-    },
-    "bearer_token": {
-      "type": "string",
-      "location": "query",
-      "description": "OAuth bearer token."
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "location": "query",
-      "description": "Returns response with indentations and line breaks.",
-      "type": "boolean",
-      "default": "true"
-    },
-    "fields": {
-      "location": "query",
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string"
-    },
-    "uploadType": {
-      "location": "query",
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string"
-    }
-  },
-  "version": "v3",
-  "baseUrl": "https://monitoring.googleapis.com/",
-  "kind": "discovery#restDescription",
-  "description": "Manages your Stackdriver Monitoring data and configurations. Most projects must be associated with a Stackdriver account, with a few exceptions as noted on the individual method pages.",
-  "servicePath": "",
-  "basePath": "",
-  "id": "monitoring:v3",
-  "documentationLink": "https://cloud.google.com/monitoring/api/",
-  "revision": "20170124",
   "discoveryVersion": "v1",
   "version_module": "True",
   "schemas": {
-    "CollectdPayload": {
-      "description": "A collection of data points sent from a collectd-based plugin. See the collectd documentation for more information.",
-      "type": "object",
-      "properties": {
-        "metadata": {
-          "type": "object",
-          "additionalProperties": {
-            "$ref": "TypedValue"
-          },
-          "description": "The measurement metadata. Example: \"process_id\" -\u003e 12345"
-        },
-        "type": {
-          "description": "The measurement type. Example: \"memory\".",
-          "type": "string"
-        },
-        "plugin": {
-          "description": "The name of the plugin. Example: \"disk\".",
-          "type": "string"
-        },
-        "pluginInstance": {
-          "description": "The instance name of the plugin Example: \"hdcl\".",
-          "type": "string"
-        },
-        "endTime": {
-          "description": "The end time of the interval.",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "startTime": {
-          "description": "The start time of the interval.",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "values": {
-          "type": "array",
-          "items": {
-            "$ref": "CollectdValue"
-          },
-          "description": "The measured values during this time interval. Each value must have a different dataSourceName."
-        },
-        "typeInstance": {
-          "description": "The measurement type instance. Example: \"used\".",
-          "type": "string"
-        }
-      },
-      "id": "CollectdPayload"
-    },
-    "Linear": {
-      "description": "Specify a sequence of buckets that all have the same width (except overflow and underflow). Each bucket represents a constant absolute uncertainty on the specific value in the bucket.Defines num_finite_buckets + 2 (= N) buckets with these boundaries for bucket i:Upper bound (0 \u003c= i \u003c N-1): offset + (width * i).  Lower bound (1 \u003c= i \u003c N): offset + (width * (i - 1)).",
-      "type": "object",
-      "properties": {
-        "width": {
-          "description": "Must be greater than 0.",
-          "format": "double",
-          "type": "number"
-        },
-        "offset": {
-          "type": "number",
-          "description": "Lower bound of the first bucket.",
-          "format": "double"
-        },
-        "numFiniteBuckets": {
-          "description": "Must be greater than 0.",
-          "format": "int32",
-          "type": "integer"
-        }
-      },
-      "id": "Linear"
-    },
     "Empty": {
       "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:\nservice Foo {\n  rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n}\nThe JSON representation for Empty is empty JSON object {}.",
       "type": "object",
@@ -1123,6 +12,10 @@
       "description": "A protocol buffer option, which can be attached to a message, field, enumeration, etc.",
       "type": "object",
       "properties": {
+        "name": {
+          "description": "The option's name. For protobuf built-in options (options defined in descriptor.proto), this is the short name. For example, \"map_entry\". For custom options, it should be the fully-qualified name. For example, \"google.api.http\".",
+          "type": "string"
+        },
         "value": {
           "additionalProperties": {
             "description": "Properties of the object. Contains field @type with type URL.",
@@ -1130,10 +23,6 @@
           },
           "description": "The option's value packed in an Any message. If the value is a primitive, the corresponding wrapper type defined in google/protobuf/wrappers.proto should be used. If the value is an enum, it should be stored as an int32 value using the google.protobuf.Int32Value type.",
           "type": "object"
-        },
-        "name": {
-          "description": "The option's name. For protobuf built-in options (options defined in descriptor.proto), this is the short name. For example, \"map_entry\". For custom options, it should be the fully-qualified name. For example, \"google.api.http\".",
-          "type": "string"
         }
       },
       "id": "Option"
@@ -1180,9 +69,9 @@
           "type": "integer"
         },
         "growthFactor": {
-          "type": "number",
           "description": "Must be greater than 1.",
-          "format": "double"
+          "format": "double",
+          "type": "number"
         },
         "scale": {
           "description": "Must be greater than 0.",
@@ -1197,12 +86,12 @@
       "type": "object",
       "properties": {
         "value": {
-          "description": "The value of the data point.",
-          "$ref": "TypedValue"
+          "$ref": "TypedValue",
+          "description": "The value of the data point."
         },
         "interval": {
-          "$ref": "TimeInterval",
-          "description": "The time interval to which the data point applies. For GAUGE metrics, only the end time of the interval is used. For DELTA metrics, the start and end time should specify a non-zero interval, with subsequent points specifying contiguous and non-overlapping intervals. For CUMULATIVE metrics, the start and end time should specify a non-zero interval, with subsequent points specifying the same start time and increasing end times, until an event resets the cumulative value to zero and sets a new start time for the following points."
+          "description": "The time interval to which the data point applies. For GAUGE metrics, only the end time of the interval is used. For DELTA metrics, the start and end time should specify a non-zero interval, with subsequent points specifying contiguous and non-overlapping intervals. For CUMULATIVE metrics, the start and end time should specify a non-zero interval, with subsequent points specifying the same start time and increasing end times, until an event resets the cumulative value to zero and sets a new start time for the following points.",
+          "$ref": "TimeInterval"
         }
       },
       "id": "Point"
@@ -1211,16 +100,16 @@
       "description": "A specific metric, identified by specifying values for all of the labels of a MetricDescriptor.",
       "type": "object",
       "properties": {
+        "labels": {
+          "description": "The set of label values that uniquely identify this metric. All labels listed in the MetricDescriptor must be assigned values.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
+        },
         "type": {
           "description": "An existing metric type, see google.api.MetricDescriptor. For example, custom.googleapis.com/invoice/paid/amount.",
           "type": "string"
-        },
-        "labels": {
-          "additionalProperties": {
-            "type": "string"
-          },
-          "description": "The set of label values that uniquely identify this metric. All labels listed in the MetricDescriptor must be assigned values.",
-          "type": "object"
         }
       },
       "id": "Metric"
@@ -1229,8 +118,11 @@
       "description": "A single field of a message type.",
       "type": "object",
       "properties": {
+        "jsonName": {
+          "description": "The field JSON name.",
+          "type": "string"
+        },
         "kind": {
-          "type": "string",
           "enumDescriptions": [
             "Field type unknown.",
             "Field type double.",
@@ -1273,10 +165,7 @@
             "TYPE_SINT32",
             "TYPE_SINT64"
           ],
-          "description": "The field type."
-        },
-        "jsonName": {
-          "description": "The field JSON name.",
+          "description": "The field type.",
           "type": "string"
         },
         "options": {
@@ -1291,10 +180,6 @@
           "format": "int32",
           "type": "integer"
         },
-        "packed": {
-          "description": "Whether to use alternative packed wire representation.",
-          "type": "boolean"
-        },
         "cardinality": {
           "description": "The field cardinality.",
           "type": "string",
@@ -1311,9 +196,13 @@
             "CARDINALITY_REPEATED"
           ]
         },
+        "packed": {
+          "description": "Whether to use alternative packed wire representation.",
+          "type": "boolean"
+        },
         "defaultValue": {
-          "type": "string",
-          "description": "The string value of the default value of this field. Proto2 syntax only."
+          "description": "The string value of the default value of this field. Proto2 syntax only.",
+          "type": "string"
         },
         "name": {
           "description": "The field name.",
@@ -1324,53 +213,42 @@
           "type": "string"
         },
         "number": {
-          "type": "integer",
           "description": "The field number.",
-          "format": "int32"
+          "format": "int32",
+          "type": "integer"
         }
       },
       "id": "Field"
     },
-    "Category": {
-      "description": "A Vital Signs Category.",
+    "ListTimeSeriesResponse": {
+      "description": "The ListTimeSeries response.",
       "type": "object",
       "properties": {
-        "isDefault": {
-          "description": "A flag to indicate whether this category is part of Stackdriver's default taxonomy.",
-          "type": "boolean"
+        "timeSeries": {
+          "description": "One or more time series that match the filter included in the request.",
+          "type": "array",
+          "items": {
+            "$ref": "TimeSeries"
+          }
         },
-        "shortName": {
-          "description": "Unique usually one-word name for this category. e.g. latency or custom:goodness",
-          "type": "string"
-        },
-        "name": {
-          "description": "Resource name for the category. e.g. projects/91091/categories/latency or projects/91091/categories/custom:goodness",
-          "type": "string"
-        },
-        "displayName": {
-          "description": "A human-readable name for the category.",
-          "type": "string"
-        },
-        "description": {
-          "description": "A human-readable description for the category. The description can be longer and contain more details.",
+        "nextPageToken": {
+          "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.",
           "type": "string"
         }
       },
-      "id": "Category"
+      "id": "ListTimeSeriesResponse"
     },
     "LabelDescriptor": {
       "description": "A description of a label.",
       "type": "object",
       "properties": {
-        "key": {
-          "type": "string",
-          "description": "The label key."
-        },
         "description": {
           "description": "A human-readable description for the label.",
           "type": "string"
         },
         "valueType": {
+          "description": "The type of data that can be assigned to the label.",
+          "type": "string",
           "enumDescriptions": [
             "A variable-length string. This is the default.",
             "Boolean; true or false.",
@@ -1380,85 +258,19 @@
             "STRING",
             "BOOL",
             "INT64"
-          ],
-          "description": "The type of data that can be assigned to the label.",
+          ]
+        },
+        "key": {
+          "description": "The label key.",
           "type": "string"
         }
       },
       "id": "LabelDescriptor"
     },
-    "ListTimeSeriesResponse": {
-      "description": "The ListTimeSeries response.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.",
-          "type": "string"
-        },
-        "timeSeries": {
-          "description": "One or more time series that match the filter included in the request.",
-          "type": "array",
-          "items": {
-            "$ref": "TimeSeries"
-          }
-        }
-      },
-      "id": "ListTimeSeriesResponse"
-    },
-    "Group": {
-      "properties": {
-        "name": {
-          "description": "Output only. The name of this group. The format is \"projects/{project_id_or_number}/groups/{group_id}\". When creating a group, this field is ignored and a new name is created consisting of the project specified in the call to CreateGroup and a unique {group_id} that is generated automatically.",
-          "type": "string"
-        },
-        "parentName": {
-          "description": "The name of the group's parent, if it has one. The format is \"projects/{project_id_or_number}/groups/{group_id}\". For groups with no parent, parentName is the empty string, \"\".",
-          "type": "string"
-        },
-        "displayName": {
-          "description": "A user-assigned name for this group, used only for display purposes.",
-          "type": "string"
-        },
-        "isCluster": {
-          "description": "If true, the members of this group are considered to be a cluster. The system can perform additional analysis on groups that are clusters.",
-          "type": "boolean"
-        },
-        "filter": {
-          "description": "The filter used to determine which monitored resources belong to this group.",
-          "type": "string"
-        }
-      },
-      "id": "Group",
-      "description": "The description of a dynamic collection of monitored resources. Each group has a filter that is matched against monitored resources and their associated metadata. If a group's filter matches an available monitored resource, then that resource is a member of that group. Groups can contain any number of monitored resources, and each monitored resource can be a member of any number of groups.Groups can be nested in parent-child hierarchies. The parentName field identifies an optional parent for each group. If a group has a parent, then the only monitored resources available to be matched by the group's filter are the resources contained in the parent group. In other words, a group contains the monitored resources that match its filter and the filters of all the group's ancestors. A group without a parent can contain any monitored resource.For example, consider an infrastructure running a set of instances with two user-defined tags: \"environment\" and \"role\". A parent group has a filter, environment=\"production\". A child of that parent group has a filter, role=\"transcoder\". The parent group contains all instances in the production environment, regardless of their roles. The child group contains instances that have the transcoder role and are in the production environment.The monitored resources contained in a group can change at any moment, depending on what resources exist and what filters are associated with the group and its ancestors.",
-      "type": "object"
-    },
     "Type": {
       "description": "A protocol buffer message type.",
       "type": "object",
       "properties": {
-        "sourceContext": {
-          "$ref": "SourceContext",
-          "description": "The source context."
-        },
-        "syntax": {
-          "enum": [
-            "SYNTAX_PROTO2",
-            "SYNTAX_PROTO3"
-          ],
-          "description": "The source syntax.",
-          "type": "string",
-          "enumDescriptions": [
-            "Syntax proto2.",
-            "Syntax proto3."
-          ]
-        },
-        "options": {
-          "type": "array",
-          "items": {
-            "$ref": "Option"
-          },
-          "description": "The protocol buffer options."
-        },
         "fields": {
           "description": "The list of fields.",
           "type": "array",
@@ -1476,25 +288,75 @@
           "items": {
             "type": "string"
           }
+        },
+        "sourceContext": {
+          "$ref": "SourceContext",
+          "description": "The source context."
+        },
+        "syntax": {
+          "enumDescriptions": [
+            "Syntax proto2.",
+            "Syntax proto3."
+          ],
+          "enum": [
+            "SYNTAX_PROTO2",
+            "SYNTAX_PROTO3"
+          ],
+          "description": "The source syntax.",
+          "type": "string"
+        },
+        "options": {
+          "description": "The protocol buffer options.",
+          "type": "array",
+          "items": {
+            "$ref": "Option"
+          }
         }
       },
       "id": "Type"
     },
+    "Group": {
+      "description": "The description of a dynamic collection of monitored resources. Each group has a filter that is matched against monitored resources and their associated metadata. If a group's filter matches an available monitored resource, then that resource is a member of that group. Groups can contain any number of monitored resources, and each monitored resource can be a member of any number of groups.Groups can be nested in parent-child hierarchies. The parentName field identifies an optional parent for each group. If a group has a parent, then the only monitored resources available to be matched by the group's filter are the resources contained in the parent group. In other words, a group contains the monitored resources that match its filter and the filters of all the group's ancestors. A group without a parent can contain any monitored resource.For example, consider an infrastructure running a set of instances with two user-defined tags: \"environment\" and \"role\". A parent group has a filter, environment=\"production\". A child of that parent group has a filter, role=\"transcoder\". The parent group contains all instances in the production environment, regardless of their roles. The child group contains instances that have the transcoder role and are in the production environment.The monitored resources contained in a group can change at any moment, depending on what resources exist and what filters are associated with the group and its ancestors.",
+      "type": "object",
+      "properties": {
+        "filter": {
+          "description": "The filter used to determine which monitored resources belong to this group.",
+          "type": "string"
+        },
+        "name": {
+          "description": "Output only. The name of this group. The format is \"projects/{project_id_or_number}/groups/{group_id}\". When creating a group, this field is ignored and a new name is created consisting of the project specified in the call to CreateGroup and a unique {group_id} that is generated automatically.",
+          "type": "string"
+        },
+        "parentName": {
+          "description": "The name of the group's parent, if it has one. The format is \"projects/{project_id_or_number}/groups/{group_id}\". For groups with no parent, parentName is the empty string, \"\".",
+          "type": "string"
+        },
+        "displayName": {
+          "description": "A user-assigned name for this group, used only for display purposes.",
+          "type": "string"
+        },
+        "isCluster": {
+          "description": "If true, the members of this group are considered to be a cluster. The system can perform additional analysis on groups that are clusters.",
+          "type": "boolean"
+        }
+      },
+      "id": "Group"
+    },
     "BucketOptions": {
       "description": "A Distribution may optionally contain a histogram of the values in the population. The histogram is given in bucket_counts as counts of values that fall into one of a sequence of non-overlapping buckets. The sequence of buckets is described by bucket_options.A bucket specifies an inclusive lower bound and exclusive upper bound for the values that are counted for that bucket. The upper bound of a bucket is strictly greater than the lower bound.The sequence of N buckets for a Distribution consists of an underflow bucket (number 0), zero or more finite buckets (number 1 through N - 2) and an overflow bucket (number N - 1). The buckets are contiguous: the lower bound of bucket i (i \u003e 0) is the same as the upper bound of bucket i - 1. The buckets span the whole range of finite values: lower bound of the underflow bucket is -infinity and the upper bound of the overflow bucket is +infinity. The finite buckets are so-called because both bounds are finite.BucketOptions describes bucket boundaries in one of three ways. Two describe the boundaries by giving parameters for a formula to generate boundaries and one gives the bucket boundaries explicitly.If bucket_options is not given, then no bucket_counts may be given.",
       "type": "object",
       "properties": {
-        "exponentialBuckets": {
-          "description": "The exponential buckets.",
-          "$ref": "Exponential"
-        },
         "linearBuckets": {
-          "$ref": "Linear",
-          "description": "The linear bucket."
+          "description": "The linear bucket.",
+          "$ref": "Linear"
         },
         "explicitBuckets": {
           "description": "The explicit buckets.",
           "$ref": "Explicit"
+        },
+        "exponentialBuckets": {
+          "$ref": "Exponential",
+          "description": "The exponential buckets."
         }
       },
       "id": "BucketOptions"
@@ -1503,10 +365,6 @@
       "description": "A single data point from a collectd-based plugin.",
       "type": "object",
       "properties": {
-        "value": {
-          "$ref": "TypedValue",
-          "description": "The measurement value."
-        },
         "dataSourceType": {
           "enumDescriptions": [
             "An unspecified data source type. This corresponds to google.api.MetricDescriptor.MetricKind.METRIC_KIND_UNSPECIFIED.",
@@ -1528,6 +386,10 @@
         "dataSourceName": {
           "description": "The data source for the collectd value. For example there are two data sources for network measurements: \"rx\" and \"tx\".",
           "type": "string"
+        },
+        "value": {
+          "description": "The measurement value.",
+          "$ref": "TypedValue"
         }
       },
       "id": "CollectdValue"
@@ -1536,33 +398,9 @@
       "description": "Defines a metric type and its schema. Once a metric descriptor is created, deleting or altering it stops data collection and makes the metric type's existing data unusable.",
       "type": "object",
       "properties": {
-        "type": {
-          "description": "The metric type, including its DNS name prefix. The type is not URL-encoded. All user-defined custom metric types have the DNS name custom.googleapis.com. Metric types should use a natural hierarchical grouping. For example:\n\"custom.googleapis.com/invoice/paid/amount\"\n\"appengine.googleapis.com/http/server/response_latencies\"\n",
-          "type": "string"
-        },
-        "valueType": {
-          "enumDescriptions": [
-            "Do not use this default value.",
-            "The value is a boolean. This value type can be used only if the metric kind is GAUGE.",
-            "The value is a signed 64-bit integer.",
-            "The value is a double precision floating point number.",
-            "The value is a text string. This value type can be used only if the metric kind is GAUGE.",
-            "The value is a Distribution.",
-            "The value is money."
-          ],
-          "enum": [
-            "VALUE_TYPE_UNSPECIFIED",
-            "BOOL",
-            "INT64",
-            "DOUBLE",
-            "STRING",
-            "DISTRIBUTION",
-            "MONEY"
-          ],
-          "description": "Whether the measurement is an integer, a floating-point number, etc. Some combinations of metric_kind and value_type might not be supported.",
-          "type": "string"
-        },
         "metricKind": {
+          "description": "Whether the metric records instantaneous values, changes to a value, etc. Some combinations of metric_kind and value_type might not be supported.",
+          "type": "string",
           "enumDescriptions": [
             "Do not use this default value.",
             "An instantaneous measurement of a value.",
@@ -1574,9 +412,7 @@
             "GAUGE",
             "DELTA",
             "CUMULATIVE"
-          ],
-          "description": "Whether the metric records instantaneous values, changes to a value, etc. Some combinations of metric_kind and value_type might not be supported.",
-          "type": "string"
+          ]
         },
         "description": {
           "description": "A detailed description of the metric, which can be used in documentation.",
@@ -1600,6 +436,32 @@
         "name": {
           "description": "The resource name of the metric descriptor. Depending on the implementation, the name typically includes: (1) the parent resource name that defines the scope of the metric type or of its data; and (2) the metric's URL-encoded type, which also appears in the type field of this descriptor. For example, following is the resource name of a custom metric within the GCP project my-project-id:\n\"projects/my-project-id/metricDescriptors/custom.googleapis.com%2Finvoice%2Fpaid%2Famount\"\n",
           "type": "string"
+        },
+        "type": {
+          "description": "The metric type, including its DNS name prefix. The type is not URL-encoded. All user-defined custom metric types have the DNS name custom.googleapis.com. Metric types should use a natural hierarchical grouping. For example:\n\"custom.googleapis.com/invoice/paid/amount\"\n\"appengine.googleapis.com/http/server/response_latencies\"\n",
+          "type": "string"
+        },
+        "valueType": {
+          "description": "Whether the measurement is an integer, a floating-point number, etc. Some combinations of metric_kind and value_type might not be supported.",
+          "type": "string",
+          "enumDescriptions": [
+            "Do not use this default value.",
+            "The value is a boolean. This value type can be used only if the metric kind is GAUGE.",
+            "The value is a signed 64-bit integer.",
+            "The value is a double precision floating point number.",
+            "The value is a text string. This value type can be used only if the metric kind is GAUGE.",
+            "The value is a Distribution.",
+            "The value is money."
+          ],
+          "enum": [
+            "VALUE_TYPE_UNSPECIFIED",
+            "BOOL",
+            "INT64",
+            "DOUBLE",
+            "STRING",
+            "DISTRIBUTION",
+            "MONEY"
+          ]
         }
       },
       "id": "MetricDescriptor"
@@ -1609,8 +471,8 @@
       "type": "object",
       "properties": {
         "fileName": {
-          "type": "string",
-          "description": "The path-qualified name of the .proto file that contained the associated protobuf element. For example: \"google/protobuf/source_context.proto\"."
+          "description": "The path-qualified name of the .proto file that contained the associated protobuf element. For example: \"google/protobuf/source_context.proto\".",
+          "type": "string"
         }
       },
       "id": "SourceContext"
@@ -1636,45 +498,27 @@
       "description": "The ListGroups response.",
       "type": "object",
       "properties": {
-        "nextPageToken": {
-          "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.",
-          "type": "string"
-        },
         "group": {
           "description": "The groups that match the specified filters.",
           "type": "array",
           "items": {
             "$ref": "Group"
           }
+        },
+        "nextPageToken": {
+          "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.",
+          "type": "string"
         }
       },
       "id": "ListGroupsResponse"
     },
-    "ListMetricAssociationsResponse": {
-      "description": "The MetricAssociations response.",
-      "type": "object",
-      "properties": {
-        "metricAssociations": {
-          "type": "array",
-          "items": {
-            "$ref": "MetricAssociation"
-          },
-          "description": "The MetricAssociations that match the specified filters."
-        },
-        "nextPageToken": {
-          "type": "string",
-          "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method."
-        }
-      },
-      "id": "ListMetricAssociationsResponse"
-    },
     "CreateCollectdTimeSeriesRequest": {
       "description": "The CreateCollectdTimeSeries request.",
       "type": "object",
       "properties": {
         "resource": {
-          "description": "The monitored resource associated with the time series.",
-          "$ref": "MonitoredResource"
+          "$ref": "MonitoredResource",
+          "description": "The monitored resource associated with the time series."
         },
         "collectdPayloads": {
           "description": "The collectd payloads representing the time series data. You must not include more than a single point for each time series, so no two payloads can have the same values for all of the fields plugin, plugin_instance, type, and type_instance.",
@@ -1702,8 +546,8 @@
           }
         },
         "nextPageToken": {
-          "type": "string",
-          "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method."
+          "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.",
+          "type": "string"
         },
         "totalSize": {
           "description": "The total number of elements matching this request.",
@@ -1731,30 +575,43 @@
       },
       "id": "ListMonitoredResourceDescriptorsResponse"
     },
-    "MetricAssociation": {
-      "description": "A Vital Signs MetricAssociation, representing the inclusion of its referenced metric type within its parent category.",
-      "type": "object",
-      "properties": {
-        "name": {
-          "description": "Resource name for the metric association.",
-          "type": "string"
-        },
-        "isDefault": {
-          "description": "A flag to indicate whether this association is part of Stackdriver's default taxonomy.",
-          "type": "boolean"
-        },
-        "metricType": {
-          "description": "Resource name of the metric. It must be the full resource name. For example, \"compute.googleapis.com/instance/cpu/utilization\".",
-          "type": "string"
-        }
-      },
-      "id": "MetricAssociation"
-    },
     "TimeSeries": {
       "description": "A collection of data points that describes the time-varying values of a metric. A time series is identified by a combination of a fully-specified monitored resource and a fully-specified metric. This type is used for both listing and creating time series.",
       "type": "object",
       "properties": {
+        "resource": {
+          "$ref": "MonitoredResource",
+          "description": "The associated resource. A fully-specified monitored resource used to identify the time series."
+        },
+        "metricKind": {
+          "description": "The metric kind of the time series. When listing time series, this metric kind might be different from the metric kind of the associated metric if this time series is an alignment or reduction of other time series.When creating a time series, this field is optional. If present, it must be the same as the metric kind of the associated metric. If the associated metric's descriptor must be auto-created, then this field specifies the metric kind of the new descriptor and must be either GAUGE (the default) or CUMULATIVE.",
+          "type": "string",
+          "enumDescriptions": [
+            "Do not use this default value.",
+            "An instantaneous measurement of a value.",
+            "The change in a value during a time interval.",
+            "A value accumulated over a time interval. Cumulative measurements in a time series should have the same start time and increasing end times, until an event resets the cumulative value to zero and sets a new start time for the following points."
+          ],
+          "enum": [
+            "METRIC_KIND_UNSPECIFIED",
+            "GAUGE",
+            "DELTA",
+            "CUMULATIVE"
+          ]
+        },
+        "metric": {
+          "$ref": "Metric",
+          "description": "The associated metric. A fully-specified metric used to identify the time series."
+        },
+        "points": {
+          "description": "The data points of this time series. When listing time series, the order of the points is specified by the list method.When creating a time series, this field must contain exactly one point and the point's type must be the same as the value type of the associated metric. If the associated metric's descriptor must be auto-created, then the value type of the descriptor is determined by the point's type, which must be BOOL, INT64, DOUBLE, or DISTRIBUTION.",
+          "type": "array",
+          "items": {
+            "$ref": "Point"
+          }
+        },
         "valueType": {
+          "description": "The value type of the time series. When listing time series, this value type might be different from the value type of the associated metric if this time series is an alignment or reduction of other time series.When creating a time series, this field is optional. If present, it must be the same as the type of the data in the points field.",
           "type": "string",
           "enumDescriptions": [
             "Do not use this default value.",
@@ -1773,39 +630,7 @@
             "STRING",
             "DISTRIBUTION",
             "MONEY"
-          ],
-          "description": "The value type of the time series. When listing time series, this value type might be different from the value type of the associated metric if this time series is an alignment or reduction of other time series.When creating a time series, this field is optional. If present, it must be the same as the type of the data in the points field."
-        },
-        "resource": {
-          "description": "The associated resource. A fully-specified monitored resource used to identify the time series.",
-          "$ref": "MonitoredResource"
-        },
-        "metricKind": {
-          "enumDescriptions": [
-            "Do not use this default value.",
-            "An instantaneous measurement of a value.",
-            "The change in a value during a time interval.",
-            "A value accumulated over a time interval. Cumulative measurements in a time series should have the same start time and increasing end times, until an event resets the cumulative value to zero and sets a new start time for the following points."
-          ],
-          "enum": [
-            "METRIC_KIND_UNSPECIFIED",
-            "GAUGE",
-            "DELTA",
-            "CUMULATIVE"
-          ],
-          "description": "The metric kind of the time series. When listing time series, this metric kind might be different from the metric kind of the associated metric if this time series is an alignment or reduction of other time series.When creating a time series, this field is optional. If present, it must be the same as the metric kind of the associated metric. If the associated metric's descriptor must be auto-created, then this field specifies the metric kind of the new descriptor and must be either GAUGE (the default) or CUMULATIVE.",
-          "type": "string"
-        },
-        "metric": {
-          "$ref": "Metric",
-          "description": "The associated metric. A fully-specified metric used to identify the time series."
-        },
-        "points": {
-          "description": "The data points of this time series. When listing time series, the order of the points is specified by the list method.When creating a time series, this field must contain exactly one point and the point's type must be the same as the value type of the associated metric. If the associated metric's descriptor must be auto-created, then the value type of the descriptor is determined by the point's type, which must be BOOL, INT64, DOUBLE, or DISTRIBUTION.",
-          "type": "array",
-          "items": {
-            "$ref": "Point"
-          }
+          ]
         }
       },
       "id": "TimeSeries"
@@ -1824,38 +649,21 @@
       },
       "id": "CreateTimeSeriesRequest"
     },
-    "ListCategoriesResponse": {
-      "description": "The ListCategories response.",
-      "type": "object",
-      "properties": {
-        "category": {
-          "description": "The Categories that match the specified filters.",
-          "type": "array",
-          "items": {
-            "$ref": "Category"
-          }
-        },
-        "nextPageToken": {
-          "description": "If there are more results than have been returned, then this field is set to a non-empty value. To see the additional results, use that value as pageToken in the next call to this method.",
-          "type": "string"
-        }
-      },
-      "id": "ListCategoriesResponse"
-    },
     "Distribution": {
+      "description": "Distribution contains summary statistics for a population of values and, optionally, a histogram representing the distribution of those values across a specified set of histogram buckets.The summary statistics are the count, mean, sum of the squared deviation from the mean, the minimum, and the maximum of the set of population of values.The histogram is based on a sequence of buckets and gives a count of values that fall into each bucket. The boundaries of the buckets are given either explicitly or by specifying parameters for a method of computing them (buckets of fixed width or buckets of exponentially increasing width).Although it is not forbidden, it is generally a bad idea to include non-finite values (infinities or NaNs) in the population of values, as this will render the mean and sum_of_squared_deviation fields meaningless.",
       "type": "object",
       "properties": {
         "bucketCounts": {
           "description": "If bucket_options is given, then the sum of the values in bucket_counts must equal the value in count. If bucket_options is not given, no bucket_counts fields may be given.Bucket counts are given in order under the numbering scheme described above (the underflow bucket has number 0; the finite buckets, if any, have numbers 1 through N-2; the overflow bucket has number N-1).The size of bucket_counts must be no greater than N as defined in bucket_options.Any suffix of trailing zero bucket_count fields may be omitted.",
           "type": "array",
           "items": {
-            "type": "string",
-            "format": "int64"
+            "format": "int64",
+            "type": "string"
           }
         },
         "bucketOptions": {
-          "description": "Defines the histogram bucket boundaries.",
-          "$ref": "BucketOptions"
+          "$ref": "BucketOptions",
+          "description": "Defines the histogram bucket boundaries."
         },
         "sumOfSquaredDeviation": {
           "description": "The sum of squared deviations from the mean of the values in the population. For values x_i this is:\nSum[i=1..n]((x_i - mean)^2)\nKnuth, \"The Art of Computer Programming\", Vol. 2, page 323, 3rd edition describes Welford's method for accumulating this sum in one pass.If count is zero then this field must be zero.",
@@ -1877,23 +685,22 @@
           "type": "number"
         }
       },
-      "id": "Distribution",
-      "description": "Distribution contains summary statistics for a population of values and, optionally, a histogram representing the distribution of those values across a specified set of histogram buckets.The summary statistics are the count, mean, sum of the squared deviation from the mean, the minimum, and the maximum of the set of population of values.The histogram is based on a sequence of buckets and gives a count of values that fall into each bucket. The boundaries of the buckets are given either explicitly or by specifying parameters for a method of computing them (buckets of fixed width or buckets of exponentially increasing width).Although it is not forbidden, it is generally a bad idea to include non-finite values (infinities or NaNs) in the population of values, as this will render the mean and sum_of_squared_deviation fields meaningless."
+      "id": "Distribution"
     },
     "MonitoredResource": {
       "description": "An object representing a resource that can be used for monitoring, logging, billing, or other purposes. Examples include virtual machine instances, databases, and storage devices such as disks. The type field identifies a MonitoredResourceDescriptor object that describes the resource's schema. Information in the labels field identifies the actual resource and its attributes according to the schema. For example, a particular Compute Engine VM instance could be represented by the following object, because the MonitoredResourceDescriptor for \"gce_instance\" has labels \"instance_id\" and \"zone\":\n{ \"type\": \"gce_instance\",\n  \"labels\": { \"instance_id\": \"12345678901234\",\n              \"zone\": \"us-central1-a\" }}\n",
       "type": "object",
       "properties": {
-        "type": {
-          "type": "string",
-          "description": "Required. The monitored resource type. This field must match the type field of a MonitoredResourceDescriptor object. For example, the type of a Cloud SQL database is \"cloudsql_database\"."
-        },
         "labels": {
+          "description": "Required. Values for all of the labels listed in the associated monitored resource descriptor. For example, Cloud SQL databases use the labels \"database_id\" and \"zone\".",
           "type": "object",
           "additionalProperties": {
             "type": "string"
-          },
-          "description": "Required. Values for all of the labels listed in the associated monitored resource descriptor. For example, Cloud SQL databases use the labels \"database_id\" and \"zone\"."
+          }
+        },
+        "type": {
+          "description": "Required. The monitored resource type. This field must match the type field of a MonitoredResourceDescriptor object. For example, the type of a Cloud SQL database is \"cloudsql_database\".",
+          "type": "string"
         }
       },
       "id": "MonitoredResource"
@@ -1917,19 +724,16 @@
       "id": "ListMetricDescriptorsResponse"
     },
     "MonitoredResourceDescriptor": {
+      "description": "An object that describes the schema of a MonitoredResource object using a type name and a set of labels. For example, the monitored resource descriptor for Google Compute Engine VM instances has a type of \"gce_instance\" and specifies the use of the labels \"instance_id\" and \"zone\" to identify particular VM instances.Different APIs can support different monitored resource types. APIs generally provide a list method that returns the monitored resource descriptors used by the API.",
       "type": "object",
       "properties": {
-        "name": {
-          "description": "Optional. The resource name of the monitored resource descriptor: \"projects/{project_id}/monitoredResourceDescriptors/{type}\" where {type} is the value of the type field in this object and {project_id} is a project ID that provides API-specific context for accessing the type. APIs that do not use project information can use the resource name format \"monitoredResourceDescriptors/{type}\".",
-          "type": "string"
-        },
         "displayName": {
           "description": "Optional. A concise name for the monitored resource type that might be displayed in user interfaces. It should be a Title Cased Noun Phrase, without any article or other determiners. For example, \"Google Cloud SQL Database\".",
           "type": "string"
         },
         "description": {
-          "type": "string",
-          "description": "Optional. A detailed description of the monitored resource type that might be used in documentation."
+          "description": "Optional. A detailed description of the monitored resource type that might be used in documentation.",
+          "type": "string"
         },
         "type": {
           "description": "Required. The monitored resource type. For example, the type \"cloudsql_database\" represents databases in Google Cloud SQL. The maximum length of this value is 256 characters.",
@@ -1941,13 +745,15 @@
           "items": {
             "$ref": "LabelDescriptor"
           }
+        },
+        "name": {
+          "description": "Optional. The resource name of the monitored resource descriptor: \"projects/{project_id}/monitoredResourceDescriptors/{type}\" where {type} is the value of the type field in this object and {project_id} is a project ID that provides API-specific context for accessing the type. APIs that do not use project information can use the resource name format \"monitoredResourceDescriptors/{type}\".",
+          "type": "string"
         }
       },
-      "id": "MonitoredResourceDescriptor",
-      "description": "An object that describes the schema of a MonitoredResource object using a type name and a set of labels. For example, the monitored resource descriptor for Google Compute Engine VM instances has a type of \"gce_instance\" and specifies the use of the labels \"instance_id\" and \"zone\" to identify particular VM instances.Different APIs can support different monitored resource types. APIs generally provide a list method that returns the monitored resource descriptors used by the API."
+      "id": "MonitoredResourceDescriptor"
     },
     "TypedValue": {
-      "id": "TypedValue",
       "description": "A single strongly-typed value.",
       "type": "object",
       "properties": {
@@ -1973,14 +779,84 @@
           "$ref": "Distribution",
           "description": "A distribution value."
         }
-      }
+      },
+      "id": "TypedValue"
+    },
+    "CollectdPayload": {
+      "description": "A collection of data points sent from a collectd-based plugin. See the collectd documentation for more information.",
+      "type": "object",
+      "properties": {
+        "values": {
+          "description": "The measured values during this time interval. Each value must have a different dataSourceName.",
+          "type": "array",
+          "items": {
+            "$ref": "CollectdValue"
+          }
+        },
+        "typeInstance": {
+          "description": "The measurement type instance. Example: \"used\".",
+          "type": "string"
+        },
+        "metadata": {
+          "description": "The measurement metadata. Example: \"process_id\" -\u003e 12345",
+          "type": "object",
+          "additionalProperties": {
+            "$ref": "TypedValue"
+          }
+        },
+        "type": {
+          "description": "The measurement type. Example: \"memory\".",
+          "type": "string"
+        },
+        "plugin": {
+          "description": "The name of the plugin. Example: \"disk\".",
+          "type": "string"
+        },
+        "pluginInstance": {
+          "description": "The instance name of the plugin Example: \"hdcl\".",
+          "type": "string"
+        },
+        "endTime": {
+          "description": "The end time of the interval.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "startTime": {
+          "description": "The start time of the interval.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "CollectdPayload"
+    },
+    "Linear": {
+      "description": "Specify a sequence of buckets that all have the same width (except overflow and underflow). Each bucket represents a constant absolute uncertainty on the specific value in the bucket.Defines num_finite_buckets + 2 (= N) buckets with these boundaries for bucket i:Upper bound (0 \u003c= i \u003c N-1): offset + (width * i).  Lower bound (1 \u003c= i \u003c N): offset + (width * (i - 1)).",
+      "type": "object",
+      "properties": {
+        "numFiniteBuckets": {
+          "description": "Must be greater than 0.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "width": {
+          "description": "Must be greater than 0.",
+          "format": "double",
+          "type": "number"
+        },
+        "offset": {
+          "description": "Lower bound of the first bucket.",
+          "format": "double",
+          "type": "number"
+        }
+      },
+      "id": "Linear"
     }
   },
-  "protocol": "rest",
   "icons": {
-    "x32": "http://www.google.com/images/icons/product/search-32.gif",
-    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
   },
+  "protocol": "rest",
   "canonicalName": "Monitoring",
   "auth": {
     "oauth2": {
@@ -2004,5 +880,749 @@
   "ownerDomain": "google.com",
   "name": "monitoring",
   "batchPath": "batch",
-  "title": "Stackdriver Monitoring API"
+  "title": "Stackdriver Monitoring API",
+  "ownerName": "Google",
+  "resources": {
+    "projects": {
+      "resources": {
+        "groups": {
+          "methods": {
+            "delete": {
+              "description": "Deletes an existing group.",
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "DELETE",
+              "parameters": {
+                "name": {
+                  "location": "path",
+                  "description": "The group to delete. The format is \"projects/{project_id_or_number}/groups/{group_id}\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/groups/[^/]+$"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring"
+              ],
+              "flatPath": "v3/projects/{projectsId}/groups/{groupsId}",
+              "path": "v3/{+name}",
+              "id": "monitoring.projects.groups.delete"
+            },
+            "list": {
+              "flatPath": "v3/projects/{projectsId}/groups",
+              "path": "v3/{+name}/groups",
+              "id": "monitoring.projects.groups.list",
+              "description": "Lists the existing groups.",
+              "response": {
+                "$ref": "ListGroupsResponse"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring",
+                "https://www.googleapis.com/auth/monitoring.read"
+              ],
+              "parameters": {
+                "pageToken": {
+                  "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "description": "A positive number that is the maximum number of results to return.",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                },
+                "ancestorsOfGroup": {
+                  "location": "query",
+                  "description": "A group name: \"projects/{project_id_or_number}/groups/{group_id}\". Returns groups that are ancestors of the specified group. The groups are returned in order, starting with the immediate parent and ending with the most distant ancestor. If the specified group has no immediate parent, the results are empty.",
+                  "type": "string"
+                },
+                "name": {
+                  "description": "The project whose groups are to be listed. The format is \"projects/{project_id_or_number}\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path"
+                },
+                "childrenOfGroup": {
+                  "description": "A group name: \"projects/{project_id_or_number}/groups/{group_id}\". Returns groups whose parentName field contains the group name. If no groups have this parent, the results are empty.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "descendantsOfGroup": {
+                  "location": "query",
+                  "description": "A group name: \"projects/{project_id_or_number}/groups/{group_id}\". Returns the descendants of the specified group. This is a superset of the results returned by the childrenOfGroup filter, and includes children-of-children, and so forth.",
+                  "type": "string"
+                }
+              }
+            },
+            "get": {
+              "response": {
+                "$ref": "Group"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "GET",
+              "parameters": {
+                "name": {
+                  "location": "path",
+                  "description": "The group to retrieve. The format is \"projects/{project_id_or_number}/groups/{group_id}\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/groups/[^/]+$"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring",
+                "https://www.googleapis.com/auth/monitoring.read"
+              ],
+              "flatPath": "v3/projects/{projectsId}/groups/{groupsId}",
+              "path": "v3/{+name}",
+              "id": "monitoring.projects.groups.get",
+              "description": "Gets a single group."
+            },
+            "update": {
+              "description": "Updates an existing group. You can change any group attributes except name.",
+              "request": {
+                "$ref": "Group"
+              },
+              "response": {
+                "$ref": "Group"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "PUT",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "Output only. The name of this group. The format is \"projects/{project_id_or_number}/groups/{group_id}\". When creating a group, this field is ignored and a new name is created consisting of the project specified in the call to CreateGroup and a unique {group_id} that is generated automatically.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/groups/[^/]+$",
+                  "location": "path"
+                },
+                "validateOnly": {
+                  "location": "query",
+                  "description": "If true, validate this request but do not update the existing group.",
+                  "type": "boolean"
+                }
+              },
+              "flatPath": "v3/projects/{projectsId}/groups/{groupsId}",
+              "path": "v3/{+name}",
+              "id": "monitoring.projects.groups.update"
+            },
+            "create": {
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "Group"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "The project in which to create the group. The format is \"projects/{project_id_or_number}\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path"
+                },
+                "validateOnly": {
+                  "description": "If true, validate this request but do not create the group.",
+                  "type": "boolean",
+                  "location": "query"
+                }
+              },
+              "flatPath": "v3/projects/{projectsId}/groups",
+              "id": "monitoring.projects.groups.create",
+              "path": "v3/{+name}/groups",
+              "description": "Creates a new group.",
+              "request": {
+                "$ref": "Group"
+              }
+            }
+          },
+          "resources": {
+            "members": {
+              "methods": {
+                "list": {
+                  "description": "Lists the monitored resources that are members of a group.",
+                  "response": {
+                    "$ref": "ListGroupMembersResponse"
+                  },
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "httpMethod": "GET",
+                  "parameters": {
+                    "filter": {
+                      "location": "query",
+                      "description": "An optional list filter describing the members to be returned. The filter may reference the type, labels, and metadata of monitored resources that comprise the group. For example, to return only resources representing Compute Engine VM instances, use this filter:\nresource.type = \"gce_instance\"\n",
+                      "type": "string"
+                    },
+                    "pageToken": {
+                      "location": "query",
+                      "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
+                      "type": "string"
+                    },
+                    "interval.startTime": {
+                      "location": "query",
+                      "description": "Optional. The beginning of the time interval. The default value for the start time is the end time. The start time must not be later than the end time.",
+                      "format": "google-datetime",
+                      "type": "string"
+                    },
+                    "pageSize": {
+                      "description": "A positive number that is the maximum number of results to return.",
+                      "format": "int32",
+                      "type": "integer",
+                      "location": "query"
+                    },
+                    "name": {
+                      "location": "path",
+                      "description": "The group whose members are listed. The format is \"projects/{project_id_or_number}/groups/{group_id}\".",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/groups/[^/]+$"
+                    },
+                    "interval.endTime": {
+                      "description": "Required. The end of the time interval.",
+                      "format": "google-datetime",
+                      "type": "string",
+                      "location": "query"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/monitoring",
+                    "https://www.googleapis.com/auth/monitoring.read"
+                  ],
+                  "flatPath": "v3/projects/{projectsId}/groups/{groupsId}/members",
+                  "path": "v3/{+name}/members",
+                  "id": "monitoring.projects.groups.members.list"
+                }
+              }
+            }
+          }
+        },
+        "collectdTimeSeries": {
+          "methods": {
+            "create": {
+              "request": {
+                "$ref": "CreateCollectdTimeSeriesRequest"
+              },
+              "description": "Stackdriver Monitoring Agent only: Creates a new time series.\u003caside class=\"caution\"\u003eThis method is only for use by the Stackdriver Monitoring Agent. Use projects.timeSeries.create instead.\u003c/aside\u003e",
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameters": {
+                "name": {
+                  "description": "The project in which to create the time series. The format is \"projects/PROJECT_ID_OR_NUMBER\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring",
+                "https://www.googleapis.com/auth/monitoring.write"
+              ],
+              "flatPath": "v3/projects/{projectsId}/collectdTimeSeries",
+              "id": "monitoring.projects.collectdTimeSeries.create",
+              "path": "v3/{+name}/collectdTimeSeries"
+            }
+          }
+        },
+        "timeSeries": {
+          "methods": {
+            "list": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "ListTimeSeriesResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring",
+                "https://www.googleapis.com/auth/monitoring.read"
+              ],
+              "parameters": {
+                "interval.endTime": {
+                  "description": "Required. The end of the time interval.",
+                  "format": "google-datetime",
+                  "type": "string",
+                  "location": "query"
+                },
+                "aggregation.alignmentPeriod": {
+                  "location": "query",
+                  "description": "The alignment period for per-time series alignment. If present, alignmentPeriod must be at least 60 seconds. After per-time series alignment, each time series will contain data points only on the period boundaries. If perSeriesAligner is not specified or equals ALIGN_NONE, then this field is ignored. If perSeriesAligner is specified and does not equal ALIGN_NONE, then this field must be defined; otherwise an error is returned.",
+                  "format": "google-duration",
+                  "type": "string"
+                },
+                "pageSize": {
+                  "description": "A positive number that is the maximum number of results to return. When view field sets to FULL, it limits the number of Points server will return; if view field is HEADERS, it limits the number of TimeSeries server will return.",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                },
+                "orderBy": {
+                  "description": "Specifies the order in which the points of the time series should be returned. By default, results are not ordered. Currently, this field must be left blank.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "aggregation.crossSeriesReducer": {
+                  "description": "The approach to be used to combine time series. Not all reducer functions may be applied to all time series, depending on the metric type and the value type of the original time series. Reduction may change the metric type of value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.",
+                  "type": "string",
+                  "location": "query",
+                  "enum": [
+                    "REDUCE_NONE",
+                    "REDUCE_MEAN",
+                    "REDUCE_MIN",
+                    "REDUCE_MAX",
+                    "REDUCE_SUM",
+                    "REDUCE_STDDEV",
+                    "REDUCE_COUNT",
+                    "REDUCE_COUNT_TRUE",
+                    "REDUCE_FRACTION_TRUE",
+                    "REDUCE_PERCENTILE_99",
+                    "REDUCE_PERCENTILE_95",
+                    "REDUCE_PERCENTILE_50",
+                    "REDUCE_PERCENTILE_05"
+                  ]
+                },
+                "filter": {
+                  "description": "A monitoring filter that specifies which time series should be returned. The filter must specify a single metric type, and can additionally specify metric labels and other information. For example:\nmetric.type = \"compute.googleapis.com/instance/cpu/usage_time\" AND\n    metric.label.instance_name = \"my-instance-name\"\n",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageToken": {
+                  "location": "query",
+                  "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
+                  "type": "string"
+                },
+                "aggregation.perSeriesAligner": {
+                  "description": "The approach to be used to align individual time series. Not all alignment functions may be applied to all time series, depending on the metric type and value type of the original time series. Alignment may change the metric type or the value type of the time series.Time series data must be aligned in order to perform cross-time series reduction. If crossSeriesReducer is specified, then perSeriesAligner must be specified and not equal ALIGN_NONE and alignmentPeriod must be specified; otherwise, an error is returned.",
+                  "type": "string",
+                  "location": "query",
+                  "enum": [
+                    "ALIGN_NONE",
+                    "ALIGN_DELTA",
+                    "ALIGN_RATE",
+                    "ALIGN_INTERPOLATE",
+                    "ALIGN_NEXT_OLDER",
+                    "ALIGN_MIN",
+                    "ALIGN_MAX",
+                    "ALIGN_MEAN",
+                    "ALIGN_COUNT",
+                    "ALIGN_SUM",
+                    "ALIGN_STDDEV",
+                    "ALIGN_COUNT_TRUE",
+                    "ALIGN_FRACTION_TRUE",
+                    "ALIGN_PERCENTILE_99",
+                    "ALIGN_PERCENTILE_95",
+                    "ALIGN_PERCENTILE_50",
+                    "ALIGN_PERCENTILE_05"
+                  ]
+                },
+                "interval.startTime": {
+                  "location": "query",
+                  "description": "Optional. The beginning of the time interval. The default value for the start time is the end time. The start time must not be later than the end time.",
+                  "format": "google-datetime",
+                  "type": "string"
+                },
+                "view": {
+                  "description": "Specifies which information is returned about the time series.",
+                  "type": "string",
+                  "location": "query",
+                  "enum": [
+                    "FULL",
+                    "HEADERS"
+                  ]
+                },
+                "name": {
+                  "location": "path",
+                  "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                },
+                "aggregation.groupByFields": {
+                  "description": "The set of fields to preserve when crossSeriesReducer is specified. The groupByFields determine how the time series are partitioned into subsets prior to applying the aggregation function. Each subset contains time series that have the same value for each of the grouping fields. Each individual time series is a member of exactly one subset. The crossSeriesReducer is applied to each subset of time series. It is not possible to reduce across different resource types, so this field implicitly contains resource.type. Fields not specified in groupByFields are aggregated away. If groupByFields is not specified and all the time series have the same resource type, then the time series are aggregated into a single output time series. If crossSeriesReducer is not defined, this field is ignored.",
+                  "type": "string",
+                  "repeated": true,
+                  "location": "query"
+                }
+              },
+              "flatPath": "v3/projects/{projectsId}/timeSeries",
+              "id": "monitoring.projects.timeSeries.list",
+              "path": "v3/{+name}/timeSeries",
+              "description": "Lists time series that match a filter. This method does not require a Stackdriver account."
+            },
+            "create": {
+              "request": {
+                "$ref": "CreateTimeSeriesRequest"
+              },
+              "description": "Creates or adds data to one or more time series. The response is empty if all time series in the request were written. If any time series could not be written, a corresponding failure message is included in the error response.",
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameters": {
+                "name": {
+                  "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring",
+                "https://www.googleapis.com/auth/monitoring.write"
+              ],
+              "flatPath": "v3/projects/{projectsId}/timeSeries",
+              "id": "monitoring.projects.timeSeries.create",
+              "path": "v3/{+name}/timeSeries"
+            }
+          }
+        },
+        "metricDescriptors": {
+          "methods": {
+            "delete": {
+              "description": "Deletes a metric descriptor. Only user-created custom metrics can be deleted.",
+              "httpMethod": "DELETE",
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring"
+              ],
+              "parameters": {
+                "name": {
+                  "location": "path",
+                  "description": "The metric descriptor on which to execute the request. The format is \"projects/{project_id_or_number}/metricDescriptors/{metric_id}\". An example of {metric_id} is: \"custom.googleapis.com/my_test_metric\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/metricDescriptors/.+$"
+                }
+              },
+              "flatPath": "v3/projects/{projectsId}/metricDescriptors/{metricDescriptorsId}",
+              "id": "monitoring.projects.metricDescriptors.delete",
+              "path": "v3/{+name}"
+            },
+            "list": {
+              "flatPath": "v3/projects/{projectsId}/metricDescriptors",
+              "id": "monitoring.projects.metricDescriptors.list",
+              "path": "v3/{+name}/metricDescriptors",
+              "description": "Lists metric descriptors that match a filter. This method does not require a Stackdriver account.",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "ListMetricDescriptorsResponse"
+              },
+              "parameters": {
+                "pageSize": {
+                  "location": "query",
+                  "description": "A positive number that is the maximum number of results to return.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "filter": {
+                  "description": "If this field is empty, all custom and system-defined metric descriptors are returned. Otherwise, the filter specifies which metric descriptors are to be returned. For example, the following filter matches all custom metrics:\nmetric.type = starts_with(\"custom.googleapis.com/\")\n",
+                  "type": "string",
+                  "location": "query"
+                },
+                "name": {
+                  "location": "path",
+                  "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                },
+                "pageToken": {
+                  "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
+                  "type": "string",
+                  "location": "query"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring",
+                "https://www.googleapis.com/auth/monitoring.read",
+                "https://www.googleapis.com/auth/monitoring.write"
+              ]
+            },
+            "get": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "MetricDescriptor"
+              },
+              "parameters": {
+                "name": {
+                  "location": "path",
+                  "description": "The metric descriptor on which to execute the request. The format is \"projects/{project_id_or_number}/metricDescriptors/{metric_id}\". An example value of {metric_id} is \"compute.googleapis.com/instance/disk/read_bytes_count\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/metricDescriptors/.+$"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring",
+                "https://www.googleapis.com/auth/monitoring.read",
+                "https://www.googleapis.com/auth/monitoring.write"
+              ],
+              "flatPath": "v3/projects/{projectsId}/metricDescriptors/{metricDescriptorsId}",
+              "id": "monitoring.projects.metricDescriptors.get",
+              "path": "v3/{+name}",
+              "description": "Gets a single metric descriptor. This method does not require a Stackdriver account."
+            },
+            "create": {
+              "description": "Creates a new metric descriptor. User-created metric descriptors define custom metrics.",
+              "request": {
+                "$ref": "MetricDescriptor"
+              },
+              "response": {
+                "$ref": "MetricDescriptor"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring",
+                "https://www.googleapis.com/auth/monitoring.write"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v3/projects/{projectsId}/metricDescriptors",
+              "path": "v3/{+name}/metricDescriptors",
+              "id": "monitoring.projects.metricDescriptors.create"
+            }
+          }
+        },
+        "monitoredResourceDescriptors": {
+          "methods": {
+            "list": {
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "ListMonitoredResourceDescriptorsResponse"
+              },
+              "parameters": {
+                "pageSize": {
+                  "location": "query",
+                  "description": "A positive number that is the maximum number of results to return.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "filter": {
+                  "location": "query",
+                  "description": "An optional filter describing the descriptors to be returned. The filter can reference the descriptor's type and labels. For example, the following filter returns only Google Compute Engine descriptors that have an id label:\nresource.type = starts_with(\"gce_\") AND resource.label:id\n",
+                  "type": "string"
+                },
+                "name": {
+                  "description": "The project on which to execute the request. The format is \"projects/{project_id_or_number}\".",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path"
+                },
+                "pageToken": {
+                  "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
+                  "type": "string",
+                  "location": "query"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring",
+                "https://www.googleapis.com/auth/monitoring.read",
+                "https://www.googleapis.com/auth/monitoring.write"
+              ],
+              "flatPath": "v3/projects/{projectsId}/monitoredResourceDescriptors",
+              "id": "monitoring.projects.monitoredResourceDescriptors.list",
+              "path": "v3/{+name}/monitoredResourceDescriptors",
+              "description": "Lists monitored resource descriptors that match a filter. This method does not require a Stackdriver account."
+            },
+            "get": {
+              "response": {
+                "$ref": "MonitoredResourceDescriptor"
+              },
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/monitoring",
+                "https://www.googleapis.com/auth/monitoring.read",
+                "https://www.googleapis.com/auth/monitoring.write"
+              ],
+              "parameters": {
+                "name": {
+                  "description": "The monitored resource descriptor to get. The format is \"projects/{project_id_or_number}/monitoredResourceDescriptors/{resource_type}\". The {resource_type} is a predefined type, such as cloudsql_database.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/monitoredResourceDescriptors/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v3/projects/{projectsId}/monitoredResourceDescriptors/{monitoredResourceDescriptorsId}",
+              "path": "v3/{+name}",
+              "id": "monitoring.projects.monitoredResourceDescriptors.get",
+              "description": "Gets a single monitored resource descriptor. This method does not require a Stackdriver account."
+            }
+          }
+        }
+      }
+    }
+  },
+  "parameters": {
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
+    },
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
+    },
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "alt": {
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string",
+      "location": "query"
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
+    }
+  },
+  "version": "v3",
+  "baseUrl": "https://monitoring.googleapis.com/",
+  "description": "Manages your Stackdriver Monitoring data and configurations. Most projects must be associated with a Stackdriver account, with a few exceptions as noted on the individual method pages.",
+  "kind": "discovery#restDescription",
+  "servicePath": "",
+  "basePath": "",
+  "revision": "20170206",
+  "documentationLink": "https://cloud.google.com/monitoring/api/",
+  "id": "monitoring:v3"
 }
diff --git a/monitoring/v3/monitoring-gen.go b/monitoring/v3/monitoring-gen.go
index 7e837a2..a8b8cf2 100644
--- a/monitoring/v3/monitoring-gen.go
+++ b/monitoring/v3/monitoring-gen.go
@@ -67,7 +67,6 @@
 		return nil, errors.New("client is nil")
 	}
 	s := &Service{client: client, BasePath: basePath}
-	s.Categories = NewCategoriesService(s)
 	s.Projects = NewProjectsService(s)
 	return s, nil
 }
@@ -78,8 +77,6 @@
 	UserAgent                 string // optional additional User-Agent fragment
 	GoogleClientHeaderElement string // client header fragment, for Google use only
 
-	Categories *CategoriesService
-
 	Projects *ProjectsService
 }
 
@@ -94,30 +91,8 @@
 	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
 }
 
-func NewCategoriesService(s *Service) *CategoriesService {
-	rs := &CategoriesService{s: s}
-	rs.MetricAssociations = NewCategoriesMetricAssociationsService(s)
-	return rs
-}
-
-type CategoriesService struct {
-	s *Service
-
-	MetricAssociations *CategoriesMetricAssociationsService
-}
-
-func NewCategoriesMetricAssociationsService(s *Service) *CategoriesMetricAssociationsService {
-	rs := &CategoriesMetricAssociationsService{s: s}
-	return rs
-}
-
-type CategoriesMetricAssociationsService struct {
-	s *Service
-}
-
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
-	rs.Categories = NewProjectsCategoriesService(s)
 	rs.CollectdTimeSeries = NewProjectsCollectdTimeSeriesService(s)
 	rs.Groups = NewProjectsGroupsService(s)
 	rs.MetricDescriptors = NewProjectsMetricDescriptorsService(s)
@@ -129,8 +104,6 @@
 type ProjectsService struct {
 	s *Service
 
-	Categories *ProjectsCategoriesService
-
 	CollectdTimeSeries *ProjectsCollectdTimeSeriesService
 
 	Groups *ProjectsGroupsService
@@ -142,27 +115,6 @@
 	TimeSeries *ProjectsTimeSeriesService
 }
 
-func NewProjectsCategoriesService(s *Service) *ProjectsCategoriesService {
-	rs := &ProjectsCategoriesService{s: s}
-	rs.MetricAssociations = NewProjectsCategoriesMetricAssociationsService(s)
-	return rs
-}
-
-type ProjectsCategoriesService struct {
-	s *Service
-
-	MetricAssociations *ProjectsCategoriesMetricAssociationsService
-}
-
-func NewProjectsCategoriesMetricAssociationsService(s *Service) *ProjectsCategoriesMetricAssociationsService {
-	rs := &ProjectsCategoriesMetricAssociationsService{s: s}
-	return rs
-}
-
-type ProjectsCategoriesMetricAssociationsService struct {
-	s *Service
-}
-
 func NewProjectsCollectdTimeSeriesService(s *Service) *ProjectsCollectdTimeSeriesService {
 	rs := &ProjectsCollectdTimeSeriesService{s: s}
 	return rs
@@ -273,55 +225,6 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// Category: A Vital Signs Category.
-type Category struct {
-	// Description: A human-readable description for the category. The
-	// description can be longer and contain more details.
-	Description string `json:"description,omitempty"`
-
-	// DisplayName: A human-readable name for the category.
-	DisplayName string `json:"displayName,omitempty"`
-
-	// IsDefault: A flag to indicate whether this category is part of
-	// Stackdriver's default taxonomy.
-	IsDefault bool `json:"isDefault,omitempty"`
-
-	// Name: Resource name for the category. e.g.
-	// projects/91091/categories/latency or
-	// projects/91091/categories/custom:goodness
-	Name string `json:"name,omitempty"`
-
-	// ShortName: Unique usually one-word name for this category. e.g.
-	// latency or custom:goodness
-	ShortName string `json:"shortName,omitempty"`
-
-	// ServerResponse contains the HTTP response code and headers from the
-	// server.
-	googleapi.ServerResponse `json:"-"`
-
-	// ForceSendFields is a list of field names (e.g. "Description") to
-	// unconditionally include in API requests. By default, fields with
-	// empty values are omitted from API requests. However, any non-pointer,
-	// non-interface field appearing in ForceSendFields will be sent to the
-	// server regardless of whether the field is empty or not. This may be
-	// used to include empty fields in Patch requests.
-	ForceSendFields []string `json:"-"`
-
-	// NullFields is a list of field names (e.g. "Description") to include
-	// in API requests with the JSON null value. By default, fields with
-	// empty values are omitted from API requests. However, any field with
-	// an empty value appearing in NullFields will be sent to the server as
-	// null. It is an error if a field in this list has a non-empty value.
-	// This may be used to include null fields in Patch requests.
-	NullFields []string `json:"-"`
-}
-
-func (s *Category) MarshalJSON() ([]byte, error) {
-	type noMethod Category
-	raw := noMethod(*s)
-	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
-}
-
 // CollectdPayload: A collection of data points sent from a
 // collectd-based plugin. See the collectd documentation for more
 // information.
@@ -946,43 +849,6 @@
 	return nil
 }
 
-// ListCategoriesResponse: The ListCategories response.
-type ListCategoriesResponse struct {
-	// Category: The Categories that match the specified filters.
-	Category []*Category `json:"category,omitempty"`
-
-	// NextPageToken: If there are more results than have been returned,
-	// then this field is set to a non-empty value. To see the additional
-	// results, use that value as pageToken in the next call to this method.
-	NextPageToken string `json:"nextPageToken,omitempty"`
-
-	// ServerResponse contains the HTTP response code and headers from the
-	// server.
-	googleapi.ServerResponse `json:"-"`
-
-	// ForceSendFields is a list of field names (e.g. "Category") to
-	// unconditionally include in API requests. By default, fields with
-	// empty values are omitted from API requests. However, any non-pointer,
-	// non-interface field appearing in ForceSendFields will be sent to the
-	// server regardless of whether the field is empty or not. This may be
-	// used to include empty fields in Patch requests.
-	ForceSendFields []string `json:"-"`
-
-	// NullFields is a list of field names (e.g. "Category") to include in
-	// API requests with the JSON null value. By default, fields with empty
-	// values are omitted from API requests. However, any field with an
-	// empty value appearing in NullFields will be sent to the server as
-	// null. It is an error if a field in this list has a non-empty value.
-	// This may be used to include null fields in Patch requests.
-	NullFields []string `json:"-"`
-}
-
-func (s *ListCategoriesResponse) MarshalJSON() ([]byte, error) {
-	type noMethod ListCategoriesResponse
-	raw := noMethod(*s)
-	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
-}
-
 // ListGroupMembersResponse: The ListGroupMembers response.
 type ListGroupMembersResponse struct {
 	// Members: A set of monitored resources in the group.
@@ -1060,45 +926,6 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// ListMetricAssociationsResponse: The MetricAssociations response.
-type ListMetricAssociationsResponse struct {
-	// MetricAssociations: The MetricAssociations that match the specified
-	// filters.
-	MetricAssociations []*MetricAssociation `json:"metricAssociations,omitempty"`
-
-	// NextPageToken: If there are more results than have been returned,
-	// then this field is set to a non-empty value. To see the additional
-	// results, use that value as pageToken in the next call to this method.
-	NextPageToken string `json:"nextPageToken,omitempty"`
-
-	// ServerResponse contains the HTTP response code and headers from the
-	// server.
-	googleapi.ServerResponse `json:"-"`
-
-	// ForceSendFields is a list of field names (e.g. "MetricAssociations")
-	// to unconditionally include in API requests. By default, fields with
-	// empty values are omitted from API requests. However, any non-pointer,
-	// non-interface field appearing in ForceSendFields will be sent to the
-	// server regardless of whether the field is empty or not. This may be
-	// used to include empty fields in Patch requests.
-	ForceSendFields []string `json:"-"`
-
-	// NullFields is a list of field names (e.g. "MetricAssociations") to
-	// include in API requests with the JSON null value. By default, fields
-	// with empty values are omitted from API requests. However, any field
-	// with an empty value appearing in NullFields will be sent to the
-	// server as null. It is an error if a field in this list has a
-	// non-empty value. This may be used to include null fields in Patch
-	// requests.
-	NullFields []string `json:"-"`
-}
-
-func (s *ListMetricAssociationsResponse) MarshalJSON() ([]byte, error) {
-	type noMethod ListMetricAssociationsResponse
-	raw := noMethod(*s)
-	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
-}
-
 // ListMetricDescriptorsResponse: The ListMetricDescriptors response.
 type ListMetricDescriptorsResponse struct {
 	// MetricDescriptors: The metric descriptors that are available to the
@@ -1249,47 +1076,6 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// MetricAssociation: A Vital Signs MetricAssociation, representing the
-// inclusion of its referenced metric type within its parent category.
-type MetricAssociation struct {
-	// IsDefault: A flag to indicate whether this association is part of
-	// Stackdriver's default taxonomy.
-	IsDefault bool `json:"isDefault,omitempty"`
-
-	// MetricType: Resource name of the metric. It must be the full resource
-	// name. For example, "compute.googleapis.com/instance/cpu/utilization".
-	MetricType string `json:"metricType,omitempty"`
-
-	// Name: Resource name for the metric association.
-	Name string `json:"name,omitempty"`
-
-	// ServerResponse contains the HTTP response code and headers from the
-	// server.
-	googleapi.ServerResponse `json:"-"`
-
-	// ForceSendFields is a list of field names (e.g. "IsDefault") to
-	// unconditionally include in API requests. By default, fields with
-	// empty values are omitted from API requests. However, any non-pointer,
-	// non-interface field appearing in ForceSendFields will be sent to the
-	// server regardless of whether the field is empty or not. This may be
-	// used to include empty fields in Patch requests.
-	ForceSendFields []string `json:"-"`
-
-	// NullFields is a list of field names (e.g. "IsDefault") to include in
-	// API requests with the JSON null value. By default, fields with empty
-	// values are omitted from API requests. However, any field with an
-	// empty value appearing in NullFields will be sent to the server as
-	// null. It is an error if a field in this list has a non-empty value.
-	// This may be used to include null fields in Patch requests.
-	NullFields []string `json:"-"`
-}
-
-func (s *MetricAssociation) MarshalJSON() ([]byte, error) {
-	type noMethod MetricAssociation
-	raw := noMethod(*s)
-	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
-}
-
 // MetricDescriptor: Defines a metric type and its schema. Once a metric
 // descriptor is created, deleting or altering it stops data collection
 // and makes the metric type's existing data unusable.
@@ -1938,1345 +1724,6 @@
 	return nil
 }
 
-// method id "monitoring.categories.list":
-
-type CategoriesListCall struct {
-	s            *Service
-	urlParams_   gensupport.URLParams
-	ifNoneMatch_ string
-	ctx_         context.Context
-	header_      http.Header
-}
-
-// List: List all Categories for a host project.
-func (r *CategoriesService) List() *CategoriesListCall {
-	c := &CategoriesListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
-	return c
-}
-
-// Filter sets the optional parameter "filter": A filter that specifies
-// what Categories to return.
-func (c *CategoriesListCall) Filter(filter string) *CategoriesListCall {
-	c.urlParams_.Set("filter", filter)
-	return c
-}
-
-// PageSize sets the optional parameter "pageSize": A positive number
-// that is the maximum number of results to return. When 0, use default
-// page size.
-func (c *CategoriesListCall) PageSize(pageSize int64) *CategoriesListCall {
-	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
-	return c
-}
-
-// PageToken sets the optional parameter "pageToken": If this field is
-// not empty then it must contain the nextPageToken value returned by a
-// previous call to this method. Using this field causes the method to
-// return additional results from the previous method call.
-func (c *CategoriesListCall) PageToken(pageToken string) *CategoriesListCall {
-	c.urlParams_.Set("pageToken", pageToken)
-	return c
-}
-
-// Parent sets the optional parameter "parent": Resource parent of the
-// project to get. Resource parent form is
-// projects/{project_id_or_number}.
-func (c *CategoriesListCall) Parent(parent string) *CategoriesListCall {
-	c.urlParams_.Set("parent", parent)
-	return c
-}
-
-// Fields allows partial responses to be retrieved. See
-// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *CategoriesListCall) Fields(s ...googleapi.Field) *CategoriesListCall {
-	c.urlParams_.Set("fields", googleapi.CombineFields(s))
-	return c
-}
-
-// IfNoneMatch sets the optional parameter which makes the operation
-// fail if the object's ETag matches the given value. This is useful for
-// getting updates only after the object has changed since the last
-// request. Use googleapi.IsNotModified to check whether the response
-// error from Do is the result of In-None-Match.
-func (c *CategoriesListCall) IfNoneMatch(entityTag string) *CategoriesListCall {
-	c.ifNoneMatch_ = entityTag
-	return c
-}
-
-// Context sets the context to be used in this call's Do method. Any
-// pending HTTP request will be aborted if the provided context is
-// canceled.
-func (c *CategoriesListCall) Context(ctx context.Context) *CategoriesListCall {
-	c.ctx_ = ctx
-	return c
-}
-
-// Header returns an http.Header that can be modified by the caller to
-// add HTTP headers to the request.
-func (c *CategoriesListCall) Header() http.Header {
-	if c.header_ == nil {
-		c.header_ = make(http.Header)
-	}
-	return c.header_
-}
-
-func (c *CategoriesListCall) doRequest(alt string) (*http.Response, error) {
-	reqHeaders := make(http.Header)
-	for k, v := range c.header_ {
-		reqHeaders[k] = v
-	}
-	reqHeaders.Set("User-Agent", c.s.userAgent())
-	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
-	if c.ifNoneMatch_ != "" {
-		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
-	}
-	var body io.Reader = nil
-	c.urlParams_.Set("alt", alt)
-	urls := googleapi.ResolveRelative(c.s.BasePath, "v3/categories")
-	urls += "?" + c.urlParams_.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	req.Header = reqHeaders
-	return gensupport.SendRequest(c.ctx_, c.s.client, req)
-}
-
-// Do executes the "monitoring.categories.list" call.
-// Exactly one of *ListCategoriesResponse or error will be non-nil. Any
-// non-2xx status code is an error. Response headers are in either
-// *ListCategoriesResponse.ServerResponse.Header or (if a response was
-// returned at all) in error.(*googleapi.Error).Header. Use
-// googleapi.IsNotModified to check whether the returned error was
-// because http.StatusNotModified was returned.
-func (c *CategoriesListCall) Do(opts ...googleapi.CallOption) (*ListCategoriesResponse, error) {
-	gensupport.SetOptions(c.urlParams_, opts...)
-	res, err := c.doRequest("json")
-	if res != nil && res.StatusCode == http.StatusNotModified {
-		if res.Body != nil {
-			res.Body.Close()
-		}
-		return nil, &googleapi.Error{
-			Code:   res.StatusCode,
-			Header: res.Header,
-		}
-	}
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	ret := &ListCategoriesResponse{
-		ServerResponse: googleapi.ServerResponse{
-			Header:         res.Header,
-			HTTPStatusCode: res.StatusCode,
-		},
-	}
-	target := &ret
-	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "List all Categories for a host project.",
-	//   "flatPath": "v3/categories",
-	//   "httpMethod": "GET",
-	//   "id": "monitoring.categories.list",
-	//   "parameterOrder": [],
-	//   "parameters": {
-	//     "filter": {
-	//       "description": "A filter that specifies what Categories to return.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "pageSize": {
-	//       "description": "A positive number that is the maximum number of results to return. When 0, use default page size.",
-	//       "format": "int32",
-	//       "location": "query",
-	//       "type": "integer"
-	//     },
-	//     "pageToken": {
-	//       "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "parent": {
-	//       "description": "Resource parent of the project to get. Resource parent form is projects/{project_id_or_number}.",
-	//       "location": "query",
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "v3/categories",
-	//   "response": {
-	//     "$ref": "ListCategoriesResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/cloud-platform",
-	//     "https://www.googleapis.com/auth/monitoring",
-	//     "https://www.googleapis.com/auth/monitoring.read"
-	//   ]
-	// }
-
-}
-
-// Pages invokes f for each page of results.
-// A non-nil error returned from f will halt the iteration.
-// The provided context supersedes any context provided to the Context method.
-func (c *CategoriesListCall) Pages(ctx context.Context, f func(*ListCategoriesResponse) error) error {
-	c.ctx_ = ctx
-	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
-	for {
-		x, err := c.Do()
-		if err != nil {
-			return err
-		}
-		if err := f(x); err != nil {
-			return err
-		}
-		if x.NextPageToken == "" {
-			return nil
-		}
-		c.PageToken(x.NextPageToken)
-	}
-}
-
-// method id "monitoring.categories.metricAssociations.list":
-
-type CategoriesMetricAssociationsListCall struct {
-	s            *Service
-	parent       string
-	urlParams_   gensupport.URLParams
-	ifNoneMatch_ string
-	ctx_         context.Context
-	header_      http.Header
-}
-
-// List: List the MetricAssociations in a given Category.
-func (r *CategoriesMetricAssociationsService) List(parent string) *CategoriesMetricAssociationsListCall {
-	c := &CategoriesMetricAssociationsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
-	c.parent = parent
-	return c
-}
-
-// Filter sets the optional parameter "filter": A filter that specifies
-// what MetricAssociations to return.
-func (c *CategoriesMetricAssociationsListCall) Filter(filter string) *CategoriesMetricAssociationsListCall {
-	c.urlParams_.Set("filter", filter)
-	return c
-}
-
-// PageSize sets the optional parameter "pageSize": A positive number
-// that is the maximum number of results to return. When 0, use default
-// page size.
-func (c *CategoriesMetricAssociationsListCall) PageSize(pageSize int64) *CategoriesMetricAssociationsListCall {
-	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
-	return c
-}
-
-// PageToken sets the optional parameter "pageToken": If this field is
-// not empty then it must contain the nextPageToken value returned by a
-// previous call to this method. Using this field causes the method to
-// return additional results from the previous method call.
-func (c *CategoriesMetricAssociationsListCall) PageToken(pageToken string) *CategoriesMetricAssociationsListCall {
-	c.urlParams_.Set("pageToken", pageToken)
-	return c
-}
-
-// Fields allows partial responses to be retrieved. See
-// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *CategoriesMetricAssociationsListCall) Fields(s ...googleapi.Field) *CategoriesMetricAssociationsListCall {
-	c.urlParams_.Set("fields", googleapi.CombineFields(s))
-	return c
-}
-
-// IfNoneMatch sets the optional parameter which makes the operation
-// fail if the object's ETag matches the given value. This is useful for
-// getting updates only after the object has changed since the last
-// request. Use googleapi.IsNotModified to check whether the response
-// error from Do is the result of In-None-Match.
-func (c *CategoriesMetricAssociationsListCall) IfNoneMatch(entityTag string) *CategoriesMetricAssociationsListCall {
-	c.ifNoneMatch_ = entityTag
-	return c
-}
-
-// Context sets the context to be used in this call's Do method. Any
-// pending HTTP request will be aborted if the provided context is
-// canceled.
-func (c *CategoriesMetricAssociationsListCall) Context(ctx context.Context) *CategoriesMetricAssociationsListCall {
-	c.ctx_ = ctx
-	return c
-}
-
-// Header returns an http.Header that can be modified by the caller to
-// add HTTP headers to the request.
-func (c *CategoriesMetricAssociationsListCall) Header() http.Header {
-	if c.header_ == nil {
-		c.header_ = make(http.Header)
-	}
-	return c.header_
-}
-
-func (c *CategoriesMetricAssociationsListCall) doRequest(alt string) (*http.Response, error) {
-	reqHeaders := make(http.Header)
-	for k, v := range c.header_ {
-		reqHeaders[k] = v
-	}
-	reqHeaders.Set("User-Agent", c.s.userAgent())
-	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
-	if c.ifNoneMatch_ != "" {
-		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
-	}
-	var body io.Reader = nil
-	c.urlParams_.Set("alt", alt)
-	urls := googleapi.ResolveRelative(c.s.BasePath, "v3/{+parent}/metricAssociations")
-	urls += "?" + c.urlParams_.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	req.Header = reqHeaders
-	googleapi.Expand(req.URL, map[string]string{
-		"parent": c.parent,
-	})
-	return gensupport.SendRequest(c.ctx_, c.s.client, req)
-}
-
-// Do executes the "monitoring.categories.metricAssociations.list" call.
-// Exactly one of *ListMetricAssociationsResponse or error will be
-// non-nil. Any non-2xx status code is an error. Response headers are in
-// either *ListMetricAssociationsResponse.ServerResponse.Header or (if a
-// response was returned at all) in error.(*googleapi.Error).Header. Use
-// googleapi.IsNotModified to check whether the returned error was
-// because http.StatusNotModified was returned.
-func (c *CategoriesMetricAssociationsListCall) Do(opts ...googleapi.CallOption) (*ListMetricAssociationsResponse, error) {
-	gensupport.SetOptions(c.urlParams_, opts...)
-	res, err := c.doRequest("json")
-	if res != nil && res.StatusCode == http.StatusNotModified {
-		if res.Body != nil {
-			res.Body.Close()
-		}
-		return nil, &googleapi.Error{
-			Code:   res.StatusCode,
-			Header: res.Header,
-		}
-	}
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	ret := &ListMetricAssociationsResponse{
-		ServerResponse: googleapi.ServerResponse{
-			Header:         res.Header,
-			HTTPStatusCode: res.StatusCode,
-		},
-	}
-	target := &ret
-	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "List the MetricAssociations in a given Category.",
-	//   "flatPath": "v3/categories/{categoriesId}/metricAssociations",
-	//   "httpMethod": "GET",
-	//   "id": "monitoring.categories.metricAssociations.list",
-	//   "parameterOrder": [
-	//     "parent"
-	//   ],
-	//   "parameters": {
-	//     "filter": {
-	//       "description": "A filter that specifies what MetricAssociations to return.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "pageSize": {
-	//       "description": "A positive number that is the maximum number of results to return. When 0, use default page size.",
-	//       "format": "int32",
-	//       "location": "query",
-	//       "type": "integer"
-	//     },
-	//     "pageToken": {
-	//       "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "parent": {
-	//       "description": "Resource parent of the category to get. Resource parent form is projects/{project_id_or_number}/categories/{short_name}.",
-	//       "location": "path",
-	//       "pattern": "^categories/[^/]+$",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "v3/{+parent}/metricAssociations",
-	//   "response": {
-	//     "$ref": "ListMetricAssociationsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/cloud-platform",
-	//     "https://www.googleapis.com/auth/monitoring",
-	//     "https://www.googleapis.com/auth/monitoring.read"
-	//   ]
-	// }
-
-}
-
-// Pages invokes f for each page of results.
-// A non-nil error returned from f will halt the iteration.
-// The provided context supersedes any context provided to the Context method.
-func (c *CategoriesMetricAssociationsListCall) Pages(ctx context.Context, f func(*ListMetricAssociationsResponse) error) error {
-	c.ctx_ = ctx
-	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
-	for {
-		x, err := c.Do()
-		if err != nil {
-			return err
-		}
-		if err := f(x); err != nil {
-			return err
-		}
-		if x.NextPageToken == "" {
-			return nil
-		}
-		c.PageToken(x.NextPageToken)
-	}
-}
-
-// method id "monitoring.projects.categories.create":
-
-type ProjectsCategoriesCreateCall struct {
-	s          *Service
-	parent     string
-	category   *Category
-	urlParams_ gensupport.URLParams
-	ctx_       context.Context
-	header_    http.Header
-}
-
-// Create: Create a new Category.
-func (r *ProjectsCategoriesService) Create(parent string, category *Category) *ProjectsCategoriesCreateCall {
-	c := &ProjectsCategoriesCreateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
-	c.parent = parent
-	c.category = category
-	return c
-}
-
-// Fields allows partial responses to be retrieved. See
-// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ProjectsCategoriesCreateCall) Fields(s ...googleapi.Field) *ProjectsCategoriesCreateCall {
-	c.urlParams_.Set("fields", googleapi.CombineFields(s))
-	return c
-}
-
-// Context sets the context to be used in this call's Do method. Any
-// pending HTTP request will be aborted if the provided context is
-// canceled.
-func (c *ProjectsCategoriesCreateCall) Context(ctx context.Context) *ProjectsCategoriesCreateCall {
-	c.ctx_ = ctx
-	return c
-}
-
-// Header returns an http.Header that can be modified by the caller to
-// add HTTP headers to the request.
-func (c *ProjectsCategoriesCreateCall) Header() http.Header {
-	if c.header_ == nil {
-		c.header_ = make(http.Header)
-	}
-	return c.header_
-}
-
-func (c *ProjectsCategoriesCreateCall) doRequest(alt string) (*http.Response, error) {
-	reqHeaders := make(http.Header)
-	for k, v := range c.header_ {
-		reqHeaders[k] = v
-	}
-	reqHeaders.Set("User-Agent", c.s.userAgent())
-	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.category)
-	if err != nil {
-		return nil, err
-	}
-	reqHeaders.Set("Content-Type", "application/json")
-	c.urlParams_.Set("alt", alt)
-	urls := googleapi.ResolveRelative(c.s.BasePath, "v3/{+parent}/categories")
-	urls += "?" + c.urlParams_.Encode()
-	req, _ := http.NewRequest("POST", urls, body)
-	req.Header = reqHeaders
-	googleapi.Expand(req.URL, map[string]string{
-		"parent": c.parent,
-	})
-	return gensupport.SendRequest(c.ctx_, c.s.client, req)
-}
-
-// Do executes the "monitoring.projects.categories.create" call.
-// Exactly one of *Category or error will be non-nil. Any non-2xx status
-// code is an error. Response headers are in either
-// *Category.ServerResponse.Header or (if a response was returned at
-// all) in error.(*googleapi.Error).Header. Use googleapi.IsNotModified
-// to check whether the returned error was because
-// http.StatusNotModified was returned.
-func (c *ProjectsCategoriesCreateCall) Do(opts ...googleapi.CallOption) (*Category, error) {
-	gensupport.SetOptions(c.urlParams_, opts...)
-	res, err := c.doRequest("json")
-	if res != nil && res.StatusCode == http.StatusNotModified {
-		if res.Body != nil {
-			res.Body.Close()
-		}
-		return nil, &googleapi.Error{
-			Code:   res.StatusCode,
-			Header: res.Header,
-		}
-	}
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	ret := &Category{
-		ServerResponse: googleapi.ServerResponse{
-			Header:         res.Header,
-			HTTPStatusCode: res.StatusCode,
-		},
-	}
-	target := &ret
-	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Create a new Category.",
-	//   "flatPath": "v3/projects/{projectsId}/categories",
-	//   "httpMethod": "POST",
-	//   "id": "monitoring.projects.categories.create",
-	//   "parameterOrder": [
-	//     "parent"
-	//   ],
-	//   "parameters": {
-	//     "parent": {
-	//       "description": "Resource parent of the project to get. Resource parent form is projects/{project_id_or_number}.",
-	//       "location": "path",
-	//       "pattern": "^projects/[^/]+$",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "v3/{+parent}/categories",
-	//   "request": {
-	//     "$ref": "Category"
-	//   },
-	//   "response": {
-	//     "$ref": "Category"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/cloud-platform",
-	//     "https://www.googleapis.com/auth/monitoring"
-	//   ]
-	// }
-
-}
-
-// method id "monitoring.projects.categories.delete":
-
-type ProjectsCategoriesDeleteCall struct {
-	s          *Service
-	name       string
-	urlParams_ gensupport.URLParams
-	ctx_       context.Context
-	header_    http.Header
-}
-
-// Delete: Delete a Category.
-func (r *ProjectsCategoriesService) Delete(name string) *ProjectsCategoriesDeleteCall {
-	c := &ProjectsCategoriesDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
-	c.name = name
-	return c
-}
-
-// Fields allows partial responses to be retrieved. See
-// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ProjectsCategoriesDeleteCall) Fields(s ...googleapi.Field) *ProjectsCategoriesDeleteCall {
-	c.urlParams_.Set("fields", googleapi.CombineFields(s))
-	return c
-}
-
-// Context sets the context to be used in this call's Do method. Any
-// pending HTTP request will be aborted if the provided context is
-// canceled.
-func (c *ProjectsCategoriesDeleteCall) Context(ctx context.Context) *ProjectsCategoriesDeleteCall {
-	c.ctx_ = ctx
-	return c
-}
-
-// Header returns an http.Header that can be modified by the caller to
-// add HTTP headers to the request.
-func (c *ProjectsCategoriesDeleteCall) Header() http.Header {
-	if c.header_ == nil {
-		c.header_ = make(http.Header)
-	}
-	return c.header_
-}
-
-func (c *ProjectsCategoriesDeleteCall) doRequest(alt string) (*http.Response, error) {
-	reqHeaders := make(http.Header)
-	for k, v := range c.header_ {
-		reqHeaders[k] = v
-	}
-	reqHeaders.Set("User-Agent", c.s.userAgent())
-	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
-	var body io.Reader = nil
-	c.urlParams_.Set("alt", alt)
-	urls := googleapi.ResolveRelative(c.s.BasePath, "v3/{+name}")
-	urls += "?" + c.urlParams_.Encode()
-	req, _ := http.NewRequest("DELETE", urls, body)
-	req.Header = reqHeaders
-	googleapi.Expand(req.URL, map[string]string{
-		"name": c.name,
-	})
-	return gensupport.SendRequest(c.ctx_, c.s.client, req)
-}
-
-// Do executes the "monitoring.projects.categories.delete" call.
-// Exactly one of *Empty or error will be non-nil. Any non-2xx status
-// code is an error. Response headers are in either
-// *Empty.ServerResponse.Header or (if a response was returned at all)
-// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
-// check whether the returned error was because http.StatusNotModified
-// was returned.
-func (c *ProjectsCategoriesDeleteCall) Do(opts ...googleapi.CallOption) (*Empty, error) {
-	gensupport.SetOptions(c.urlParams_, opts...)
-	res, err := c.doRequest("json")
-	if res != nil && res.StatusCode == http.StatusNotModified {
-		if res.Body != nil {
-			res.Body.Close()
-		}
-		return nil, &googleapi.Error{
-			Code:   res.StatusCode,
-			Header: res.Header,
-		}
-	}
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	ret := &Empty{
-		ServerResponse: googleapi.ServerResponse{
-			Header:         res.Header,
-			HTTPStatusCode: res.StatusCode,
-		},
-	}
-	target := &ret
-	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Delete a Category.",
-	//   "flatPath": "v3/projects/{projectsId}/categories/{categoriesId}",
-	//   "httpMethod": "DELETE",
-	//   "id": "monitoring.projects.categories.delete",
-	//   "parameterOrder": [
-	//     "name"
-	//   ],
-	//   "parameters": {
-	//     "name": {
-	//       "description": "Resource name of category to delete. Resource name form is projects/{project_id_or_number}/categories/{short_name}.",
-	//       "location": "path",
-	//       "pattern": "^projects/[^/]+/categories/[^/]+$",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "v3/{+name}",
-	//   "response": {
-	//     "$ref": "Empty"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/cloud-platform",
-	//     "https://www.googleapis.com/auth/monitoring"
-	//   ]
-	// }
-
-}
-
-// method id "monitoring.projects.categories.list":
-
-type ProjectsCategoriesListCall struct {
-	s            *Service
-	parent       string
-	urlParams_   gensupport.URLParams
-	ifNoneMatch_ string
-	ctx_         context.Context
-	header_      http.Header
-}
-
-// List: List all Categories for a host project.
-func (r *ProjectsCategoriesService) List(parent string) *ProjectsCategoriesListCall {
-	c := &ProjectsCategoriesListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
-	c.parent = parent
-	return c
-}
-
-// Filter sets the optional parameter "filter": A filter that specifies
-// what Categories to return.
-func (c *ProjectsCategoriesListCall) Filter(filter string) *ProjectsCategoriesListCall {
-	c.urlParams_.Set("filter", filter)
-	return c
-}
-
-// PageSize sets the optional parameter "pageSize": A positive number
-// that is the maximum number of results to return. When 0, use default
-// page size.
-func (c *ProjectsCategoriesListCall) PageSize(pageSize int64) *ProjectsCategoriesListCall {
-	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
-	return c
-}
-
-// PageToken sets the optional parameter "pageToken": If this field is
-// not empty then it must contain the nextPageToken value returned by a
-// previous call to this method. Using this field causes the method to
-// return additional results from the previous method call.
-func (c *ProjectsCategoriesListCall) PageToken(pageToken string) *ProjectsCategoriesListCall {
-	c.urlParams_.Set("pageToken", pageToken)
-	return c
-}
-
-// Fields allows partial responses to be retrieved. See
-// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ProjectsCategoriesListCall) Fields(s ...googleapi.Field) *ProjectsCategoriesListCall {
-	c.urlParams_.Set("fields", googleapi.CombineFields(s))
-	return c
-}
-
-// IfNoneMatch sets the optional parameter which makes the operation
-// fail if the object's ETag matches the given value. This is useful for
-// getting updates only after the object has changed since the last
-// request. Use googleapi.IsNotModified to check whether the response
-// error from Do is the result of In-None-Match.
-func (c *ProjectsCategoriesListCall) IfNoneMatch(entityTag string) *ProjectsCategoriesListCall {
-	c.ifNoneMatch_ = entityTag
-	return c
-}
-
-// Context sets the context to be used in this call's Do method. Any
-// pending HTTP request will be aborted if the provided context is
-// canceled.
-func (c *ProjectsCategoriesListCall) Context(ctx context.Context) *ProjectsCategoriesListCall {
-	c.ctx_ = ctx
-	return c
-}
-
-// Header returns an http.Header that can be modified by the caller to
-// add HTTP headers to the request.
-func (c *ProjectsCategoriesListCall) Header() http.Header {
-	if c.header_ == nil {
-		c.header_ = make(http.Header)
-	}
-	return c.header_
-}
-
-func (c *ProjectsCategoriesListCall) doRequest(alt string) (*http.Response, error) {
-	reqHeaders := make(http.Header)
-	for k, v := range c.header_ {
-		reqHeaders[k] = v
-	}
-	reqHeaders.Set("User-Agent", c.s.userAgent())
-	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
-	if c.ifNoneMatch_ != "" {
-		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
-	}
-	var body io.Reader = nil
-	c.urlParams_.Set("alt", alt)
-	urls := googleapi.ResolveRelative(c.s.BasePath, "v3/{+parent}/categories")
-	urls += "?" + c.urlParams_.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	req.Header = reqHeaders
-	googleapi.Expand(req.URL, map[string]string{
-		"parent": c.parent,
-	})
-	return gensupport.SendRequest(c.ctx_, c.s.client, req)
-}
-
-// Do executes the "monitoring.projects.categories.list" call.
-// Exactly one of *ListCategoriesResponse or error will be non-nil. Any
-// non-2xx status code is an error. Response headers are in either
-// *ListCategoriesResponse.ServerResponse.Header or (if a response was
-// returned at all) in error.(*googleapi.Error).Header. Use
-// googleapi.IsNotModified to check whether the returned error was
-// because http.StatusNotModified was returned.
-func (c *ProjectsCategoriesListCall) Do(opts ...googleapi.CallOption) (*ListCategoriesResponse, error) {
-	gensupport.SetOptions(c.urlParams_, opts...)
-	res, err := c.doRequest("json")
-	if res != nil && res.StatusCode == http.StatusNotModified {
-		if res.Body != nil {
-			res.Body.Close()
-		}
-		return nil, &googleapi.Error{
-			Code:   res.StatusCode,
-			Header: res.Header,
-		}
-	}
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	ret := &ListCategoriesResponse{
-		ServerResponse: googleapi.ServerResponse{
-			Header:         res.Header,
-			HTTPStatusCode: res.StatusCode,
-		},
-	}
-	target := &ret
-	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "List all Categories for a host project.",
-	//   "flatPath": "v3/projects/{projectsId}/categories",
-	//   "httpMethod": "GET",
-	//   "id": "monitoring.projects.categories.list",
-	//   "parameterOrder": [
-	//     "parent"
-	//   ],
-	//   "parameters": {
-	//     "filter": {
-	//       "description": "A filter that specifies what Categories to return.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "pageSize": {
-	//       "description": "A positive number that is the maximum number of results to return. When 0, use default page size.",
-	//       "format": "int32",
-	//       "location": "query",
-	//       "type": "integer"
-	//     },
-	//     "pageToken": {
-	//       "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "parent": {
-	//       "description": "Resource parent of the project to get. Resource parent form is projects/{project_id_or_number}.",
-	//       "location": "path",
-	//       "pattern": "^projects/[^/]+$",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "v3/{+parent}/categories",
-	//   "response": {
-	//     "$ref": "ListCategoriesResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/cloud-platform",
-	//     "https://www.googleapis.com/auth/monitoring",
-	//     "https://www.googleapis.com/auth/monitoring.read"
-	//   ]
-	// }
-
-}
-
-// Pages invokes f for each page of results.
-// A non-nil error returned from f will halt the iteration.
-// The provided context supersedes any context provided to the Context method.
-func (c *ProjectsCategoriesListCall) Pages(ctx context.Context, f func(*ListCategoriesResponse) error) error {
-	c.ctx_ = ctx
-	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
-	for {
-		x, err := c.Do()
-		if err != nil {
-			return err
-		}
-		if err := f(x); err != nil {
-			return err
-		}
-		if x.NextPageToken == "" {
-			return nil
-		}
-		c.PageToken(x.NextPageToken)
-	}
-}
-
-// method id "monitoring.projects.categories.metricAssociations.create":
-
-type ProjectsCategoriesMetricAssociationsCreateCall struct {
-	s                 *Service
-	parent            string
-	metricassociation *MetricAssociation
-	urlParams_        gensupport.URLParams
-	ctx_              context.Context
-	header_           http.Header
-}
-
-// Create: Create a MetricAssociation.
-func (r *ProjectsCategoriesMetricAssociationsService) Create(parent string, metricassociation *MetricAssociation) *ProjectsCategoriesMetricAssociationsCreateCall {
-	c := &ProjectsCategoriesMetricAssociationsCreateCall{s: r.s, urlParams_: make(gensupport.URLParams)}
-	c.parent = parent
-	c.metricassociation = metricassociation
-	return c
-}
-
-// Fields allows partial responses to be retrieved. See
-// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ProjectsCategoriesMetricAssociationsCreateCall) Fields(s ...googleapi.Field) *ProjectsCategoriesMetricAssociationsCreateCall {
-	c.urlParams_.Set("fields", googleapi.CombineFields(s))
-	return c
-}
-
-// Context sets the context to be used in this call's Do method. Any
-// pending HTTP request will be aborted if the provided context is
-// canceled.
-func (c *ProjectsCategoriesMetricAssociationsCreateCall) Context(ctx context.Context) *ProjectsCategoriesMetricAssociationsCreateCall {
-	c.ctx_ = ctx
-	return c
-}
-
-// Header returns an http.Header that can be modified by the caller to
-// add HTTP headers to the request.
-func (c *ProjectsCategoriesMetricAssociationsCreateCall) Header() http.Header {
-	if c.header_ == nil {
-		c.header_ = make(http.Header)
-	}
-	return c.header_
-}
-
-func (c *ProjectsCategoriesMetricAssociationsCreateCall) doRequest(alt string) (*http.Response, error) {
-	reqHeaders := make(http.Header)
-	for k, v := range c.header_ {
-		reqHeaders[k] = v
-	}
-	reqHeaders.Set("User-Agent", c.s.userAgent())
-	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
-	var body io.Reader = nil
-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.metricassociation)
-	if err != nil {
-		return nil, err
-	}
-	reqHeaders.Set("Content-Type", "application/json")
-	c.urlParams_.Set("alt", alt)
-	urls := googleapi.ResolveRelative(c.s.BasePath, "v3/{+parent}/metricAssociations")
-	urls += "?" + c.urlParams_.Encode()
-	req, _ := http.NewRequest("POST", urls, body)
-	req.Header = reqHeaders
-	googleapi.Expand(req.URL, map[string]string{
-		"parent": c.parent,
-	})
-	return gensupport.SendRequest(c.ctx_, c.s.client, req)
-}
-
-// Do executes the "monitoring.projects.categories.metricAssociations.create" call.
-// Exactly one of *MetricAssociation or error will be non-nil. Any
-// non-2xx status code is an error. Response headers are in either
-// *MetricAssociation.ServerResponse.Header or (if a response was
-// returned at all) in error.(*googleapi.Error).Header. Use
-// googleapi.IsNotModified to check whether the returned error was
-// because http.StatusNotModified was returned.
-func (c *ProjectsCategoriesMetricAssociationsCreateCall) Do(opts ...googleapi.CallOption) (*MetricAssociation, error) {
-	gensupport.SetOptions(c.urlParams_, opts...)
-	res, err := c.doRequest("json")
-	if res != nil && res.StatusCode == http.StatusNotModified {
-		if res.Body != nil {
-			res.Body.Close()
-		}
-		return nil, &googleapi.Error{
-			Code:   res.StatusCode,
-			Header: res.Header,
-		}
-	}
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	ret := &MetricAssociation{
-		ServerResponse: googleapi.ServerResponse{
-			Header:         res.Header,
-			HTTPStatusCode: res.StatusCode,
-		},
-	}
-	target := &ret
-	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Create a MetricAssociation.",
-	//   "flatPath": "v3/projects/{projectsId}/categories/{categoriesId}/metricAssociations",
-	//   "httpMethod": "POST",
-	//   "id": "monitoring.projects.categories.metricAssociations.create",
-	//   "parameterOrder": [
-	//     "parent"
-	//   ],
-	//   "parameters": {
-	//     "parent": {
-	//       "description": "Resource parent of the category to get. Resource parent form is projects/{project_id_or_number}/categories/{short_name}.",
-	//       "location": "path",
-	//       "pattern": "^projects/[^/]+/categories/[^/]+$",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "v3/{+parent}/metricAssociations",
-	//   "request": {
-	//     "$ref": "MetricAssociation"
-	//   },
-	//   "response": {
-	//     "$ref": "MetricAssociation"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/cloud-platform",
-	//     "https://www.googleapis.com/auth/monitoring"
-	//   ]
-	// }
-
-}
-
-// method id "monitoring.projects.categories.metricAssociations.delete":
-
-type ProjectsCategoriesMetricAssociationsDeleteCall struct {
-	s          *Service
-	name       string
-	urlParams_ gensupport.URLParams
-	ctx_       context.Context
-	header_    http.Header
-}
-
-// Delete: Delete a MetricAssociation.
-func (r *ProjectsCategoriesMetricAssociationsService) Delete(name string) *ProjectsCategoriesMetricAssociationsDeleteCall {
-	c := &ProjectsCategoriesMetricAssociationsDeleteCall{s: r.s, urlParams_: make(gensupport.URLParams)}
-	c.name = name
-	return c
-}
-
-// Fields allows partial responses to be retrieved. See
-// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ProjectsCategoriesMetricAssociationsDeleteCall) Fields(s ...googleapi.Field) *ProjectsCategoriesMetricAssociationsDeleteCall {
-	c.urlParams_.Set("fields", googleapi.CombineFields(s))
-	return c
-}
-
-// Context sets the context to be used in this call's Do method. Any
-// pending HTTP request will be aborted if the provided context is
-// canceled.
-func (c *ProjectsCategoriesMetricAssociationsDeleteCall) Context(ctx context.Context) *ProjectsCategoriesMetricAssociationsDeleteCall {
-	c.ctx_ = ctx
-	return c
-}
-
-// Header returns an http.Header that can be modified by the caller to
-// add HTTP headers to the request.
-func (c *ProjectsCategoriesMetricAssociationsDeleteCall) Header() http.Header {
-	if c.header_ == nil {
-		c.header_ = make(http.Header)
-	}
-	return c.header_
-}
-
-func (c *ProjectsCategoriesMetricAssociationsDeleteCall) doRequest(alt string) (*http.Response, error) {
-	reqHeaders := make(http.Header)
-	for k, v := range c.header_ {
-		reqHeaders[k] = v
-	}
-	reqHeaders.Set("User-Agent", c.s.userAgent())
-	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
-	var body io.Reader = nil
-	c.urlParams_.Set("alt", alt)
-	urls := googleapi.ResolveRelative(c.s.BasePath, "v3/{+name}")
-	urls += "?" + c.urlParams_.Encode()
-	req, _ := http.NewRequest("DELETE", urls, body)
-	req.Header = reqHeaders
-	googleapi.Expand(req.URL, map[string]string{
-		"name": c.name,
-	})
-	return gensupport.SendRequest(c.ctx_, c.s.client, req)
-}
-
-// Do executes the "monitoring.projects.categories.metricAssociations.delete" call.
-// Exactly one of *Empty or error will be non-nil. Any non-2xx status
-// code is an error. Response headers are in either
-// *Empty.ServerResponse.Header or (if a response was returned at all)
-// in error.(*googleapi.Error).Header. Use googleapi.IsNotModified to
-// check whether the returned error was because http.StatusNotModified
-// was returned.
-func (c *ProjectsCategoriesMetricAssociationsDeleteCall) Do(opts ...googleapi.CallOption) (*Empty, error) {
-	gensupport.SetOptions(c.urlParams_, opts...)
-	res, err := c.doRequest("json")
-	if res != nil && res.StatusCode == http.StatusNotModified {
-		if res.Body != nil {
-			res.Body.Close()
-		}
-		return nil, &googleapi.Error{
-			Code:   res.StatusCode,
-			Header: res.Header,
-		}
-	}
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	ret := &Empty{
-		ServerResponse: googleapi.ServerResponse{
-			Header:         res.Header,
-			HTTPStatusCode: res.StatusCode,
-		},
-	}
-	target := &ret
-	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "Delete a MetricAssociation.",
-	//   "flatPath": "v3/projects/{projectsId}/categories/{categoriesId}/metricAssociations/{metricAssociationsId}",
-	//   "httpMethod": "DELETE",
-	//   "id": "monitoring.projects.categories.metricAssociations.delete",
-	//   "parameterOrder": [
-	//     "name"
-	//   ],
-	//   "parameters": {
-	//     "name": {
-	//       "description": "Resource name of metric association to delete. Resource name form is projects/{project_id_or_number}/\n    categories/{short_name}/metricAssociations/{metric_name}.",
-	//       "location": "path",
-	//       "pattern": "^projects/[^/]+/categories/[^/]+/metricAssociations/[^/]+$",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "v3/{+name}",
-	//   "response": {
-	//     "$ref": "Empty"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/cloud-platform",
-	//     "https://www.googleapis.com/auth/monitoring"
-	//   ]
-	// }
-
-}
-
-// method id "monitoring.projects.categories.metricAssociations.list":
-
-type ProjectsCategoriesMetricAssociationsListCall struct {
-	s            *Service
-	parent       string
-	urlParams_   gensupport.URLParams
-	ifNoneMatch_ string
-	ctx_         context.Context
-	header_      http.Header
-}
-
-// List: List the MetricAssociations in a given Category.
-func (r *ProjectsCategoriesMetricAssociationsService) List(parent string) *ProjectsCategoriesMetricAssociationsListCall {
-	c := &ProjectsCategoriesMetricAssociationsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
-	c.parent = parent
-	return c
-}
-
-// Filter sets the optional parameter "filter": A filter that specifies
-// what MetricAssociations to return.
-func (c *ProjectsCategoriesMetricAssociationsListCall) Filter(filter string) *ProjectsCategoriesMetricAssociationsListCall {
-	c.urlParams_.Set("filter", filter)
-	return c
-}
-
-// PageSize sets the optional parameter "pageSize": A positive number
-// that is the maximum number of results to return. When 0, use default
-// page size.
-func (c *ProjectsCategoriesMetricAssociationsListCall) PageSize(pageSize int64) *ProjectsCategoriesMetricAssociationsListCall {
-	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
-	return c
-}
-
-// PageToken sets the optional parameter "pageToken": If this field is
-// not empty then it must contain the nextPageToken value returned by a
-// previous call to this method. Using this field causes the method to
-// return additional results from the previous method call.
-func (c *ProjectsCategoriesMetricAssociationsListCall) PageToken(pageToken string) *ProjectsCategoriesMetricAssociationsListCall {
-	c.urlParams_.Set("pageToken", pageToken)
-	return c
-}
-
-// Fields allows partial responses to be retrieved. See
-// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
-// for more information.
-func (c *ProjectsCategoriesMetricAssociationsListCall) Fields(s ...googleapi.Field) *ProjectsCategoriesMetricAssociationsListCall {
-	c.urlParams_.Set("fields", googleapi.CombineFields(s))
-	return c
-}
-
-// IfNoneMatch sets the optional parameter which makes the operation
-// fail if the object's ETag matches the given value. This is useful for
-// getting updates only after the object has changed since the last
-// request. Use googleapi.IsNotModified to check whether the response
-// error from Do is the result of In-None-Match.
-func (c *ProjectsCategoriesMetricAssociationsListCall) IfNoneMatch(entityTag string) *ProjectsCategoriesMetricAssociationsListCall {
-	c.ifNoneMatch_ = entityTag
-	return c
-}
-
-// Context sets the context to be used in this call's Do method. Any
-// pending HTTP request will be aborted if the provided context is
-// canceled.
-func (c *ProjectsCategoriesMetricAssociationsListCall) Context(ctx context.Context) *ProjectsCategoriesMetricAssociationsListCall {
-	c.ctx_ = ctx
-	return c
-}
-
-// Header returns an http.Header that can be modified by the caller to
-// add HTTP headers to the request.
-func (c *ProjectsCategoriesMetricAssociationsListCall) Header() http.Header {
-	if c.header_ == nil {
-		c.header_ = make(http.Header)
-	}
-	return c.header_
-}
-
-func (c *ProjectsCategoriesMetricAssociationsListCall) doRequest(alt string) (*http.Response, error) {
-	reqHeaders := make(http.Header)
-	for k, v := range c.header_ {
-		reqHeaders[k] = v
-	}
-	reqHeaders.Set("User-Agent", c.s.userAgent())
-	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
-	if c.ifNoneMatch_ != "" {
-		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
-	}
-	var body io.Reader = nil
-	c.urlParams_.Set("alt", alt)
-	urls := googleapi.ResolveRelative(c.s.BasePath, "v3/{+parent}/metricAssociations")
-	urls += "?" + c.urlParams_.Encode()
-	req, _ := http.NewRequest("GET", urls, body)
-	req.Header = reqHeaders
-	googleapi.Expand(req.URL, map[string]string{
-		"parent": c.parent,
-	})
-	return gensupport.SendRequest(c.ctx_, c.s.client, req)
-}
-
-// Do executes the "monitoring.projects.categories.metricAssociations.list" call.
-// Exactly one of *ListMetricAssociationsResponse or error will be
-// non-nil. Any non-2xx status code is an error. Response headers are in
-// either *ListMetricAssociationsResponse.ServerResponse.Header or (if a
-// response was returned at all) in error.(*googleapi.Error).Header. Use
-// googleapi.IsNotModified to check whether the returned error was
-// because http.StatusNotModified was returned.
-func (c *ProjectsCategoriesMetricAssociationsListCall) Do(opts ...googleapi.CallOption) (*ListMetricAssociationsResponse, error) {
-	gensupport.SetOptions(c.urlParams_, opts...)
-	res, err := c.doRequest("json")
-	if res != nil && res.StatusCode == http.StatusNotModified {
-		if res.Body != nil {
-			res.Body.Close()
-		}
-		return nil, &googleapi.Error{
-			Code:   res.StatusCode,
-			Header: res.Header,
-		}
-	}
-	if err != nil {
-		return nil, err
-	}
-	defer googleapi.CloseBody(res)
-	if err := googleapi.CheckResponse(res); err != nil {
-		return nil, err
-	}
-	ret := &ListMetricAssociationsResponse{
-		ServerResponse: googleapi.ServerResponse{
-			Header:         res.Header,
-			HTTPStatusCode: res.StatusCode,
-		},
-	}
-	target := &ret
-	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
-		return nil, err
-	}
-	return ret, nil
-	// {
-	//   "description": "List the MetricAssociations in a given Category.",
-	//   "flatPath": "v3/projects/{projectsId}/categories/{categoriesId}/metricAssociations",
-	//   "httpMethod": "GET",
-	//   "id": "monitoring.projects.categories.metricAssociations.list",
-	//   "parameterOrder": [
-	//     "parent"
-	//   ],
-	//   "parameters": {
-	//     "filter": {
-	//       "description": "A filter that specifies what MetricAssociations to return.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "pageSize": {
-	//       "description": "A positive number that is the maximum number of results to return. When 0, use default page size.",
-	//       "format": "int32",
-	//       "location": "query",
-	//       "type": "integer"
-	//     },
-	//     "pageToken": {
-	//       "description": "If this field is not empty then it must contain the nextPageToken value returned by a previous call to this method. Using this field causes the method to return additional results from the previous method call.",
-	//       "location": "query",
-	//       "type": "string"
-	//     },
-	//     "parent": {
-	//       "description": "Resource parent of the category to get. Resource parent form is projects/{project_id_or_number}/categories/{short_name}.",
-	//       "location": "path",
-	//       "pattern": "^projects/[^/]+/categories/[^/]+$",
-	//       "required": true,
-	//       "type": "string"
-	//     }
-	//   },
-	//   "path": "v3/{+parent}/metricAssociations",
-	//   "response": {
-	//     "$ref": "ListMetricAssociationsResponse"
-	//   },
-	//   "scopes": [
-	//     "https://www.googleapis.com/auth/cloud-platform",
-	//     "https://www.googleapis.com/auth/monitoring",
-	//     "https://www.googleapis.com/auth/monitoring.read"
-	//   ]
-	// }
-
-}
-
-// Pages invokes f for each page of results.
-// A non-nil error returned from f will halt the iteration.
-// The provided context supersedes any context provided to the Context method.
-func (c *ProjectsCategoriesMetricAssociationsListCall) Pages(ctx context.Context, f func(*ListMetricAssociationsResponse) error) error {
-	c.ctx_ = ctx
-	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
-	for {
-		x, err := c.Do()
-		if err != nil {
-			return err
-		}
-		if err := f(x); err != nil {
-			return err
-		}
-		if x.NextPageToken == "" {
-			return nil
-		}
-		c.PageToken(x.NextPageToken)
-	}
-}
-
 // method id "monitoring.projects.collectdTimeSeries.create":
 
 type ProjectsCollectdTimeSeriesCreateCall struct {
diff --git a/oauth2/v1/oauth2-gen.go b/oauth2/v1/oauth2-gen.go
index 9b4a6b4..4307771 100644
--- a/oauth2/v1/oauth2-gen.go
+++ b/oauth2/v1/oauth2-gen.go
@@ -70,9 +70,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Userinfo *UserinfoService
 }
@@ -84,6 +85,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewUserinfoService(s *Service) *UserinfoService {
 	rs := &UserinfoService{s: s}
 	rs.V2 = NewUserinfoV2Service(s)
@@ -439,6 +444,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -536,6 +542,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -655,6 +662,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -788,6 +796,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -921,6 +930,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1034,6 +1044,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "oauth2/v1/tokeninfo")
@@ -1161,6 +1172,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1285,6 +1297,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/oauth2/v2/oauth2-gen.go b/oauth2/v2/oauth2-gen.go
index 7440468..c12d1e8 100644
--- a/oauth2/v2/oauth2-gen.go
+++ b/oauth2/v2/oauth2-gen.go
@@ -70,9 +70,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Userinfo *UserinfoService
 }
@@ -84,6 +85,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewUserinfoService(s *Service) *UserinfoService {
 	rs := &UserinfoService{s: s}
 	rs.V2 = NewUserinfoV2Service(s)
@@ -367,6 +372,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -491,6 +497,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "oauth2/v2/tokeninfo")
@@ -619,6 +626,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -742,6 +750,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/pagespeedonline/v1/pagespeedonline-gen.go b/pagespeedonline/v1/pagespeedonline-gen.go
index 7fcf5f7..518fdb9 100644
--- a/pagespeedonline/v1/pagespeedonline-gen.go
+++ b/pagespeedonline/v1/pagespeedonline-gen.go
@@ -55,9 +55,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Pagespeedapi *PagespeedapiService
 }
@@ -69,6 +70,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewPagespeedapiService(s *Service) *PagespeedapiService {
 	rs := &PagespeedapiService{s: s}
 	return rs
@@ -744,6 +749,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/pagespeedonline/v2/pagespeedonline-gen.go b/pagespeedonline/v2/pagespeedonline-gen.go
index 94b1dfe..ab8a761 100644
--- a/pagespeedonline/v2/pagespeedonline-gen.go
+++ b/pagespeedonline/v2/pagespeedonline-gen.go
@@ -55,9 +55,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Pagespeedapi *PagespeedapiService
 }
@@ -69,6 +70,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewPagespeedapiService(s *Service) *PagespeedapiService {
 	rs := &PagespeedapiService{s: s}
 	return rs
@@ -783,6 +788,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/partners/v2/partners-gen.go b/partners/v2/partners-gen.go
index e71dfda..6ade605 100644
--- a/partners/v2/partners-gen.go
+++ b/partners/v2/partners-gen.go
@@ -58,9 +58,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	ClientMessages *ClientMessagesService
 
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewClientMessagesService(s *Service) *ClientMessagesService {
 	rs := &ClientMessagesService{s: s}
 	return rs
@@ -1507,6 +1512,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logmessagerequest)
 	if err != nil {
@@ -1726,6 +1732,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2147,6 +2154,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2442,6 +2450,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.createleadrequest)
 	if err != nil {
@@ -2570,6 +2579,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.logusereventrequest)
 	if err != nil {
@@ -2749,6 +2759,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/people/v1/people-api.json b/people/v1/people-api.json
index 07fbc1b..1a9191c 100644
--- a/people/v1/people-api.json
+++ b/people/v1/people-api.json
@@ -1,1256 +1,1332 @@
 {
- "kind": "discovery#restDescription",
- "etag": "\"bRFOOrZKfO9LweMbPqu0kcu6De8/tzwJjoO4XDFgwNQjmiM8lPsFMzA\"",
- "discoveryVersion": "v1",
- "id": "people:v1",
- "name": "people",
- "version": "v1",
- "revision": "20160210",
- "title": "Google People API",
- "description": "The Google People API service gives access to information about profiles and contacts.",
- "ownerDomain": "google.com",
- "ownerName": "Google",
- "icons": {
-  "x16": "http://www.google.com/images/icons/product/search-16.gif",
-  "x32": "http://www.google.com/images/icons/product/search-32.gif"
- },
- "documentationLink": "https://developers.google.com/people/",
- "protocol": "rest",
- "baseUrl": "https://people.googleapis.com/",
- "basePath": "",
- "rootUrl": "https://people.googleapis.com/",
- "servicePath": "",
- "batchPath": "batch",
- "version_module": true,
- "parameters": {
-  "access_token": {
-   "type": "string",
-   "description": "OAuth access token.",
-   "location": "query"
-  },
-  "alt": {
-   "type": "string",
-   "description": "Data format for response.",
-   "default": "json",
-   "enumDescriptions": [
-    "Responses with Content-Type of application/json",
-    "Media download with context-dependent Content-Type",
-    "Responses with Content-Type of application/x-protobuf"
-   ],
-   "location": "query"
-  },
-  "bearer_token": {
-   "type": "string",
-   "description": "OAuth bearer token.",
-   "location": "query"
-  },
-  "callback": {
-   "type": "string",
-   "description": "JSONP",
-   "location": "query"
-  },
-  "fields": {
-   "type": "string",
-   "description": "Selector specifying which fields to include in a partial response.",
-   "location": "query"
-  },
-  "key": {
-   "type": "string",
-   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-   "location": "query"
-  },
-  "oauth_token": {
-   "type": "string",
-   "description": "OAuth 2.0 token for the current user.",
-   "location": "query"
-  },
-  "pp": {
-   "type": "boolean",
-   "description": "Pretty-print response.",
-   "default": "true",
-   "location": "query"
-  },
-  "prettyPrint": {
-   "type": "boolean",
-   "description": "Returns response with indentations and line breaks.",
-   "default": "true",
-   "location": "query"
-  },
-  "quotaUser": {
-   "type": "string",
-   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-   "location": "query"
-  },
-  "upload_protocol": {
-   "type": "string",
-   "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-   "location": "query"
-  },
-  "uploadType": {
-   "type": "string",
-   "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-   "location": "query"
-  },
-  "$.xgafv": {
-   "type": "string",
-   "description": "V1 error format.",
-   "enumDescriptions": [
-    "v1 error format",
-    "v2 error format"
-   ],
-   "location": "query"
-  }
- },
- "auth": {
-  "oauth2": {
-   "scopes": {
-    "https://www.googleapis.com/auth/contacts": {
-     "description": "Manage your contacts"
-    },
-    "https://www.googleapis.com/auth/contacts.readonly": {
-     "description": "View your contacts"
-    },
-    "https://www.googleapis.com/auth/plus.login": {
-     "description": "Know your basic profile info and list of people in your circles."
-    },
-    "https://www.googleapis.com/auth/user.addresses.read": {
-     "description": "View your street addresses"
-    },
-    "https://www.googleapis.com/auth/user.birthday.read": {
-     "description": "View your complete date of birth"
-    },
-    "https://www.googleapis.com/auth/user.emails.read": {
-     "description": "View your email addresses"
-    },
-    "https://www.googleapis.com/auth/user.phonenumbers.read": {
-     "description": "View your phone numbers"
-    },
-    "https://www.googleapis.com/auth/userinfo.email": {
-     "description": "View your email address"
-    },
-    "https://www.googleapis.com/auth/userinfo.profile": {
-     "description": "View your basic profile info"
-    }
-   }
-  }
- },
- "schemas": {
-  "Person": {
-   "id": "Person",
-   "type": "object",
-   "description": "Information about a person merged from various data sources such as the authenticated user's contacts and profile data. Fields other than IDs, metadata, and group memberships are user-edited. Most fields can have multiple items. The items in a field have no guaranteed order, but each non-empty field is guaranteed to have exactly one field with `metadata.primary` set to true.",
-   "properties": {
-    "resourceName": {
-     "type": "string",
-     "description": "The resource name for the person, assigned by the server. An ASCII string with a max length of 27 characters. Always starts with `people/`."
-    },
-    "etag": {
-     "type": "string",
-     "description": "The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the resource. Used for web cache validation."
-    },
-    "metadata": {
-     "$ref": "PersonMetadata",
-     "description": "Metadata about the person."
-    },
-    "locales": {
-     "type": "array",
-     "description": "The person's locale preferences.",
-     "items": {
-      "$ref": "Locale"
-     }
-    },
-    "names": {
-     "type": "array",
-     "description": "The person's names.",
-     "items": {
-      "$ref": "Name"
-     }
-    },
-    "nicknames": {
-     "type": "array",
-     "description": "The person's nicknames.",
-     "items": {
-      "$ref": "Nickname"
-     }
-    },
-    "coverPhotos": {
-     "type": "array",
-     "description": "The person's cover photos.",
-     "items": {
-      "$ref": "CoverPhoto"
-     }
-    },
-    "photos": {
-     "type": "array",
-     "description": "The person's photos.",
-     "items": {
-      "$ref": "Photo"
-     }
-    },
-    "genders": {
-     "type": "array",
-     "description": "The person's genders.",
-     "items": {
-      "$ref": "Gender"
-     }
-    },
-    "ageRange": {
-     "type": "string",
-     "description": "The person's age range.",
-     "enum": [
-      "AGE_RANGE_UNSPECIFIED",
-      "LESS_THAN_EIGHTEEN",
-      "EIGHTEEN_TO_TWENTY",
-      "TWENTY_ONE_OR_OLDER"
-     ]
-    },
-    "birthdays": {
-     "type": "array",
-     "description": "The person's birthdays.",
-     "items": {
-      "$ref": "Birthday"
-     }
-    },
-    "events": {
-     "type": "array",
-     "description": "The person's events.",
-     "items": {
-      "$ref": "Event"
-     }
-    },
-    "addresses": {
-     "type": "array",
-     "description": "The person's street addresses.",
-     "items": {
-      "$ref": "Address"
-     }
-    },
-    "residences": {
-     "type": "array",
-     "description": "The person's residences.",
-     "items": {
-      "$ref": "Residence"
-     }
-    },
-    "emailAddresses": {
-     "type": "array",
-     "description": "The person's email addresses.",
-     "items": {
-      "$ref": "EmailAddress"
-     }
-    },
-    "phoneNumbers": {
-     "type": "array",
-     "description": "The person's phone numbers.",
-     "items": {
-      "$ref": "PhoneNumber"
-     }
-    },
-    "imClients": {
-     "type": "array",
-     "description": "The person's instant messaging clients.",
-     "items": {
-      "$ref": "ImClient"
-     }
-    },
-    "taglines": {
-     "type": "array",
-     "description": "The person's taglines.",
-     "items": {
-      "$ref": "Tagline"
-     }
-    },
-    "biographies": {
-     "type": "array",
-     "description": "The person's biographies.",
-     "items": {
-      "$ref": "Biography"
-     }
-    },
-    "urls": {
-     "type": "array",
-     "description": "The person's associated URLs.",
-     "items": {
-      "$ref": "Url"
-     }
-    },
-    "organizations": {
-     "type": "array",
-     "description": "The person's past or current organizations.",
-     "items": {
-      "$ref": "Organization"
-     }
-    },
-    "occupations": {
-     "type": "array",
-     "description": "The person's occupations.",
-     "items": {
-      "$ref": "Occupation"
-     }
-    },
-    "interests": {
-     "type": "array",
-     "description": "The person's interests.",
-     "items": {
-      "$ref": "Interest"
-     }
-    },
-    "skills": {
-     "type": "array",
-     "description": "The person's skills.",
-     "items": {
-      "$ref": "Skill"
-     }
-    },
-    "braggingRights": {
-     "type": "array",
-     "description": "The person's bragging rights.",
-     "items": {
-      "$ref": "BraggingRights"
-     }
-    },
-    "relations": {
-     "type": "array",
-     "description": "The person's relations.",
-     "items": {
-      "$ref": "Relation"
-     }
-    },
-    "relationshipInterests": {
-     "type": "array",
-     "description": "The kind of relationship the person is looking for.",
-     "items": {
-      "$ref": "RelationshipInterest"
-     }
-    },
-    "relationshipStatuses": {
-     "type": "array",
-     "description": "The person's relationship statuses.",
-     "items": {
-      "$ref": "RelationshipStatus"
-     }
-    },
-    "memberships": {
-     "type": "array",
-     "description": "The person's group memberships.",
-     "items": {
-      "$ref": "Membership"
-     }
-    }
-   }
-  },
-  "PersonMetadata": {
-   "id": "PersonMetadata",
-   "type": "object",
-   "description": "Metadata about a person.",
-   "properties": {
-    "sources": {
-     "type": "array",
-     "description": "The sources of data for the person.",
-     "items": {
-      "$ref": "Source"
-     }
-    },
-    "previousResourceNames": {
-     "type": "array",
-     "description": "Any former resource names this person has had. Populated only for [`connections.list`](/people/api/rest/v1/people.connections/list) requests that include a sync token. The resource name may change when adding or removing fields that link a contact and profile such as a verified email, verified phone number, or profile URL.",
-     "items": {
-      "type": "string"
-     }
-    },
-    "deleted": {
-     "type": "boolean",
-     "description": "True if the person resource has been deleted. Populated only for [`connections.list`](/people/api/rest/v1/people.connections/list) requests that include a sync token."
-    },
-    "objectType": {
-     "type": "string",
-     "description": "The type of the person object.",
-     "enum": [
-      "OBJECT_TYPE_UNSPECIFIED",
-      "PERSON",
-      "PAGE"
-     ]
-    }
-   }
-  },
-  "Source": {
-   "id": "Source",
-   "type": "object",
-   "description": "The source of a field.",
-   "properties": {
-    "type": {
-     "type": "string",
-     "description": "The source type.",
-     "enum": [
-      "OTHER",
-      "ACCOUNT",
-      "PROFILE",
-      "DOMAIN_PROFILE",
-      "CONTACT"
-     ]
-    },
-    "id": {
-     "type": "string",
-     "description": "A unique identifier within the source type generated by the server."
-    }
-   }
-  },
-  "Locale": {
-   "id": "Locale",
-   "type": "object",
-   "description": "A person's locale preference.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the locale."
-    },
-    "value": {
-     "type": "string",
-     "description": "The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47) language tag representing the locale."
-    }
-   }
-  },
-  "FieldMetadata": {
-   "id": "FieldMetadata",
-   "type": "object",
-   "description": "Metadata about a field.",
-   "properties": {
-    "primary": {
-     "type": "boolean",
-     "description": "True if the field is the primary field; false if the field is a secondary field."
-    },
-    "verified": {
-     "type": "boolean",
-     "description": "True if the field is verified; false if the field is unverified. A verified field is typically a name, email address, phone number, or website that has been confirmed to be owned by the person."
-    },
-    "source": {
-     "$ref": "Source",
-     "description": "The source of the field."
-    }
-   }
-  },
-  "Name": {
-   "id": "Name",
-   "type": "object",
-   "description": "A person's name. If the name is a mononym, the family name is empty.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the name."
-    },
-    "displayName": {
-     "type": "string",
-     "description": "The display name formatted according to the locale specified by the viewer's account or the Accept-Language HTTP header."
-    },
-    "familyName": {
-     "type": "string",
-     "description": "The family name."
-    },
-    "givenName": {
-     "type": "string",
-     "description": "The given name."
-    },
-    "middleName": {
-     "type": "string",
-     "description": "The middle name(s)."
-    },
-    "honorificPrefix": {
-     "type": "string",
-     "description": "The honorific prefixes, such as `Mrs.` or `Dr.`"
-    },
-    "honorificSuffix": {
-     "type": "string",
-     "description": "The honorific suffixes, such as `Jr.`"
-    },
-    "phoneticFamilyName": {
-     "type": "string",
-     "description": "The family name spelled as it sounds."
-    },
-    "phoneticGivenName": {
-     "type": "string",
-     "description": "The given name spelled as it sounds."
-    },
-    "phoneticMiddleName": {
-     "type": "string",
-     "description": "The middle name(s) spelled as they sound."
-    },
-    "phoneticHonorificPrefix": {
-     "type": "string",
-     "description": "The honorific prefixes spelled as they sound."
-    },
-    "phoneticHonorificSuffix": {
-     "type": "string",
-     "description": "The honorific suffixes spelled as they sound."
-    }
-   }
-  },
-  "Nickname": {
-   "id": "Nickname",
-   "type": "object",
-   "description": "A person's nickname.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the nickname."
-    },
-    "value": {
-     "type": "string",
-     "description": "The nickname."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of the nickname.",
-     "enum": [
-      "DEFAULT",
-      "MAIDEN_NAME",
-      "INITIALS",
-      "GPLUS",
-      "OTHER_NAME"
-     ]
-    }
-   }
-  },
-  "CoverPhoto": {
-   "id": "CoverPhoto",
-   "type": "object",
-   "description": "A person's cover photo. A large image shown on the person's profile page that represents who they are or what they care about.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the cover photo."
-    },
-    "url": {
-     "type": "string",
-     "description": "The URL of the cover photo."
-    },
-    "default": {
-     "type": "boolean",
-     "description": "True if the cover photo is the default cover photo; false if the cover photo is a user-provided cover photo."
-    }
-   }
-  },
-  "Photo": {
-   "id": "Photo",
-   "type": "object",
-   "description": "A person's photo. A picture shown next to the person's name to help others recognize the person.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the photo."
-    },
-    "url": {
-     "type": "string",
-     "description": "The URL of the photo."
-    }
-   }
-  },
-  "Gender": {
-   "id": "Gender",
-   "type": "object",
-   "description": "A person's gender.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the gender."
-    },
-    "value": {
-     "type": "string",
-     "description": "The gender for the person. The gender can be custom or predefined. Possible values include, but are not limited to, the following: * `male` * `female` * `other` * `unknown`"
-    },
-    "formattedValue": {
-     "type": "string",
-     "description": "The read-only value of the gender translated and formatted in the viewer's account locale or the `Accept-Language` HTTP header locale."
-    }
-   }
-  },
-  "Birthday": {
-   "id": "Birthday",
-   "type": "object",
-   "description": "A person's birthday. At least one of the `date` and `text` fields are specified. The `date` and `text` fields typically represent the same date, but are not guaranteed to.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the birthday."
-    },
-    "date": {
-     "$ref": "Date",
-     "description": "The date of the birthday."
-    },
-    "text": {
-     "type": "string",
-     "description": "A free-form string representing the user's birthday."
-    }
-   }
-  },
-  "Date": {
-   "id": "Date",
-   "type": "object",
-   "description": "Represents a whole calendar date, for example a date of birth. The time of day and time zone are either specified elsewhere or are not significant. The date is relative to the [Proleptic Gregorian Calendar](https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar). The day may be 0 to represent a year and month where the day is not significant. The year may be 0 to represent a month and day independent of year; for example, anniversary date.",
-   "properties": {
-    "year": {
-     "type": "integer",
-     "description": "Year of date. Must be from 1 to 9999, or 0 if specifying a date without a year.",
-     "format": "int32"
-    },
-    "month": {
-     "type": "integer",
-     "description": "Month of year. Must be from 1 to 12.",
-     "format": "int32"
-    },
-    "day": {
-     "type": "integer",
-     "description": "Day of month. Must be from 1 to 31 and valid for the year and month, or 0 if specifying a year/month where the day is not significant.",
-     "format": "int32"
-    }
-   }
-  },
-  "Event": {
-   "id": "Event",
-   "type": "object",
-   "description": "An event related to the person.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the event."
-    },
-    "date": {
-     "$ref": "Date",
-     "description": "The date of the event."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of the event. The type can be custom or predefined. Possible values include, but are not limited to, the following: * `anniversary` * `other`"
-    },
-    "formattedType": {
-     "type": "string",
-     "description": "The read-only type of the event translated and formatted in the viewer's account locale or the `Accept-Language` HTTP header locale."
-    }
-   }
-  },
-  "Address": {
-   "id": "Address",
-   "type": "object",
-   "description": "A person's physical address. May be a P.O. box or street address. All fields are optional.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the address."
-    },
-    "formattedValue": {
-     "type": "string",
-     "description": "The read-only value of the address formatted in the viewer's account locale or the `Accept-Language` HTTP header locale."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of the address. The type can be custom or predefined. Possible values include, but are not limited to, the following: * `home` * `work` * `other`"
-    },
-    "formattedType": {
-     "type": "string",
-     "description": "The read-only type of the address translated and formatted in the viewer's account locale or the `Accept-Language` HTTP header locale."
-    },
-    "poBox": {
-     "type": "string",
-     "description": "The P.O. box of the address."
-    },
-    "streetAddress": {
-     "type": "string",
-     "description": "The street address."
-    },
-    "extendedAddress": {
-     "type": "string",
-     "description": "The extended address of the address; for example, the apartment number."
-    },
-    "city": {
-     "type": "string",
-     "description": "The city of the address."
-    },
-    "region": {
-     "type": "string",
-     "description": "The region of the address; for example, the state or province."
-    },
-    "postalCode": {
-     "type": "string",
-     "description": "The postal code of the address."
-    },
-    "country": {
-     "type": "string",
-     "description": "The country of the address."
-    },
-    "countryCode": {
-     "type": "string",
-     "description": "The [ISO 3166-1 alpha-2](http://www.iso.org/iso/country_codes.htm) country code of the address."
-    }
-   }
-  },
-  "Residence": {
-   "id": "Residence",
-   "type": "object",
-   "description": "A person's past or current residence.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the residence."
-    },
-    "value": {
-     "type": "string",
-     "description": "The address of the residence."
-    },
-    "current": {
-     "type": "boolean",
-     "description": "True if the residence is the person's current residence; false if the residence is a past residence."
-    }
-   }
-  },
-  "EmailAddress": {
-   "id": "EmailAddress",
-   "type": "object",
-   "description": "A person's email address.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the email address."
-    },
-    "value": {
-     "type": "string",
-     "description": "The email address."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of the email address. The type can be custom or predefined. Possible values include, but are not limited to, the following: * `home` * `work` * `other`"
-    },
-    "formattedType": {
-     "type": "string",
-     "description": "The read-only type of the email address translated and formatted in the viewer's account locale or the `Accept-Language` HTTP header locale."
-    }
-   }
-  },
-  "PhoneNumber": {
-   "id": "PhoneNumber",
-   "type": "object",
-   "description": "A person's phone number.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the phone number."
-    },
-    "value": {
-     "type": "string",
-     "description": "The phone number."
-    },
-    "canonicalForm": {
-     "type": "string",
-     "description": "The read-only canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf) form of the phone number."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of the phone number. The type can be custom or predefined. Possible values include, but are not limited to, the following: * `home` * `work` * `mobile` * `homeFax` * `workFax` * `otherFax` * `pager` * `workMobile` * `workPager` * `main` * `googleVoice` * `other`"
-    },
-    "formattedType": {
-     "type": "string",
-     "description": "The read-only type of the phone number translated and formatted in the viewer's account locale or the the `Accept-Language` HTTP header locale."
-    }
-   }
-  },
-  "ImClient": {
-   "id": "ImClient",
-   "type": "object",
-   "description": "A person's instant messaging client.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the IM client."
-    },
-    "username": {
-     "type": "string",
-     "description": "The user name used in the IM client."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of the IM client. The type can be custom or predefined. Possible values include, but are not limited to, the following: * `home` * `work` * `other`"
-    },
-    "formattedType": {
-     "type": "string",
-     "description": "The read-only type of the IM client translated and formatted in the viewer's account locale or the `Accept-Language` HTTP header locale."
-    },
-    "protocol": {
-     "type": "string",
-     "description": "The protocol of the IM client. The protocol can be custom or predefined. Possible values include, but are not limited to, the following: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk` * `icq` * `jabber` * `netMeeting`"
-    },
-    "formattedProtocol": {
-     "type": "string",
-     "description": "The read-only protocol of the IM client formatted in the viewer's account locale or the `Accept-Language` HTTP header locale."
-    }
-   }
-  },
-  "Tagline": {
-   "id": "Tagline",
-   "type": "object",
-   "description": "A brief one-line description of the person.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the tagline."
-    },
-    "value": {
-     "type": "string",
-     "description": "The tagline."
-    }
-   }
-  },
-  "Biography": {
-   "id": "Biography",
-   "type": "object",
-   "description": "A person's short biography.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the biography."
-    },
-    "value": {
-     "type": "string",
-     "description": "The short biography."
-    }
-   }
-  },
-  "Url": {
-   "id": "Url",
-   "type": "object",
-   "description": "A person's associated URLs.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the URL."
-    },
-    "value": {
-     "type": "string",
-     "description": "The URL."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of the URL. The type can be custom or predefined. Possible values include, but are not limited to, the following: * `home` * `work` * `blog` * `profile` * `homePage` * `ftp` * `reservations` * `appInstallPage`: website for a Google+ application. * `other`"
-    },
-    "formattedType": {
-     "type": "string",
-     "description": "The read-only type of the URL translated and formatted in the viewer's account locale or the `Accept-Language` HTTP header locale."
-    }
-   }
-  },
-  "Organization": {
-   "id": "Organization",
-   "type": "object",
-   "description": "A person's past or current organization. Overlapping date ranges are permitted.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the organization."
-    },
-    "type": {
-     "type": "string",
-     "description": "The type of the organization. The type can be custom or predefined. Possible values include, but are not limited to, the following: * `work` * `school`"
-    },
-    "formattedType": {
-     "type": "string",
-     "description": "The read-only type of the organization translated and formatted in the viewer's account locale or the `Accept-Language` HTTP header locale."
-    },
-    "startDate": {
-     "$ref": "Date",
-     "description": "The start date when the person joined the organization."
-    },
-    "endDate": {
-     "$ref": "Date",
-     "description": "The end date when the person left the organization."
-    },
-    "current": {
-     "type": "boolean",
-     "description": "True if the organization is the person's current organization; false if the organization is a past organization."
-    },
-    "name": {
-     "type": "string",
-     "description": "The name of the organization."
-    },
-    "phoneticName": {
-     "type": "string",
-     "description": "The phonetic name of the organization."
-    },
-    "department": {
-     "type": "string",
-     "description": "The person's department at the organization."
-    },
-    "title": {
-     "type": "string",
-     "description": "The person's job title at the organization."
-    },
-    "jobDescription": {
-     "type": "string",
-     "description": "The person's job description at the organization."
-    },
-    "symbol": {
-     "type": "string",
-     "description": "The symbol associated with the organization; for example, a stock ticker symbol, abbreviation, or acronym."
-    },
-    "domain": {
-     "type": "string",
-     "description": "The domain name associated with the organization; for example, `google.com`."
-    },
-    "location": {
-     "type": "string",
-     "description": "The location of the organization office the person works at."
-    }
-   }
-  },
-  "Occupation": {
-   "id": "Occupation",
-   "type": "object",
-   "description": "A person's occupation.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the occupation."
-    },
-    "value": {
-     "type": "string",
-     "description": "The occupation; for example, `carpenter`."
-    }
-   }
-  },
-  "Interest": {
-   "id": "Interest",
-   "type": "object",
-   "description": "One of the person's interests.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the interest."
-    },
-    "value": {
-     "type": "string",
-     "description": "The interest; for example, `stargazing`."
-    }
-   }
-  },
-  "Skill": {
-   "id": "Skill",
-   "type": "object",
-   "description": "A skill that the person has.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the skill."
-    },
-    "value": {
-     "type": "string",
-     "description": "The skill; for example, `underwater basket weaving`."
-    }
-   }
-  },
-  "BraggingRights": {
-   "id": "BraggingRights",
-   "type": "object",
-   "description": "A person's bragging rights.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the bragging rights."
-    },
-    "value": {
-     "type": "string",
-     "description": "The bragging rights; for example, `climbed mount everest`."
-    }
-   }
-  },
-  "Relation": {
-   "id": "Relation",
-   "type": "object",
-   "description": "A person's relation to another person.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the relation."
-    },
-    "person": {
-     "type": "string",
-     "description": "The name of the other person this relation refers to."
-    },
-    "type": {
-     "type": "string",
-     "description": "The person's relation to the other person. The type can be custom or predefined. Possible values include, but are not limited to, the following values: * `spouse` * `child` * `mother` * `father` * `parent` * `brother` * `sister` * `friend` * `relative` * `domesticPartner` * `manager` * `assistant` * `referredBy` * `partner`"
-    },
-    "formattedType": {
-     "type": "string",
-     "description": "The type of the relation translated and formatted in the viewer's account locale or the locale specified in the Accept-Language HTTP header."
-    }
-   }
-  },
-  "RelationshipInterest": {
-   "id": "RelationshipInterest",
-   "type": "object",
-   "description": "The kind of relationship the person is looking for.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the relationship interest."
-    },
-    "value": {
-     "type": "string",
-     "description": "The kind of relationship the person is looking for. The value can be custom or predefined. Possible values include, but are not limited to, the following values: * `friend` * `date` * `relationship` * `networking`"
-    },
-    "formattedValue": {
-     "type": "string",
-     "description": "The value of the relationship interest translated and formatted in the viewer's account locale or the locale specified in the Accept-Language HTTP header."
-    }
-   }
-  },
-  "RelationshipStatus": {
-   "id": "RelationshipStatus",
-   "type": "object",
-   "description": "A person's relationship status.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the relationship status."
-    },
-    "value": {
-     "type": "string",
-     "description": "The relationship status. The value can be custom or predefined. Possible values include, but are not limited to, the following: * `single` * `inARelationship` * `engaged` * `married` * `itsComplicated` * `openRelationship` * `widowed` * `inDomesticPartnership` * `inCivilUnion`"
-    },
-    "formattedValue": {
-     "type": "string",
-     "description": "The read-only value of the relationship status translated and formatted in the viewer's account locale or the `Accept-Language` HTTP header locale."
-    }
-   }
-  },
-  "Membership": {
-   "id": "Membership",
-   "type": "object",
-   "description": "A person's membership in a group.",
-   "properties": {
-    "metadata": {
-     "$ref": "FieldMetadata",
-     "description": "Metadata about the membership."
-    },
-    "contactGroupMembership": {
-     "$ref": "ContactGroupMembership",
-     "description": "The contact group membership."
-    },
-    "domainMembership": {
-     "$ref": "DomainMembership",
-     "description": "The domain membership."
-    }
-   }
-  },
-  "ContactGroupMembership": {
-   "id": "ContactGroupMembership",
-   "type": "object",
-   "description": "A Google contact group membership.",
-   "properties": {
-    "contactGroupId": {
-     "type": "string",
-     "description": "The contact group ID for the contact group membership. The contact group ID can be custom or predefined. Possible values include, but are not limited to, the following: * `myContacts` * `starred` * A numerical ID for user-created groups."
-    }
-   }
-  },
-  "DomainMembership": {
-   "id": "DomainMembership",
-   "type": "object",
-   "description": "A Google Apps Domain membership.",
-   "properties": {
-    "inViewerDomain": {
-     "type": "boolean",
-     "description": "True if the person is in the viewer's Google Apps domain."
-    }
-   }
-  },
-  "GetPeopleResponse": {
-   "id": "GetPeopleResponse",
-   "type": "object",
-   "properties": {
-    "responses": {
-     "type": "array",
-     "description": "The response for each requested resource name.",
-     "items": {
-      "$ref": "PersonResponse"
-     }
-    }
-   }
-  },
-  "PersonResponse": {
-   "id": "PersonResponse",
-   "type": "object",
-   "description": "The response for a single person",
-   "properties": {
-    "httpStatusCode": {
-     "type": "integer",
-     "description": "[HTTP 1.1 status code](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html).",
-     "format": "int32"
-    },
-    "person": {
-     "$ref": "Person",
-     "description": "The person."
-    },
-    "requestedResourceName": {
-     "type": "string",
-     "description": "The original requested resource name. May be different than the resource name on the returned person. The resource name can change when adding or removing fields that link a contact and profile such as a verified email, verified phone number, or a profile URL."
-    }
-   }
-  },
-  "ListConnectionsResponse": {
-   "id": "ListConnectionsResponse",
-   "type": "object",
-   "properties": {
-    "connections": {
-     "type": "array",
-     "description": "The list of people that the requestor is connected to.",
-     "items": {
-      "$ref": "Person"
-     }
-    },
-    "nextPageToken": {
-     "type": "string",
-     "description": "The token that can be used to retrieve the next page of results."
-    },
-    "nextSyncToken": {
-     "type": "string",
-     "description": "The token that can be used to retrieve changes since the last request."
-    }
-   }
-  }
- },
- "resources": {
-  "people": {
-   "methods": {
-    "get": {
-     "id": "people.people.get",
-     "path": "v1/{+resourceName}",
-     "httpMethod": "GET",
-     "description": "Provides information about a person resource for a resource name. Use `people/me` to indicate the authenticated user.",
-     "parameters": {
-      "resourceName": {
-       "type": "string",
-       "description": "The resource name of the person to provide information about. - To get information about the authenticated user, specify `people/me`. - To get information about any user, specify the resource name that identifies the user, such as the resource names returned by [`people.connections.list`](/people/api/rest/v1/people.connections/list).",
-       "required": true,
-       "pattern": "^people/[^/]*$",
-       "location": "path"
-      },
-      "requestMask.includeField": {
-       "type": "string",
-       "description": "Comma-separated list of fields to be included in the response. Omitting this field will include all fields. Each path should start with `person.`: for example, `person.names` or `person.photos`.",
-       "location": "query"
-      }
-     },
-     "parameterOrder": [
-      "resourceName"
-     ],
-     "response": {
-      "$ref": "Person"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/contacts",
-      "https://www.googleapis.com/auth/contacts.readonly",
-      "https://www.googleapis.com/auth/plus.login",
-      "https://www.googleapis.com/auth/user.addresses.read",
-      "https://www.googleapis.com/auth/user.birthday.read",
-      "https://www.googleapis.com/auth/user.emails.read",
-      "https://www.googleapis.com/auth/user.phonenumbers.read",
-      "https://www.googleapis.com/auth/userinfo.email",
-      "https://www.googleapis.com/auth/userinfo.profile"
-     ]
-    },
-    "getBatchGet": {
-     "id": "people.people.getBatchGet",
-     "path": "v1/people:batchGet",
-     "httpMethod": "GET",
-     "description": "Provides information about a list of specific people by specifying a list of requested resource names. Use `people/me` to indicate the authenticated user.",
-     "parameters": {
-      "resourceNames": {
-       "type": "string",
-       "description": "The resource name, such as one returned by [`people.connections.list`](/people/api/rest/v1/people.connections/list), of one of the people to provide information about. You can include this parameter up to 50 times in one request.",
-       "repeated": true,
-       "location": "query"
-      },
-      "requestMask.includeField": {
-       "type": "string",
-       "description": "Comma-separated list of fields to be included in the response. Omitting this field will include all fields. Each path should start with `person.`: for example, `person.names` or `person.photos`.",
-       "location": "query"
-      }
-     },
-     "response": {
-      "$ref": "GetPeopleResponse"
-     },
-     "scopes": [
-      "https://www.googleapis.com/auth/contacts",
-      "https://www.googleapis.com/auth/contacts.readonly",
-      "https://www.googleapis.com/auth/plus.login",
-      "https://www.googleapis.com/auth/user.addresses.read",
-      "https://www.googleapis.com/auth/user.birthday.read",
-      "https://www.googleapis.com/auth/user.emails.read",
-      "https://www.googleapis.com/auth/user.phonenumbers.read",
-      "https://www.googleapis.com/auth/userinfo.email",
-      "https://www.googleapis.com/auth/userinfo.profile"
-     ]
-    }
-   },
-   "resources": {
-    "connections": {
-     "methods": {
-      "list": {
-       "id": "people.people.connections.list",
-       "path": "v1/{+resourceName}/connections",
-       "httpMethod": "GET",
-       "description": "Provides a list of the authenticated user's contacts merged with any linked profiles.",
-       "parameters": {
-        "resourceName": {
-         "type": "string",
-         "description": "The resource name to return connections for. Only `people/me` is valid.",
-         "required": true,
-         "pattern": "^people/[^/]*$",
-         "location": "path"
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "people",
+  "batchPath": "batch",
+  "id": "people:v1",
+  "revision": "20170209",
+  "documentationLink": "https://developers.google.com/people/",
+  "title": "Google People API",
+  "discoveryVersion": "v1",
+  "ownerName": "Google",
+  "version_module": "True",
+  "resources": {
+    "people": {
+      "methods": {
+        "getBatchGet": {
+          "httpMethod": "GET",
+          "response": {
+            "$ref": "GetPeopleResponse"
+          },
+          "parameterOrder": [],
+          "scopes": [
+            "https://www.googleapis.com/auth/contacts",
+            "https://www.googleapis.com/auth/contacts.readonly",
+            "https://www.googleapis.com/auth/plus.login",
+            "https://www.googleapis.com/auth/user.addresses.read",
+            "https://www.googleapis.com/auth/user.birthday.read",
+            "https://www.googleapis.com/auth/user.emails.read",
+            "https://www.googleapis.com/auth/user.phonenumbers.read",
+            "https://www.googleapis.com/auth/userinfo.email",
+            "https://www.googleapis.com/auth/userinfo.profile"
+          ],
+          "parameters": {
+            "requestMask.includeField": {
+              "type": "string",
+              "location": "query",
+              "description": "Comma-separated list of fields to be included in the response. Omitting\nthis field will include all fields except for connections.list requests,\nwhich have a default mask that includes common fields like metadata, name,\nphoto, and profile url.\nEach path should start with `person.`: for example, `person.names` or\n`person.photos`.",
+              "format": "google-fieldmask"
+            },
+            "resourceNames": {
+              "type": "string",
+              "repeated": true,
+              "location": "query",
+              "description": "The resource name, such as one returned by\n[`people.connections.list`](/people/api/rest/v1/people.connections/list),\nof one of the people to provide information about. You can include this\nparameter up to 50 times in one request."
+            }
+          },
+          "flatPath": "v1/people:batchGet",
+          "id": "people.people.getBatchGet",
+          "path": "v1/people:batchGet",
+          "description": "Provides information about a list of specific people by specifying a list\nof requested resource names. Use `people/me` to indicate the authenticated\nuser."
         },
-        "pageToken": {
-         "type": "string",
-         "description": "The token of the page to be returned.",
-         "location": "query"
-        },
-        "pageSize": {
-         "type": "integer",
-         "description": "The number of connections to include in the response. Valid values are between 1 and 500, inclusive. Defaults to 100.",
-         "format": "int32",
-         "location": "query"
-        },
-        "sortOrder": {
-         "type": "string",
-         "description": "The order in which the connections should be sorted. Defaults to `LAST_MODIFIED_ASCENDING`.",
-         "enum": [
-          "LAST_MODIFIED_ASCENDING",
-          "FIRST_NAME_ASCENDING",
-          "LAST_NAME_ASCENDING"
-         ],
-         "location": "query"
-        },
-        "syncToken": {
-         "type": "string",
-         "description": "A sync token, returned by a previous call to `people.connections.list`. Only resources changed since the sync token was created are returned.",
-         "location": "query"
-        },
-        "requestMask.includeField": {
-         "type": "string",
-         "description": "Comma-separated list of fields to be included in the response. Omitting this field will include all fields. Each path should start with `person.`: for example, `person.names` or `person.photos`.",
-         "location": "query"
+        "get": {
+          "description": "Provides information about a person resource for a resource name. Use\n`people/me` to indicate the authenticated user.",
+          "httpMethod": "GET",
+          "response": {
+            "$ref": "Person"
+          },
+          "parameterOrder": [
+            "resourceName"
+          ],
+          "scopes": [
+            "https://www.googleapis.com/auth/contacts",
+            "https://www.googleapis.com/auth/contacts.readonly",
+            "https://www.googleapis.com/auth/plus.login",
+            "https://www.googleapis.com/auth/user.addresses.read",
+            "https://www.googleapis.com/auth/user.birthday.read",
+            "https://www.googleapis.com/auth/user.emails.read",
+            "https://www.googleapis.com/auth/user.phonenumbers.read",
+            "https://www.googleapis.com/auth/userinfo.email",
+            "https://www.googleapis.com/auth/userinfo.profile"
+          ],
+          "parameters": {
+            "resourceName": {
+              "pattern": "^people/[^/]+$",
+              "location": "path",
+              "description": "The resource name of the person to provide information about.\n\n- To get information about the authenticated user, specify `people/me`.\n- To get information about any user, specify the resource name that\n  identifies the user, such as the resource names returned by\n  [`people.connections.list`](/people/api/rest/v1/people.connections/list).",
+              "required": true,
+              "type": "string"
+            },
+            "requestMask.includeField": {
+              "description": "Comma-separated list of fields to be included in the response. Omitting\nthis field will include all fields except for connections.list requests,\nwhich have a default mask that includes common fields like metadata, name,\nphoto, and profile url.\nEach path should start with `person.`: for example, `person.names` or\n`person.photos`.",
+              "format": "google-fieldmask",
+              "type": "string",
+              "location": "query"
+            }
+          },
+          "flatPath": "v1/people/{peopleId}",
+          "id": "people.people.get",
+          "path": "v1/{+resourceName}"
         }
-       },
-       "parameterOrder": [
-        "resourceName"
-       ],
-       "response": {
-        "$ref": "ListConnectionsResponse"
-       },
-       "scopes": [
-        "https://www.googleapis.com/auth/contacts",
-        "https://www.googleapis.com/auth/contacts.readonly"
-       ]
+      },
+      "resources": {
+        "me": {
+          "resources": {
+            "connections": {
+              "methods": {
+                "list": {
+                  "description": "Provides a list of the authenticated user's contacts merged with any\nlinked profiles.",
+                  "response": {
+                    "$ref": "ListConnectionsResponse"
+                  },
+                  "parameterOrder": [],
+                  "httpMethod": "GET",
+                  "parameters": {
+                    "pageToken": {
+                      "description": "The token of the page to be returned.",
+                      "type": "string",
+                      "location": "query"
+                    },
+                    "pageSize": {
+                      "location": "query",
+                      "description": "The number of connections to include in the response. Valid values are\nbetween 1 and 500, inclusive. Defaults to 100.",
+                      "format": "int32",
+                      "type": "integer"
+                    },
+                    "requestMask.includeField": {
+                      "location": "query",
+                      "description": "Comma-separated list of fields to be included in the response. Omitting\nthis field will include all fields except for connections.list requests,\nwhich have a default mask that includes common fields like metadata, name,\nphoto, and profile url.\nEach path should start with `person.`: for example, `person.names` or\n`person.photos`.",
+                      "format": "google-fieldmask",
+                      "type": "string"
+                    },
+                    "sortOrder": {
+                      "location": "query",
+                      "enum": [
+                        "LAST_MODIFIED_ASCENDING",
+                        "FIRST_NAME_ASCENDING",
+                        "LAST_NAME_ASCENDING"
+                      ],
+                      "description": "The order in which the connections should be sorted. Defaults to\n`LAST_MODIFIED_ASCENDING`.",
+                      "type": "string"
+                    },
+                    "syncToken": {
+                      "description": "A sync token, returned by a previous call to `people.connections.list`.\nOnly resources changed since the sync token was created will be returned.",
+                      "type": "string",
+                      "location": "query"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/contacts",
+                    "https://www.googleapis.com/auth/contacts.readonly"
+                  ],
+                  "flatPath": "v1/people/me/connections",
+                  "path": "v1/people/me/connections",
+                  "id": "people.people.me.connections.list"
+                }
+              }
+            }
+          }
+        }
       }
-     }
     }
-   }
-  }
- }
+  },
+  "parameters": {
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    },
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
+    },
+    "upload_protocol": {
+      "type": "string",
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\")."
+    },
+    "prettyPrint": {
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "alt": {
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string",
+      "location": "query"
+    },
+    "access_token": {
+      "type": "string",
+      "location": "query",
+      "description": "OAuth access token."
+    }
+  },
+  "schemas": {
+    "RelationshipStatus": {
+      "description": "A person's read-only relationship status.",
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "description": "Metadata about the relationship status.",
+          "$ref": "FieldMetadata"
+        },
+        "value": {
+          "description": "The relationship status. The value can be custom or predefined.\nPossible values include, but are not limited to, the following:\n\n* `single`\n* `inARelationship`\n* `engaged`\n* `married`\n* `itsComplicated`\n* `openRelationship`\n* `widowed`\n* `inDomesticPartnership`\n* `inCivilUnion`",
+          "type": "string"
+        },
+        "formattedValue": {
+          "description": "The read-only value of the relationship status translated and formatted in\nthe viewer's account locale or the `Accept-Language` HTTP header locale.",
+          "type": "string"
+        }
+      },
+      "id": "RelationshipStatus"
+    },
+    "Date": {
+      "type": "object",
+      "properties": {
+        "month": {
+          "description": "Month of year. Must be from 1 to 12.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "year": {
+          "description": "Year of date. Must be from 1 to 9999, or 0 if specifying a date without\na year.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "day": {
+          "description": "Day of month. Must be from 1 to 31 and valid for the year and month, or 0\nif specifying a year/month where the day is not significant.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "Date",
+      "description": "Represents a whole calendar date, for example a date of birth. The time\nof day and time zone are either specified elsewhere or are not\nsignificant. The date is relative to the\n[Proleptic Gregorian Calendar](https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar).\nThe day may be 0 to represent a year and month where the day is not\nsignificant. The year may be 0 to represent a month and day independent\nof year; for example, anniversary date."
+    },
+    "Tagline": {
+      "id": "Tagline",
+      "description": "A read-only brief one-line description of the person.",
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "description": "Metadata about the tagline.",
+          "$ref": "FieldMetadata"
+        },
+        "value": {
+          "description": "The tagline.",
+          "type": "string"
+        }
+      }
+    },
+    "Name": {
+      "description": "A person's name. If the name is a mononym, the family name is empty.",
+      "type": "object",
+      "properties": {
+        "honorificPrefix": {
+          "description": "The honorific prefixes, such as `Mrs.` or `Dr.`",
+          "type": "string"
+        },
+        "phoneticHonorificSuffix": {
+          "description": "The honorific suffixes spelled as they sound.",
+          "type": "string"
+        },
+        "givenName": {
+          "description": "The given name.",
+          "type": "string"
+        },
+        "middleName": {
+          "description": "The middle name(s).",
+          "type": "string"
+        },
+        "phoneticHonorificPrefix": {
+          "description": "The honorific prefixes spelled as they sound.",
+          "type": "string"
+        },
+        "phoneticGivenName": {
+          "description": "The given name spelled as it sounds.",
+          "type": "string"
+        },
+        "phoneticFamilyName": {
+          "type": "string",
+          "description": "The family name spelled as it sounds."
+        },
+        "familyName": {
+          "description": "The family name.",
+          "type": "string"
+        },
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the name."
+        },
+        "phoneticMiddleName": {
+          "description": "The middle name(s) spelled as they sound.",
+          "type": "string"
+        },
+        "phoneticFullName": {
+          "description": "The full name spelled as it sounds.",
+          "type": "string"
+        },
+        "displayNameLastFirst": {
+          "description": "The read-only display name with the last name first formatted according to\nthe locale specified by the viewer's account or the\n\u003ccode\u003eAccept-Language\u003c/code\u003e HTTP header.",
+          "type": "string"
+        },
+        "displayName": {
+          "description": "The read-only display name formatted according to the locale specified by\nthe viewer's account or the \u003ccode\u003eAccept-Language\u003c/code\u003e HTTP header.",
+          "type": "string"
+        },
+        "honorificSuffix": {
+          "description": "The honorific suffixes, such as `Jr.`",
+          "type": "string"
+        }
+      },
+      "id": "Name"
+    },
+    "BraggingRights": {
+      "description": "A person's bragging rights.",
+      "type": "object",
+      "properties": {
+        "value": {
+          "description": "The bragging rights; for example, `climbed mount everest`.",
+          "type": "string"
+        },
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the bragging rights."
+        }
+      },
+      "id": "BraggingRights"
+    },
+    "Locale": {
+      "properties": {
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the locale."
+        },
+        "value": {
+          "description": "The well-formed [IETF BCP 47](https://tools.ietf.org/html/bcp47)\nlanguage tag representing the locale.",
+          "type": "string"
+        }
+      },
+      "id": "Locale",
+      "description": "A person's locale preference.",
+      "type": "object"
+    },
+    "Organization": {
+      "description": "A person's past or current organization. Overlapping date ranges are\npermitted.",
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "description": "Metadata about the organization.",
+          "$ref": "FieldMetadata"
+        },
+        "title": {
+          "type": "string",
+          "description": "The person's job title at the organization."
+        },
+        "location": {
+          "description": "The location of the organization office the person works at.",
+          "type": "string"
+        },
+        "current": {
+          "type": "boolean",
+          "description": "True if the organization is the person's current organization;\nfalse if the organization is a past organization."
+        },
+        "startDate": {
+          "$ref": "Date",
+          "description": "The start date when the person joined the organization."
+        },
+        "formattedType": {
+          "type": "string",
+          "description": "The read-only type of the organization translated and formatted in the\nviewer's account locale or the `Accept-Language` HTTP header locale."
+        },
+        "domain": {
+          "description": "The domain name associated with the organization; for example, `google.com`.",
+          "type": "string"
+        },
+        "department": {
+          "description": "The person's department at the organization.",
+          "type": "string"
+        },
+        "phoneticName": {
+          "description": "The phonetic name of the organization.",
+          "type": "string"
+        },
+        "type": {
+          "description": "The type of the organization. The type can be custom or predefined.\nPossible values include, but are not limited to, the following:\n\n* `work`\n* `school`",
+          "type": "string"
+        },
+        "jobDescription": {
+          "description": "The person's job description at the organization.",
+          "type": "string"
+        },
+        "endDate": {
+          "$ref": "Date",
+          "description": "The end date when the person left the organization."
+        },
+        "symbol": {
+          "description": "The symbol associated with the organization; for example, a stock ticker\nsymbol, abbreviation, or acronym.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The name of the organization.",
+          "type": "string"
+        }
+      },
+      "id": "Organization"
+    },
+    "Biography": {
+      "id": "Biography",
+      "description": "A person's short biography.",
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "description": "Metadata about the biography.",
+          "$ref": "FieldMetadata"
+        },
+        "value": {
+          "description": "The short biography.",
+          "type": "string"
+        },
+        "contentType": {
+          "description": "The content type of the biography.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified.",
+            "Plain text.",
+            "HTML text."
+          ],
+          "enum": [
+            "CONTENT_TYPE_UNSPECIFIED",
+            "TEXT_PLAIN",
+            "TEXT_HTML"
+          ]
+        }
+      }
+    },
+    "FieldMetadata": {
+      "type": "object",
+      "properties": {
+        "source": {
+          "$ref": "Source",
+          "description": "The source of the field."
+        },
+        "verified": {
+          "description": "True if the field is verified; false if the field is unverified. A\nverified field is typically a name, email address, phone number, or\nwebsite that has been confirmed to be owned by the person.",
+          "type": "boolean"
+        },
+        "primary": {
+          "description": "True if the field is the primary field; false if the field is a secondary\nfield.",
+          "type": "boolean"
+        }
+      },
+      "id": "FieldMetadata",
+      "description": "Metadata about a field."
+    },
+    "Source": {
+      "type": "object",
+      "properties": {
+        "etag": {
+          "description": "The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the\nsource. Used for web cache validation. Only populated in\nperson.metadata.sources.",
+          "type": "string"
+        },
+        "id": {
+          "description": "The unique identifier within the source type generated by the server.",
+          "type": "string"
+        },
+        "resourceName": {
+          "description": "The resource name of the source. Only set if there is a separate\nresource endpoint.",
+          "type": "string"
+        },
+        "type": {
+          "enumDescriptions": [
+            "Unspecified.",
+            "[Google Account](https://accounts.google.com).",
+            "[Google profile](https://profiles.google.com). You can view the\nprofile at https://profiles.google.com/\u003cid\u003e where \u003cid\u003e is the source\nid.",
+            "[Google Apps domain profile](https://admin.google.com).",
+            "[Google contact](https://contacts.google.com). You can view the\ncontact at https://contact.google.com/\u003cid\u003e where \u003cid\u003e is the source\nid."
+          ],
+          "enum": [
+            "SOURCE_TYPE_UNSPECIFIED",
+            "ACCOUNT",
+            "PROFILE",
+            "DOMAIN_PROFILE",
+            "CONTACT"
+          ],
+          "description": "The source type.",
+          "type": "string"
+        }
+      },
+      "id": "Source",
+      "description": "The source of a field."
+    },
+    "RelationshipInterest": {
+      "description": "A person's read-only relationship interest .",
+      "type": "object",
+      "properties": {
+        "formattedValue": {
+          "description": "The value of the relationship interest translated and formatted in the\nviewer's account locale or the locale specified in the Accept-Language\nHTTP header.",
+          "type": "string"
+        },
+        "metadata": {
+          "description": "Metadata about the relationship interest.",
+          "$ref": "FieldMetadata"
+        },
+        "value": {
+          "description": "The kind of relationship the person is looking for. The value can be custom\nor predefined. Possible values include, but are not limited to, the\nfollowing values:\n\n* `friend`\n* `date`\n* `relationship`\n* `networking`",
+          "type": "string"
+        }
+      },
+      "id": "RelationshipInterest"
+    },
+    "PersonResponse": {
+      "description": "The response for a single person",
+      "type": "object",
+      "properties": {
+        "person": {
+          "description": "The person.",
+          "$ref": "Person"
+        },
+        "httpStatusCode": {
+          "description": "[HTTP 1.1 status code](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html).",
+          "format": "int32",
+          "type": "integer"
+        },
+        "requestedResourceName": {
+          "description": "The original requested resource name. May be different than the resource\nname on the returned person.\n\nThe resource name can change when adding or removing fields that link a\ncontact and profile such as a verified email, verified phone number, or a\nprofile URL.",
+          "type": "string"
+        }
+      },
+      "id": "PersonResponse"
+    },
+    "Relation": {
+      "description": "A person's relation to another person.",
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the relation."
+        },
+        "type": {
+          "description": "The person's relation to the other person. The type can be custom or predefined.\nPossible values include, but are not limited to, the following values:\n\n* `spouse`\n* `child`\n* `mother`\n* `father`\n* `parent`\n* `brother`\n* `sister`\n* `friend`\n* `relative`\n* `domesticPartner`\n* `manager`\n* `assistant`\n* `referredBy`\n* `partner`",
+          "type": "string"
+        },
+        "person": {
+          "description": "The name of the other person this relation refers to.",
+          "type": "string"
+        },
+        "formattedType": {
+          "type": "string",
+          "description": "The type of the relation translated and formatted in the viewer's account\nlocale or the locale specified in the Accept-Language HTTP header."
+        }
+      },
+      "id": "Relation"
+    },
+    "Occupation": {
+      "properties": {
+        "metadata": {
+          "description": "Metadata about the occupation.",
+          "$ref": "FieldMetadata"
+        },
+        "value": {
+          "description": "The occupation; for example, `carpenter`.",
+          "type": "string"
+        }
+      },
+      "id": "Occupation",
+      "description": "A person's occupation.",
+      "type": "object"
+    },
+    "Person": {
+      "type": "object",
+      "properties": {
+        "events": {
+          "description": "The person's events.",
+          "type": "array",
+          "items": {
+            "$ref": "Event"
+          }
+        },
+        "memberships": {
+          "description": "The person's group memberships.",
+          "type": "array",
+          "items": {
+            "$ref": "Membership"
+          }
+        },
+        "phoneNumbers": {
+          "description": "The person's phone numbers.",
+          "type": "array",
+          "items": {
+            "$ref": "PhoneNumber"
+          }
+        },
+        "coverPhotos": {
+          "description": "The person's cover photos.",
+          "type": "array",
+          "items": {
+            "$ref": "CoverPhoto"
+          }
+        },
+        "imClients": {
+          "description": "The person's instant messaging clients.",
+          "type": "array",
+          "items": {
+            "$ref": "ImClient"
+          }
+        },
+        "birthdays": {
+          "description": "The person's birthdays.",
+          "type": "array",
+          "items": {
+            "$ref": "Birthday"
+          }
+        },
+        "locales": {
+          "description": "The person's locale preferences.",
+          "type": "array",
+          "items": {
+            "$ref": "Locale"
+          }
+        },
+        "relationshipInterests": {
+          "description": "The kind of relationship the person is looking for.",
+          "type": "array",
+          "items": {
+            "$ref": "RelationshipInterest"
+          }
+        },
+        "urls": {
+          "description": "The person's associated URLs.",
+          "type": "array",
+          "items": {
+            "$ref": "Url"
+          }
+        },
+        "nicknames": {
+          "description": "The person's nicknames.",
+          "type": "array",
+          "items": {
+            "$ref": "Nickname"
+          }
+        },
+        "names": {
+          "description": "The person's names.",
+          "type": "array",
+          "items": {
+            "$ref": "Name"
+          }
+        },
+        "relations": {
+          "description": "The person's relations.",
+          "type": "array",
+          "items": {
+            "$ref": "Relation"
+          }
+        },
+        "occupations": {
+          "description": "The person's occupations.",
+          "type": "array",
+          "items": {
+            "$ref": "Occupation"
+          }
+        },
+        "emailAddresses": {
+          "description": "The person's email addresses.",
+          "type": "array",
+          "items": {
+            "$ref": "EmailAddress"
+          }
+        },
+        "organizations": {
+          "description": "The person's past or current organizations.",
+          "type": "array",
+          "items": {
+            "$ref": "Organization"
+          }
+        },
+        "etag": {
+          "description": "The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag) of the\nresource. Used for web cache validation.",
+          "type": "string"
+        },
+        "braggingRights": {
+          "description": "The person's bragging rights.",
+          "type": "array",
+          "items": {
+            "$ref": "BraggingRights"
+          }
+        },
+        "metadata": {
+          "$ref": "PersonMetadata",
+          "description": "Metadata about the person."
+        },
+        "residences": {
+          "description": "The person's residences.",
+          "type": "array",
+          "items": {
+            "$ref": "Residence"
+          }
+        },
+        "genders": {
+          "description": "The person's genders.",
+          "type": "array",
+          "items": {
+            "$ref": "Gender"
+          }
+        },
+        "resourceName": {
+          "description": "The resource name for the person, assigned by the server. An ASCII string\nwith a max length of 27 characters. Always starts with `people/`.",
+          "type": "string"
+        },
+        "interests": {
+          "type": "array",
+          "items": {
+            "$ref": "Interest"
+          },
+          "description": "The person's interests."
+        },
+        "biographies": {
+          "type": "array",
+          "items": {
+            "$ref": "Biography"
+          },
+          "description": "The person's biographies."
+        },
+        "skills": {
+          "description": "The person's skills.",
+          "type": "array",
+          "items": {
+            "$ref": "Skill"
+          }
+        },
+        "relationshipStatuses": {
+          "description": "The person's relationship statuses.",
+          "type": "array",
+          "items": {
+            "$ref": "RelationshipStatus"
+          }
+        },
+        "photos": {
+          "description": "The person's photos.",
+          "type": "array",
+          "items": {
+            "$ref": "Photo"
+          }
+        },
+        "ageRange": {
+          "enum": [
+            "AGE_RANGE_UNSPECIFIED",
+            "LESS_THAN_EIGHTEEN",
+            "EIGHTEEN_TO_TWENTY",
+            "TWENTY_ONE_OR_OLDER"
+          ],
+          "description": "The person's age range.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified.",
+            "Younger than eighteen.",
+            "Between eighteen and twenty.",
+            "Twenty-one and older."
+          ]
+        },
+        "taglines": {
+          "description": "The person's taglines.",
+          "type": "array",
+          "items": {
+            "$ref": "Tagline"
+          }
+        },
+        "addresses": {
+          "description": "The person's street addresses.",
+          "type": "array",
+          "items": {
+            "$ref": "Address"
+          }
+        }
+      },
+      "id": "Person",
+      "description": "Information about a person merged from various data sources such as the\nauthenticated user's contacts and profile data. Fields other than IDs,\nmetadata, and group memberships are user-edited.\n\nMost fields can have multiple items. The items in a field have no guaranteed\norder, but each non-empty field is guaranteed to have exactly one field with\n`metadata.primary` set to true."
+    },
+    "GetPeopleResponse": {
+      "properties": {
+        "responses": {
+          "description": "The response for each requested resource name.",
+          "type": "array",
+          "items": {
+            "$ref": "PersonResponse"
+          }
+        }
+      },
+      "id": "GetPeopleResponse",
+      "type": "object"
+    },
+    "PhoneNumber": {
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the phone number."
+        },
+        "type": {
+          "description": "The type of the phone number. The type can be custom or predefined.\nPossible values include, but are not limited to, the following:\n\n* `home`\n* `work`\n* `mobile`\n* `homeFax`\n* `workFax`\n* `otherFax`\n* `pager`\n* `workMobile`\n* `workPager`\n* `main`\n* `googleVoice`\n* `other`",
+          "type": "string"
+        },
+        "value": {
+          "description": "The phone number.",
+          "type": "string"
+        },
+        "formattedType": {
+          "description": "The read-only type of the phone number translated and formatted in the\nviewer's account locale or the the `Accept-Language` HTTP header locale.",
+          "type": "string"
+        },
+        "canonicalForm": {
+          "description": "The read-only canonicalized [ITU-T E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.pdf)\nform of the phone number.",
+          "type": "string"
+        }
+      },
+      "id": "PhoneNumber",
+      "description": "A person's phone number."
+    },
+    "Photo": {
+      "description": "A person's read-only photo. A picture shown next to the person's name to\nhelp others recognize the person.",
+      "type": "object",
+      "properties": {
+        "url": {
+          "description": "The URL of the photo.",
+          "type": "string"
+        },
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the photo."
+        }
+      },
+      "id": "Photo"
+    },
+    "ListConnectionsResponse": {
+      "type": "object",
+      "properties": {
+        "connections": {
+          "description": "The list of people that the requestor is connected to.",
+          "type": "array",
+          "items": {
+            "$ref": "Person"
+          }
+        },
+        "nextSyncToken": {
+          "type": "string",
+          "description": "The token that can be used to retrieve changes since the last request."
+        },
+        "nextPageToken": {
+          "description": "The token that can be used to retrieve the next page of results.",
+          "type": "string"
+        }
+      },
+      "id": "ListConnectionsResponse"
+    },
+    "Birthday": {
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the birthday."
+        },
+        "text": {
+          "description": "A free-form string representing the user's birthday.",
+          "type": "string"
+        },
+        "date": {
+          "description": "The date of the birthday.",
+          "$ref": "Date"
+        }
+      },
+      "id": "Birthday",
+      "description": "A person's birthday. At least one of the `date` and `text` fields are\nspecified. The `date` and `text` fields typically represent the same\ndate, but are not guaranteed to."
+    },
+    "Address": {
+      "description": "A person's physical address. May be a P.O. box or street address. All fields\nare optional.",
+      "type": "object",
+      "properties": {
+        "extendedAddress": {
+          "description": "The extended address of the address; for example, the apartment number.",
+          "type": "string"
+        },
+        "poBox": {
+          "description": "The P.O. box of the address.",
+          "type": "string"
+        },
+        "postalCode": {
+          "description": "The postal code of the address.",
+          "type": "string"
+        },
+        "region": {
+          "description": "The region of the address; for example, the state or province.",
+          "type": "string"
+        },
+        "streetAddress": {
+          "description": "The street address.",
+          "type": "string"
+        },
+        "metadata": {
+          "description": "Metadata about the address.",
+          "$ref": "FieldMetadata"
+        },
+        "countryCode": {
+          "description": "The [ISO 3166-1 alpha-2](http://www.iso.org/iso/country_codes.htm) country\ncode of the address.",
+          "type": "string"
+        },
+        "formattedType": {
+          "description": "The read-only type of the address translated and formatted in the viewer's\naccount locale or the `Accept-Language` HTTP header locale.",
+          "type": "string"
+        },
+        "city": {
+          "description": "The city of the address.",
+          "type": "string"
+        },
+        "formattedValue": {
+          "description": "The unstructured value of the address. If this is not set by the user it\nwill be automatically constructed from structured values.",
+          "type": "string"
+        },
+        "country": {
+          "description": "The country of the address.",
+          "type": "string"
+        },
+        "type": {
+          "description": "The type of the address. The type can be custom or predefined.\nPossible values include, but are not limited to, the following:\n\n* `home`\n* `work`\n* `other`",
+          "type": "string"
+        }
+      },
+      "id": "Address"
+    },
+    "Residence": {
+      "id": "Residence",
+      "description": "A person's past or current residence.",
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the residence."
+        },
+        "current": {
+          "description": "True if the residence is the person's current residence;\nfalse if the residence is a past residence.",
+          "type": "boolean"
+        },
+        "value": {
+          "description": "The address of the residence.",
+          "type": "string"
+        }
+      }
+    },
+    "ContactGroupMembership": {
+      "description": "A Google contact group membership.",
+      "type": "object",
+      "properties": {
+        "contactGroupId": {
+          "description": "The contact group ID for the contact group membership. The contact group\nID can be custom or predefined. Possible values include, but are not\nlimited to, the following:\n\n*  `myContacts`\n*  `starred`\n*  A numerical ID for user-created groups.",
+          "type": "string"
+        }
+      },
+      "id": "ContactGroupMembership"
+    },
+    "PersonMetadata": {
+      "description": "The read-only metadata about a person.",
+      "type": "object",
+      "properties": {
+        "objectType": {
+          "enum": [
+            "OBJECT_TYPE_UNSPECIFIED",
+            "PERSON",
+            "PAGE"
+          ],
+          "description": "The type of the person object.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unspecified.",
+            "Person.",
+            "[Google+ Page.](http://www.google.com/+/brands/)"
+          ]
+        },
+        "linkedPeopleResourceNames": {
+          "description": "Resource names of people linked to this resource.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "sources": {
+          "description": "The sources of data for the person.",
+          "type": "array",
+          "items": {
+            "$ref": "Source"
+          }
+        },
+        "previousResourceNames": {
+          "description": "Any former resource names this person has had. Populated only for\n[`connections.list`](/people/api/rest/v1/people.connections/list) requests\nthat include a sync token.\n\nThe resource name may change when adding or removing fields that link a\ncontact and profile such as a verified email, verified phone number, or\nprofile URL.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "deleted": {
+          "description": "True if the person resource has been deleted. Populated only for\n[`connections.list`](/people/api/rest/v1/people.connections/list) requests\nthat include a sync token.",
+          "type": "boolean"
+        }
+      },
+      "id": "PersonMetadata"
+    },
+    "Event": {
+      "properties": {
+        "formattedType": {
+          "type": "string",
+          "description": "The read-only type of the event translated and formatted in the\nviewer's account locale or the `Accept-Language` HTTP header locale."
+        },
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the event."
+        },
+        "type": {
+          "type": "string",
+          "description": "The type of the event. The type can be custom or predefined.\nPossible values include, but are not limited to, the following:\n\n* `anniversary`\n* `other`"
+        },
+        "date": {
+          "$ref": "Date",
+          "description": "The date of the event."
+        }
+      },
+      "id": "Event",
+      "description": "An event related to the person.",
+      "type": "object"
+    },
+    "Url": {
+      "description": "A person's associated URLs.",
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "description": "Metadata about the URL.",
+          "$ref": "FieldMetadata"
+        },
+        "type": {
+          "description": "The type of the URL. The type can be custom or predefined.\nPossible values include, but are not limited to, the following:\n\n* `home`\n* `work`\n* `blog`\n* `profile`\n* `homePage`\n* `ftp`\n* `reservations`\n* `appInstallPage`: website for a Google+ application.\n* `other`",
+          "type": "string"
+        },
+        "value": {
+          "description": "The URL.",
+          "type": "string"
+        },
+        "formattedType": {
+          "description": "The read-only type of the URL translated and formatted in the viewer's\naccount locale or the `Accept-Language` HTTP header locale.",
+          "type": "string"
+        }
+      },
+      "id": "Url"
+    },
+    "Gender": {
+      "id": "Gender",
+      "description": "A person's gender.",
+      "type": "object",
+      "properties": {
+        "value": {
+          "description": "The gender for the person. The gender can be custom or predefined.\nPossible values include, but are not limited to, the\nfollowing:\n\n* `male`\n* `female`\n* `other`\n* `unknown`",
+          "type": "string"
+        },
+        "formattedValue": {
+          "description": "The read-only value of the gender translated and formatted in the viewer's\naccount locale or the `Accept-Language` HTTP header locale.",
+          "type": "string"
+        },
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the gender."
+        }
+      }
+    },
+    "CoverPhoto": {
+      "description": "A person's read-only cover photo. A large image shown on the person's\nprofile page that represents who they are or what they care about.",
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the cover photo."
+        },
+        "default": {
+          "description": "True if the cover photo is the default cover photo;\nfalse if the cover photo is a user-provided cover photo.",
+          "type": "boolean"
+        },
+        "url": {
+          "description": "The URL of the cover photo.",
+          "type": "string"
+        }
+      },
+      "id": "CoverPhoto"
+    },
+    "ImClient": {
+      "type": "object",
+      "properties": {
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the IM client."
+        },
+        "type": {
+          "description": "The type of the IM client. The type can be custom or predefined.\nPossible values include, but are not limited to, the following:\n\n* `home`\n* `work`\n* `other`",
+          "type": "string"
+        },
+        "protocol": {
+          "description": "The protocol of the IM client. The protocol can be custom or predefined.\nPossible values include, but are not limited to, the following:\n\n* `aim`\n* `msn`\n* `yahoo`\n* `skype`\n* `qq`\n* `googleTalk`\n* `icq`\n* `jabber`\n* `netMeeting`",
+          "type": "string"
+        },
+        "username": {
+          "description": "The user name used in the IM client.",
+          "type": "string"
+        },
+        "formattedProtocol": {
+          "description": "The read-only protocol of the IM client formatted in the viewer's account\nlocale or the `Accept-Language` HTTP header locale.",
+          "type": "string"
+        },
+        "formattedType": {
+          "description": "The read-only type of the IM client translated and formatted in the\nviewer's account locale or the `Accept-Language` HTTP header locale.",
+          "type": "string"
+        }
+      },
+      "id": "ImClient",
+      "description": "A person's instant messaging client."
+    },
+    "Interest": {
+      "description": "One of the person's interests.",
+      "type": "object",
+      "properties": {
+        "value": {
+          "type": "string",
+          "description": "The interest; for example, `stargazing`."
+        },
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the interest."
+        }
+      },
+      "id": "Interest"
+    },
+    "Nickname": {
+      "description": "A person's nickname.",
+      "type": "object",
+      "properties": {
+        "value": {
+          "description": "The nickname.",
+          "type": "string"
+        },
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the nickname."
+        },
+        "type": {
+          "enumDescriptions": [
+            "Generic nickname.",
+            "Maiden name or birth family name. Used when the person's family name has\nchanged as a result of marriage.",
+            "Initials.",
+            "Google+ profile nickname.",
+            "A professional affiliation or other name; for example, `Dr. Smith.`"
+          ],
+          "enum": [
+            "DEFAULT",
+            "MAIDEN_NAME",
+            "INITIALS",
+            "GPLUS",
+            "OTHER_NAME"
+          ],
+          "description": "The type of the nickname.",
+          "type": "string"
+        }
+      },
+      "id": "Nickname"
+    },
+    "EmailAddress": {
+      "properties": {
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the email address."
+        },
+        "type": {
+          "description": "The type of the email address. The type can be custom or predefined.\nPossible values include, but are not limited to, the following:\n\n* `home`\n* `work`\n* `other`",
+          "type": "string"
+        },
+        "value": {
+          "description": "The email address.",
+          "type": "string"
+        },
+        "formattedType": {
+          "description": "The read-only type of the email address translated and formatted in the\nviewer's account locale or the `Accept-Language` HTTP header locale.",
+          "type": "string"
+        },
+        "displayName": {
+          "description": "The display name of the email.",
+          "type": "string"
+        }
+      },
+      "id": "EmailAddress",
+      "description": "A person's email address.",
+      "type": "object"
+    },
+    "Skill": {
+      "description": "A skill that the person has.",
+      "type": "object",
+      "properties": {
+        "value": {
+          "description": "The skill; for example, `underwater basket weaving`.",
+          "type": "string"
+        },
+        "metadata": {
+          "$ref": "FieldMetadata",
+          "description": "Metadata about the skill."
+        }
+      },
+      "id": "Skill"
+    },
+    "DomainMembership": {
+      "id": "DomainMembership",
+      "description": "A Google Apps Domain membership.",
+      "type": "object",
+      "properties": {
+        "inViewerDomain": {
+          "description": "True if the person is in the viewer's Google Apps domain.",
+          "type": "boolean"
+        }
+      }
+    },
+    "Membership": {
+      "description": "A person's read-only membership in a group.",
+      "type": "object",
+      "properties": {
+        "contactGroupMembership": {
+          "$ref": "ContactGroupMembership",
+          "description": "The contact group membership."
+        },
+        "domainMembership": {
+          "$ref": "DomainMembership",
+          "description": "The domain membership."
+        },
+        "metadata": {
+          "description": "Metadata about the membership.",
+          "$ref": "FieldMetadata"
+        }
+      },
+      "id": "Membership"
+    }
+  },
+  "protocol": "rest",
+  "icons": {
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
+  },
+  "version": "v1",
+  "baseUrl": "https://people.googleapis.com/",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/user.addresses.read": {
+          "description": "View your street addresses"
+        },
+        "https://www.googleapis.com/auth/contacts": {
+          "description": "Manage your contacts"
+        },
+        "https://www.googleapis.com/auth/user.emails.read": {
+          "description": "View your email addresses"
+        },
+        "https://www.googleapis.com/auth/userinfo.email": {
+          "description": "View your email address"
+        },
+        "https://www.googleapis.com/auth/user.phonenumbers.read": {
+          "description": "View your phone numbers"
+        },
+        "https://www.googleapis.com/auth/contacts.readonly": {
+          "description": "View your contacts"
+        },
+        "https://www.googleapis.com/auth/user.birthday.read": {
+          "description": "View your complete date of birth"
+        },
+        "https://www.googleapis.com/auth/plus.login": {
+          "description": "Know the list of people in your circles, your age range, and language"
+        },
+        "https://www.googleapis.com/auth/userinfo.profile": {
+          "description": "View your basic profile info"
+        }
+      }
+    }
+  },
+  "kind": "discovery#restDescription",
+  "description": "Provides access to information about profiles and contacts.",
+  "servicePath": "",
+  "rootUrl": "https://people.googleapis.com/"
 }
diff --git a/people/v1/people-gen.go b/people/v1/people-gen.go
index 1a0d8a8..7db4904 100644
--- a/people/v1/people-gen.go
+++ b/people/v1/people-gen.go
@@ -53,7 +53,7 @@
 	// View your contacts
 	ContactsReadonlyScope = "https://www.googleapis.com/auth/contacts.readonly"
 
-	// Know your basic profile info and list of people in your circles.
+	// Know the list of people in your circles, your age range, and language
 	PlusLoginScope = "https://www.googleapis.com/auth/plus.login"
 
 	// View your street addresses
@@ -85,9 +85,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	People *PeopleService
 }
@@ -99,29 +100,46 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewPeopleService(s *Service) *PeopleService {
 	rs := &PeopleService{s: s}
-	rs.Connections = NewPeopleConnectionsService(s)
+	rs.Me = NewPeopleMeService(s)
 	return rs
 }
 
 type PeopleService struct {
 	s *Service
 
-	Connections *PeopleConnectionsService
+	Me *PeopleMeService
 }
 
-func NewPeopleConnectionsService(s *Service) *PeopleConnectionsService {
-	rs := &PeopleConnectionsService{s: s}
+func NewPeopleMeService(s *Service) *PeopleMeService {
+	rs := &PeopleMeService{s: s}
+	rs.Connections = NewPeopleMeConnectionsService(s)
 	return rs
 }
 
-type PeopleConnectionsService struct {
+type PeopleMeService struct {
+	s *Service
+
+	Connections *PeopleMeConnectionsService
+}
+
+func NewPeopleMeConnectionsService(s *Service) *PeopleMeConnectionsService {
+	rs := &PeopleMeConnectionsService{s: s}
+	return rs
+}
+
+type PeopleMeConnectionsService struct {
 	s *Service
 }
 
 // Address: A person's physical address. May be a P.O. box or street
-// address. All fields are optional.
+// address. All fields
+// are optional.
 type Address struct {
 	// City: The city of the address.
 	City string `json:"city,omitempty"`
@@ -130,8 +148,8 @@
 	Country string `json:"country,omitempty"`
 
 	// CountryCode: The [ISO 3166-1
-	// alpha-2](http://www.iso.org/iso/country_codes.htm) country code of
-	// the address.
+	// alpha-2](http://www.iso.org/iso/country_codes.htm) country
+	// code of the address.
 	CountryCode string `json:"countryCode,omitempty"`
 
 	// ExtendedAddress: The extended address of the address; for example,
@@ -139,12 +157,13 @@
 	ExtendedAddress string `json:"extendedAddress,omitempty"`
 
 	// FormattedType: The read-only type of the address translated and
-	// formatted in the viewer's account locale or the `Accept-Language`
-	// HTTP header locale.
+	// formatted in the viewer's
+	// account locale or the `Accept-Language` HTTP header locale.
 	FormattedType string `json:"formattedType,omitempty"`
 
-	// FormattedValue: The read-only value of the address formatted in the
-	// viewer's account locale or the `Accept-Language` HTTP header locale.
+	// FormattedValue: The unstructured value of the address. If this is not
+	// set by the user it
+	// will be automatically constructed from structured values.
 	FormattedValue string `json:"formattedValue,omitempty"`
 
 	// Metadata: Metadata about the address.
@@ -163,9 +182,13 @@
 	// StreetAddress: The street address.
 	StreetAddress string `json:"streetAddress,omitempty"`
 
-	// Type: The type of the address. The type can be custom or predefined.
-	// Possible values include, but are not limited to, the following: *
-	// `home` * `work` * `other`
+	// Type: The type of the address. The type can be custom or
+	// predefined.
+	// Possible values include, but are not limited to, the following:
+	//
+	// * `home`
+	// * `work`
+	// * `other`
 	Type string `json:"type,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "City") to
@@ -193,13 +216,21 @@
 
 // Biography: A person's short biography.
 type Biography struct {
+	// ContentType: The content type of the biography.
+	//
+	// Possible values:
+	//   "CONTENT_TYPE_UNSPECIFIED" - Unspecified.
+	//   "TEXT_PLAIN" - Plain text.
+	//   "TEXT_HTML" - HTML text.
+	ContentType string `json:"contentType,omitempty"`
+
 	// Metadata: Metadata about the biography.
 	Metadata *FieldMetadata `json:"metadata,omitempty"`
 
 	// Value: The short biography.
 	Value string `json:"value,omitempty"`
 
-	// ForceSendFields is a list of field names (e.g. "Metadata") to
+	// ForceSendFields is a list of field names (e.g. "ContentType") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
 	// non-interface field appearing in ForceSendFields will be sent to the
@@ -207,10 +238,10 @@
 	// used to include empty fields in Patch requests.
 	ForceSendFields []string `json:"-"`
 
-	// NullFields is a list of field names (e.g. "Metadata") to include in
-	// API requests with the JSON null value. By default, fields with empty
-	// values are omitted from API requests. However, any field with an
-	// empty value appearing in NullFields will be sent to the server as
+	// NullFields is a list of field names (e.g. "ContentType") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
 	// null. It is an error if a field in this list has a non-empty value.
 	// This may be used to include null fields in Patch requests.
 	NullFields []string `json:"-"`
@@ -223,8 +254,10 @@
 }
 
 // Birthday: A person's birthday. At least one of the `date` and `text`
-// fields are specified. The `date` and `text` fields typically
-// represent the same date, but are not guaranteed to.
+// fields are
+// specified. The `date` and `text` fields typically represent the
+// same
+// date, but are not guaranteed to.
 type Birthday struct {
 	// Date: The date of the birthday.
 	Date *Date `json:"date,omitempty"`
@@ -292,9 +325,14 @@
 // ContactGroupMembership: A Google contact group membership.
 type ContactGroupMembership struct {
 	// ContactGroupId: The contact group ID for the contact group
-	// membership. The contact group ID can be custom or predefined.
-	// Possible values include, but are not limited to, the following: *
-	// `myContacts` * `starred` * A numerical ID for user-created groups.
+	// membership. The contact group
+	// ID can be custom or predefined. Possible values include, but are
+	// not
+	// limited to, the following:
+	//
+	// *  `myContacts`
+	// *  `starred`
+	// *  A numerical ID for user-created groups.
 	ContactGroupId string `json:"contactGroupId,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ContactGroupId") to
@@ -321,12 +359,12 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// CoverPhoto: A person's cover photo. A large image shown on the
-// person's profile page that represents who they are or what they care
-// about.
+// CoverPhoto: A person's read-only cover photo. A large image shown on
+// the person's
+// profile page that represents who they are or what they care about.
 type CoverPhoto struct {
-	// Default: True if the cover photo is the default cover photo; false if
-	// the cover photo is a user-provided cover photo.
+	// Default: True if the cover photo is the default cover photo;
+	// false if the cover photo is a user-provided cover photo.
 	Default bool `json:"default,omitempty"`
 
 	// Metadata: Metadata about the cover photo.
@@ -359,23 +397,30 @@
 }
 
 // Date: Represents a whole calendar date, for example a date of birth.
-// The time of day and time zone are either specified elsewhere or are
-// not significant. The date is relative to the [Proleptic Gregorian
+// The time
+// of day and time zone are either specified elsewhere or are
+// not
+// significant. The date is relative to the
+// [Proleptic Gregorian
 // Calendar](https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar).
-//  The day may be 0 to represent a year and month where the day is not
+//
+// The day may be 0 to represent a year and month where the day is
+// not
 // significant. The year may be 0 to represent a month and day
-// independent of year; for example, anniversary date.
+// independent
+// of year; for example, anniversary date.
 type Date struct {
 	// Day: Day of month. Must be from 1 to 31 and valid for the year and
-	// month, or 0 if specifying a year/month where the day is not
-	// significant.
+	// month, or 0
+	// if specifying a year/month where the day is not significant.
 	Day int64 `json:"day,omitempty"`
 
 	// Month: Month of year. Must be from 1 to 12.
 	Month int64 `json:"month,omitempty"`
 
 	// Year: Year of date. Must be from 1 to 9999, or 0 if specifying a date
-	// without a year.
+	// without
+	// a year.
 	Year int64 `json:"year,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Day") to
@@ -433,23 +478,30 @@
 
 // EmailAddress: A person's email address.
 type EmailAddress struct {
+	// DisplayName: The display name of the email.
+	DisplayName string `json:"displayName,omitempty"`
+
 	// FormattedType: The read-only type of the email address translated and
-	// formatted in the viewer's account locale or the `Accept-Language`
-	// HTTP header locale.
+	// formatted in the
+	// viewer's account locale or the `Accept-Language` HTTP header locale.
 	FormattedType string `json:"formattedType,omitempty"`
 
 	// Metadata: Metadata about the email address.
 	Metadata *FieldMetadata `json:"metadata,omitempty"`
 
 	// Type: The type of the email address. The type can be custom or
-	// predefined. Possible values include, but are not limited to, the
-	// following: * `home` * `work` * `other`
+	// predefined.
+	// Possible values include, but are not limited to, the following:
+	//
+	// * `home`
+	// * `work`
+	// * `other`
 	Type string `json:"type,omitempty"`
 
 	// Value: The email address.
 	Value string `json:"value,omitempty"`
 
-	// ForceSendFields is a list of field names (e.g. "FormattedType") to
+	// ForceSendFields is a list of field names (e.g. "DisplayName") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
 	// non-interface field appearing in ForceSendFields will be sent to the
@@ -457,7 +509,7 @@
 	// used to include empty fields in Patch requests.
 	ForceSendFields []string `json:"-"`
 
-	// NullFields is a list of field names (e.g. "FormattedType") to include
+	// NullFields is a list of field names (e.g. "DisplayName") to include
 	// in API requests with the JSON null value. By default, fields with
 	// empty values are omitted from API requests. However, any field with
 	// an empty value appearing in NullFields will be sent to the server as
@@ -478,16 +530,19 @@
 	Date *Date `json:"date,omitempty"`
 
 	// FormattedType: The read-only type of the event translated and
-	// formatted in the viewer's account locale or the `Accept-Language`
-	// HTTP header locale.
+	// formatted in the
+	// viewer's account locale or the `Accept-Language` HTTP header locale.
 	FormattedType string `json:"formattedType,omitempty"`
 
 	// Metadata: Metadata about the event.
 	Metadata *FieldMetadata `json:"metadata,omitempty"`
 
-	// Type: The type of the event. The type can be custom or predefined.
-	// Possible values include, but are not limited to, the following: *
-	// `anniversary` * `other`
+	// Type: The type of the event. The type can be custom or
+	// predefined.
+	// Possible values include, but are not limited to, the following:
+	//
+	// * `anniversary`
+	// * `other`
 	Type string `json:"type,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Date") to
@@ -516,16 +571,18 @@
 // FieldMetadata: Metadata about a field.
 type FieldMetadata struct {
 	// Primary: True if the field is the primary field; false if the field
-	// is a secondary field.
+	// is a secondary
+	// field.
 	Primary bool `json:"primary,omitempty"`
 
 	// Source: The source of the field.
 	Source *Source `json:"source,omitempty"`
 
 	// Verified: True if the field is verified; false if the field is
-	// unverified. A verified field is typically a name, email address,
-	// phone number, or website that has been confirmed to be owned by the
-	// person.
+	// unverified. A
+	// verified field is typically a name, email address, phone number,
+	// or
+	// website that has been confirmed to be owned by the person.
 	Verified bool `json:"verified,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Primary") to
@@ -554,16 +611,22 @@
 // Gender: A person's gender.
 type Gender struct {
 	// FormattedValue: The read-only value of the gender translated and
-	// formatted in the viewer's account locale or the `Accept-Language`
-	// HTTP header locale.
+	// formatted in the viewer's
+	// account locale or the `Accept-Language` HTTP header locale.
 	FormattedValue string `json:"formattedValue,omitempty"`
 
 	// Metadata: Metadata about the gender.
 	Metadata *FieldMetadata `json:"metadata,omitempty"`
 
 	// Value: The gender for the person. The gender can be custom or
-	// predefined. Possible values include, but are not limited to, the
-	// following: * `male` * `female` * `other` * `unknown`
+	// predefined.
+	// Possible values include, but are not limited to, the
+	// following:
+	//
+	// * `male`
+	// * `female`
+	// * `other`
+	// * `unknown`
 	Value string `json:"value,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "FormattedValue") to
@@ -624,27 +687,40 @@
 // ImClient: A person's instant messaging client.
 type ImClient struct {
 	// FormattedProtocol: The read-only protocol of the IM client formatted
-	// in the viewer's account locale or the `Accept-Language` HTTP header
-	// locale.
+	// in the viewer's account
+	// locale or the `Accept-Language` HTTP header locale.
 	FormattedProtocol string `json:"formattedProtocol,omitempty"`
 
 	// FormattedType: The read-only type of the IM client translated and
-	// formatted in the viewer's account locale or the `Accept-Language`
-	// HTTP header locale.
+	// formatted in the
+	// viewer's account locale or the `Accept-Language` HTTP header locale.
 	FormattedType string `json:"formattedType,omitempty"`
 
 	// Metadata: Metadata about the IM client.
 	Metadata *FieldMetadata `json:"metadata,omitempty"`
 
 	// Protocol: The protocol of the IM client. The protocol can be custom
-	// or predefined. Possible values include, but are not limited to, the
-	// following: * `aim` * `msn` * `yahoo` * `skype` * `qq` * `googleTalk`
-	// * `icq` * `jabber` * `netMeeting`
+	// or predefined.
+	// Possible values include, but are not limited to, the following:
+	//
+	// * `aim`
+	// * `msn`
+	// * `yahoo`
+	// * `skype`
+	// * `qq`
+	// * `googleTalk`
+	// * `icq`
+	// * `jabber`
+	// * `netMeeting`
 	Protocol string `json:"protocol,omitempty"`
 
 	// Type: The type of the IM client. The type can be custom or
-	// predefined. Possible values include, but are not limited to, the
-	// following: * `home` * `work` * `other`
+	// predefined.
+	// Possible values include, but are not limited to, the following:
+	//
+	// * `home`
+	// * `work`
+	// * `other`
 	Type string `json:"type,omitempty"`
 
 	// Username: The user name used in the IM client.
@@ -750,8 +826,8 @@
 	Metadata *FieldMetadata `json:"metadata,omitempty"`
 
 	// Value: The well-formed [IETF BCP
-	// 47](https://tools.ietf.org/html/bcp47) language tag representing the
-	// locale.
+	// 47](https://tools.ietf.org/html/bcp47)
+	// language tag representing the locale.
 	Value string `json:"value,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Metadata") to
@@ -777,7 +853,7 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// Membership: A person's membership in a group.
+// Membership: A person's read-only membership in a group.
 type Membership struct {
 	// ContactGroupMembership: The contact group membership.
 	ContactGroupMembership *ContactGroupMembership `json:"contactGroupMembership,omitempty"`
@@ -816,10 +892,18 @@
 // Name: A person's name. If the name is a mononym, the family name is
 // empty.
 type Name struct {
-	// DisplayName: The display name formatted according to the locale
-	// specified by the viewer's account or the Accept-Language HTTP header.
+	// DisplayName: The read-only display name formatted according to the
+	// locale specified by
+	// the viewer's account or the <code>Accept-Language</code> HTTP header.
 	DisplayName string `json:"displayName,omitempty"`
 
+	// DisplayNameLastFirst: The read-only display name with the last name
+	// first formatted according to
+	// the locale specified by the viewer's account or
+	// the
+	// <code>Accept-Language</code> HTTP header.
+	DisplayNameLastFirst string `json:"displayNameLastFirst,omitempty"`
+
 	// FamilyName: The family name.
 	FamilyName string `json:"familyName,omitempty"`
 
@@ -841,6 +925,9 @@
 	// PhoneticFamilyName: The family name spelled as it sounds.
 	PhoneticFamilyName string `json:"phoneticFamilyName,omitempty"`
 
+	// PhoneticFullName: The full name spelled as it sounds.
+	PhoneticFullName string `json:"phoneticFullName,omitempty"`
+
 	// PhoneticGivenName: The given name spelled as it sounds.
 	PhoneticGivenName string `json:"phoneticGivenName,omitempty"`
 
@@ -886,11 +973,14 @@
 	// Type: The type of the nickname.
 	//
 	// Possible values:
-	//   "DEFAULT"
-	//   "MAIDEN_NAME"
-	//   "INITIALS"
-	//   "GPLUS"
-	//   "OTHER_NAME"
+	//   "DEFAULT" - Generic nickname.
+	//   "MAIDEN_NAME" - Maiden name or birth family name. Used when the
+	// person's family name has
+	// changed as a result of marriage.
+	//   "INITIALS" - Initials.
+	//   "GPLUS" - Google+ profile nickname.
+	//   "OTHER_NAME" - A professional affiliation or other name; for
+	// example, `Dr. Smith.`
 	Type string `json:"type,omitempty"`
 
 	// Value: The nickname.
@@ -951,10 +1041,12 @@
 }
 
 // Organization: A person's past or current organization. Overlapping
-// date ranges are permitted.
+// date ranges are
+// permitted.
 type Organization struct {
 	// Current: True if the organization is the person's current
-	// organization; false if the organization is a past organization.
+	// organization;
+	// false if the organization is a past organization.
 	Current bool `json:"current,omitempty"`
 
 	// Department: The person's department at the organization.
@@ -968,8 +1060,8 @@
 	EndDate *Date `json:"endDate,omitempty"`
 
 	// FormattedType: The read-only type of the organization translated and
-	// formatted in the viewer's account locale or the `Accept-Language`
-	// HTTP header locale.
+	// formatted in the
+	// viewer's account locale or the `Accept-Language` HTTP header locale.
 	FormattedType string `json:"formattedType,omitempty"`
 
 	// JobDescription: The person's job description at the organization.
@@ -992,15 +1084,19 @@
 	StartDate *Date `json:"startDate,omitempty"`
 
 	// Symbol: The symbol associated with the organization; for example, a
-	// stock ticker symbol, abbreviation, or acronym.
+	// stock ticker
+	// symbol, abbreviation, or acronym.
 	Symbol string `json:"symbol,omitempty"`
 
 	// Title: The person's job title at the organization.
 	Title string `json:"title,omitempty"`
 
 	// Type: The type of the organization. The type can be custom or
-	// predefined. Possible values include, but are not limited to, the
-	// following: * `work` * `school`
+	// predefined.
+	// Possible values include, but are not limited to, the following:
+	//
+	// * `work`
+	// * `school`
 	Type string `json:"type,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Current") to
@@ -1027,11 +1123,16 @@
 }
 
 // Person: Information about a person merged from various data sources
-// such as the authenticated user's contacts and profile data. Fields
-// other than IDs, metadata, and group memberships are user-edited. Most
-// fields can have multiple items. The items in a field have no
-// guaranteed order, but each non-empty field is guaranteed to have
-// exactly one field with `metadata.primary` set to true.
+// such as the
+// authenticated user's contacts and profile data. Fields other than
+// IDs,
+// metadata, and group memberships are user-edited.
+//
+// Most fields can have multiple items. The items in a field have no
+// guaranteed
+// order, but each non-empty field is guaranteed to have exactly one
+// field with
+// `metadata.primary` set to true.
 type Person struct {
 	// Addresses: The person's street addresses.
 	Addresses []*Address `json:"addresses,omitempty"`
@@ -1039,10 +1140,10 @@
 	// AgeRange: The person's age range.
 	//
 	// Possible values:
-	//   "AGE_RANGE_UNSPECIFIED"
-	//   "LESS_THAN_EIGHTEEN"
-	//   "EIGHTEEN_TO_TWENTY"
-	//   "TWENTY_ONE_OR_OLDER"
+	//   "AGE_RANGE_UNSPECIFIED" - Unspecified.
+	//   "LESS_THAN_EIGHTEEN" - Younger than eighteen.
+	//   "EIGHTEEN_TO_TWENTY" - Between eighteen and twenty.
+	//   "TWENTY_ONE_OR_OLDER" - Twenty-one and older.
 	AgeRange string `json:"ageRange,omitempty"`
 
 	// Biographies: The person's biographies.
@@ -1061,7 +1162,8 @@
 	EmailAddresses []*EmailAddress `json:"emailAddresses,omitempty"`
 
 	// Etag: The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag)
-	// of the resource. Used for web cache validation.
+	// of the
+	// resource. Used for web cache validation.
 	Etag string `json:"etag,omitempty"`
 
 	// Events: The person's events.
@@ -1117,8 +1219,8 @@
 	Residences []*Residence `json:"residences,omitempty"`
 
 	// ResourceName: The resource name for the person, assigned by the
-	// server. An ASCII string with a max length of 27 characters. Always
-	// starts with `people/`.
+	// server. An ASCII string
+	// with a max length of 27 characters. Always starts with `people/`.
 	ResourceName string `json:"resourceName,omitempty"`
 
 	// Skills: The person's skills.
@@ -1157,27 +1259,39 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// PersonMetadata: Metadata about a person.
+// PersonMetadata: The read-only metadata about a person.
 type PersonMetadata struct {
 	// Deleted: True if the person resource has been deleted. Populated only
-	// for [`connections.list`](/people/api/rest/v1/people.connections/list)
-	// requests that include a sync token.
+	// for
+	// [`connections.list`](/people/api/rest/v1/people.connections/list)
+	// requests
+	// that include a sync token.
 	Deleted bool `json:"deleted,omitempty"`
 
+	// LinkedPeopleResourceNames: Resource names of people linked to this
+	// resource.
+	LinkedPeopleResourceNames []string `json:"linkedPeopleResourceNames,omitempty"`
+
 	// ObjectType: The type of the person object.
 	//
 	// Possible values:
-	//   "OBJECT_TYPE_UNSPECIFIED"
-	//   "PERSON"
-	//   "PAGE"
+	//   "OBJECT_TYPE_UNSPECIFIED" - Unspecified.
+	//   "PERSON" - Person.
+	//   "PAGE" - [Google+ Page.](http://www.google.com/+/brands/)
 	ObjectType string `json:"objectType,omitempty"`
 
 	// PreviousResourceNames: Any former resource names this person has had.
-	// Populated only for
+	// Populated only
+	// for
 	// [`connections.list`](/people/api/rest/v1/people.connections/list)
-	// requests that include a sync token. The resource name may change when
-	// adding or removing fields that link a contact and profile such as a
-	// verified email, verified phone number, or profile URL.
+	// requests
+	// that include a sync token.
+	//
+	// The resource name may change when adding or removing fields that link
+	// a
+	// contact and profile such as a verified email, verified phone number,
+	// or
+	// profile URL.
 	PreviousResourceNames []string `json:"previousResourceNames,omitempty"`
 
 	// Sources: The sources of data for the person.
@@ -1216,9 +1330,13 @@
 	Person *Person `json:"person,omitempty"`
 
 	// RequestedResourceName: The original requested resource name. May be
-	// different than the resource name on the returned person. The resource
-	// name can change when adding or removing fields that link a contact
-	// and profile such as a verified email, verified phone number, or a
+	// different than the resource
+	// name on the returned person.
+	//
+	// The resource name can change when adding or removing fields that link
+	// a
+	// contact and profile such as a verified email, verified phone number,
+	// or a
 	// profile URL.
 	RequestedResourceName string `json:"requestedResourceName,omitempty"`
 
@@ -1250,22 +1368,35 @@
 type PhoneNumber struct {
 	// CanonicalForm: The read-only canonicalized [ITU-T
 	// E.164](https://law.resource.org/pub/us/cfr/ibr/004/itu-t.E.164.1.2008.
-	// pdf) form of the phone number.
+	// pdf)
+	// form of the phone number.
 	CanonicalForm string `json:"canonicalForm,omitempty"`
 
 	// FormattedType: The read-only type of the phone number translated and
-	// formatted in the viewer's account locale or the the `Accept-Language`
-	// HTTP header locale.
+	// formatted in the
+	// viewer's account locale or the the `Accept-Language` HTTP header
+	// locale.
 	FormattedType string `json:"formattedType,omitempty"`
 
 	// Metadata: Metadata about the phone number.
 	Metadata *FieldMetadata `json:"metadata,omitempty"`
 
 	// Type: The type of the phone number. The type can be custom or
-	// predefined. Possible values include, but are not limited to, the
-	// following: * `home` * `work` * `mobile` * `homeFax` * `workFax` *
-	// `otherFax` * `pager` * `workMobile` * `workPager` * `main` *
-	// `googleVoice` * `other`
+	// predefined.
+	// Possible values include, but are not limited to, the following:
+	//
+	// * `home`
+	// * `work`
+	// * `mobile`
+	// * `homeFax`
+	// * `workFax`
+	// * `otherFax`
+	// * `pager`
+	// * `workMobile`
+	// * `workPager`
+	// * `main`
+	// * `googleVoice`
+	// * `other`
 	Type string `json:"type,omitempty"`
 
 	// Value: The phone number.
@@ -1294,7 +1425,8 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// Photo: A person's photo. A picture shown next to the person's name to
+// Photo: A person's read-only photo. A picture shown next to the
+// person's name to
 // help others recognize the person.
 type Photo struct {
 	// Metadata: Metadata about the photo.
@@ -1329,8 +1461,8 @@
 // Relation: A person's relation to another person.
 type Relation struct {
 	// FormattedType: The type of the relation translated and formatted in
-	// the viewer's account locale or the locale specified in the
-	// Accept-Language HTTP header.
+	// the viewer's account
+	// locale or the locale specified in the Accept-Language HTTP header.
 	FormattedType string `json:"formattedType,omitempty"`
 
 	// Metadata: Metadata about the relation.
@@ -1340,11 +1472,24 @@
 	Person string `json:"person,omitempty"`
 
 	// Type: The person's relation to the other person. The type can be
-	// custom or predefined. Possible values include, but are not limited
-	// to, the following values: * `spouse` * `child` * `mother` * `father`
-	// * `parent` * `brother` * `sister` * `friend` * `relative` *
-	// `domesticPartner` * `manager` * `assistant` * `referredBy` *
-	// `partner`
+	// custom or predefined.
+	// Possible values include, but are not limited to, the following
+	// values:
+	//
+	// * `spouse`
+	// * `child`
+	// * `mother`
+	// * `father`
+	// * `parent`
+	// * `brother`
+	// * `sister`
+	// * `friend`
+	// * `relative`
+	// * `domesticPartner`
+	// * `manager`
+	// * `assistant`
+	// * `referredBy`
+	// * `partner`
 	Type string `json:"type,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "FormattedType") to
@@ -1370,21 +1515,28 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// RelationshipInterest: The kind of relationship the person is looking
-// for.
+// RelationshipInterest: A person's read-only relationship interest .
 type RelationshipInterest struct {
 	// FormattedValue: The value of the relationship interest translated and
-	// formatted in the viewer's account locale or the locale specified in
-	// the Accept-Language HTTP header.
+	// formatted in the
+	// viewer's account locale or the locale specified in the
+	// Accept-Language
+	// HTTP header.
 	FormattedValue string `json:"formattedValue,omitempty"`
 
 	// Metadata: Metadata about the relationship interest.
 	Metadata *FieldMetadata `json:"metadata,omitempty"`
 
 	// Value: The kind of relationship the person is looking for. The value
-	// can be custom or predefined. Possible values include, but are not
-	// limited to, the following values: * `friend` * `date` *
-	// `relationship` * `networking`
+	// can be custom
+	// or predefined. Possible values include, but are not limited to,
+	// the
+	// following values:
+	//
+	// * `friend`
+	// * `date`
+	// * `relationship`
+	// * `networking`
 	Value string `json:"value,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "FormattedValue") to
@@ -1411,21 +1563,30 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// RelationshipStatus: A person's relationship status.
+// RelationshipStatus: A person's read-only relationship status.
 type RelationshipStatus struct {
 	// FormattedValue: The read-only value of the relationship status
-	// translated and formatted in the viewer's account locale or the
-	// `Accept-Language` HTTP header locale.
+	// translated and formatted in
+	// the viewer's account locale or the `Accept-Language` HTTP header
+	// locale.
 	FormattedValue string `json:"formattedValue,omitempty"`
 
 	// Metadata: Metadata about the relationship status.
 	Metadata *FieldMetadata `json:"metadata,omitempty"`
 
 	// Value: The relationship status. The value can be custom or
-	// predefined. Possible values include, but are not limited to, the
-	// following: * `single` * `inARelationship` * `engaged` * `married` *
-	// `itsComplicated` * `openRelationship` * `widowed` *
-	// `inDomesticPartnership` * `inCivilUnion`
+	// predefined.
+	// Possible values include, but are not limited to, the following:
+	//
+	// * `single`
+	// * `inARelationship`
+	// * `engaged`
+	// * `married`
+	// * `itsComplicated`
+	// * `openRelationship`
+	// * `widowed`
+	// * `inDomesticPartnership`
+	// * `inCivilUnion`
 	Value string `json:"value,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "FormattedValue") to
@@ -1454,7 +1615,8 @@
 
 // Residence: A person's past or current residence.
 type Residence struct {
-	// Current: True if the residence is the person's current residence;
+	// Current: True if the residence is the person's current
+	// residence;
 	// false if the residence is a past residence.
 	Current bool `json:"current,omitempty"`
 
@@ -1520,21 +1682,42 @@
 
 // Source: The source of a field.
 type Source struct {
-	// Id: A unique identifier within the source type generated by the
+	// Etag: The [HTTP entity tag](https://en.wikipedia.org/wiki/HTTP_ETag)
+	// of the
+	// source. Used for web cache validation. Only populated
+	// in
+	// person.metadata.sources.
+	Etag string `json:"etag,omitempty"`
+
+	// Id: The unique identifier within the source type generated by the
 	// server.
 	Id string `json:"id,omitempty"`
 
+	// ResourceName: The resource name of the source. Only set if there is a
+	// separate
+	// resource endpoint.
+	ResourceName string `json:"resourceName,omitempty"`
+
 	// Type: The source type.
 	//
 	// Possible values:
-	//   "OTHER"
-	//   "ACCOUNT"
-	//   "PROFILE"
-	//   "DOMAIN_PROFILE"
-	//   "CONTACT"
+	//   "SOURCE_TYPE_UNSPECIFIED" - Unspecified.
+	//   "ACCOUNT" - [Google Account](https://accounts.google.com).
+	//   "PROFILE" - [Google profile](https://profiles.google.com). You can
+	// view the
+	// profile at https://profiles.google.com/<id> where <id> is the
+	// source
+	// id.
+	//   "DOMAIN_PROFILE" - [Google Apps domain
+	// profile](https://admin.google.com).
+	//   "CONTACT" - [Google contact](https://contacts.google.com). You can
+	// view the
+	// contact at https://contact.google.com/<id> where <id> is the
+	// source
+	// id.
 	Type string `json:"type,omitempty"`
 
-	// ForceSendFields is a list of field names (e.g. "Id") to
+	// ForceSendFields is a list of field names (e.g. "Etag") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
 	// non-interface field appearing in ForceSendFields will be sent to the
@@ -1542,7 +1725,7 @@
 	// used to include empty fields in Patch requests.
 	ForceSendFields []string `json:"-"`
 
-	// NullFields is a list of field names (e.g. "Id") to include in API
+	// NullFields is a list of field names (e.g. "Etag") to include in API
 	// requests with the JSON null value. By default, fields with empty
 	// values are omitted from API requests. However, any field with an
 	// empty value appearing in NullFields will be sent to the server as
@@ -1557,7 +1740,7 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
-// Tagline: A brief one-line description of the person.
+// Tagline: A read-only brief one-line description of the person.
 type Tagline struct {
 	// Metadata: Metadata about the tagline.
 	Metadata *FieldMetadata `json:"metadata,omitempty"`
@@ -1591,17 +1774,25 @@
 // Url: A person's associated URLs.
 type Url struct {
 	// FormattedType: The read-only type of the URL translated and formatted
-	// in the viewer's account locale or the `Accept-Language` HTTP header
-	// locale.
+	// in the viewer's
+	// account locale or the `Accept-Language` HTTP header locale.
 	FormattedType string `json:"formattedType,omitempty"`
 
 	// Metadata: Metadata about the URL.
 	Metadata *FieldMetadata `json:"metadata,omitempty"`
 
-	// Type: The type of the URL. The type can be custom or predefined.
-	// Possible values include, but are not limited to, the following: *
-	// `home` * `work` * `blog` * `profile` * `homePage` * `ftp` *
-	// `reservations` * `appInstallPage`: website for a Google+ application.
+	// Type: The type of the URL. The type can be custom or
+	// predefined.
+	// Possible values include, but are not limited to, the following:
+	//
+	// * `home`
+	// * `work`
+	// * `blog`
+	// * `profile`
+	// * `homePage`
+	// * `ftp`
+	// * `reservations`
+	// * `appInstallPage`: website for a Google+ application.
 	// * `other`
 	Type string `json:"type,omitempty"`
 
@@ -1643,7 +1834,8 @@
 }
 
 // Get: Provides information about a person resource for a resource
-// name. Use `people/me` to indicate the authenticated user.
+// name. Use
+// `people/me` to indicate the authenticated user.
 func (r *PeopleService) Get(resourceName string) *PeopleGetCall {
 	c := &PeopleGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.resourceName = resourceName
@@ -1652,9 +1844,15 @@
 
 // RequestMaskIncludeField sets the optional parameter
 // "requestMask.includeField": Comma-separated list of fields to be
-// included in the response. Omitting this field will include all
-// fields. Each path should start with `person.`: for example,
-// `person.names` or `person.photos`.
+// included in the response. Omitting
+// this field will include all fields except for connections.list
+// requests,
+// which have a default mask that includes common fields like metadata,
+// name,
+// photo, and profile url.
+// Each path should start with `person.`: for example, `person.names`
+// or
+// `person.photos`.
 func (c *PeopleGetCall) RequestMaskIncludeField(requestMaskIncludeField string) *PeopleGetCall {
 	c.urlParams_.Set("requestMask.includeField", requestMaskIncludeField)
 	return c
@@ -1701,6 +1899,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1754,7 +1953,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Provides information about a person resource for a resource name. Use `people/me` to indicate the authenticated user.",
+	//   "description": "Provides information about a person resource for a resource name. Use\n`people/me` to indicate the authenticated user.",
+	//   "flatPath": "v1/people/{peopleId}",
 	//   "httpMethod": "GET",
 	//   "id": "people.people.get",
 	//   "parameterOrder": [
@@ -1762,14 +1962,15 @@
 	//   ],
 	//   "parameters": {
 	//     "requestMask.includeField": {
-	//       "description": "Comma-separated list of fields to be included in the response. Omitting this field will include all fields. Each path should start with `person.`: for example, `person.names` or `person.photos`.",
+	//       "description": "Comma-separated list of fields to be included in the response. Omitting\nthis field will include all fields except for connections.list requests,\nwhich have a default mask that includes common fields like metadata, name,\nphoto, and profile url.\nEach path should start with `person.`: for example, `person.names` or\n`person.photos`.",
+	//       "format": "google-fieldmask",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "resourceName": {
-	//       "description": "The resource name of the person to provide information about. - To get information about the authenticated user, specify `people/me`. - To get information about any user, specify the resource name that identifies the user, such as the resource names returned by [`people.connections.list`](/people/api/rest/v1/people.connections/list).",
+	//       "description": "The resource name of the person to provide information about.\n\n- To get information about the authenticated user, specify `people/me`.\n- To get information about any user, specify the resource name that\n  identifies the user, such as the resource names returned by\n  [`people.connections.list`](/people/api/rest/v1/people.connections/list).",
 	//       "location": "path",
-	//       "pattern": "^people/[^/]*$",
+	//       "pattern": "^people/[^/]+$",
 	//       "required": true,
 	//       "type": "string"
 	//     }
@@ -1804,8 +2005,10 @@
 }
 
 // GetBatchGet: Provides information about a list of specific people by
-// specifying a list of requested resource names. Use `people/me` to
-// indicate the authenticated user.
+// specifying a list
+// of requested resource names. Use `people/me` to indicate the
+// authenticated
+// user.
 func (r *PeopleService) GetBatchGet() *PeopleGetBatchGetCall {
 	c := &PeopleGetBatchGetCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	return c
@@ -1813,19 +2016,28 @@
 
 // RequestMaskIncludeField sets the optional parameter
 // "requestMask.includeField": Comma-separated list of fields to be
-// included in the response. Omitting this field will include all
-// fields. Each path should start with `person.`: for example,
-// `person.names` or `person.photos`.
+// included in the response. Omitting
+// this field will include all fields except for connections.list
+// requests,
+// which have a default mask that includes common fields like metadata,
+// name,
+// photo, and profile url.
+// Each path should start with `person.`: for example, `person.names`
+// or
+// `person.photos`.
 func (c *PeopleGetBatchGetCall) RequestMaskIncludeField(requestMaskIncludeField string) *PeopleGetBatchGetCall {
 	c.urlParams_.Set("requestMask.includeField", requestMaskIncludeField)
 	return c
 }
 
 // ResourceNames sets the optional parameter "resourceNames": The
-// resource name, such as one returned by
-// [`people.connections.list`](/people/api/rest/v1/people.connections/lis
-// t), of one of the people to provide information about. You can
-// include this parameter up to 50 times in one request.
+// resource name, such as one returned
+// by
+// [`people.connections.list`](/people/api/rest/v1/people.connections/
+// list),
+// of one of the people to provide information about. You can include
+// this
+// parameter up to 50 times in one request.
 func (c *PeopleGetBatchGetCall) ResourceNames(resourceNames ...string) *PeopleGetBatchGetCall {
 	c.urlParams_.SetMulti("resourceNames", append([]string{}, resourceNames...))
 	return c
@@ -1872,6 +2084,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1922,17 +2135,20 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Provides information about a list of specific people by specifying a list of requested resource names. Use `people/me` to indicate the authenticated user.",
+	//   "description": "Provides information about a list of specific people by specifying a list\nof requested resource names. Use `people/me` to indicate the authenticated\nuser.",
+	//   "flatPath": "v1/people:batchGet",
 	//   "httpMethod": "GET",
 	//   "id": "people.people.getBatchGet",
+	//   "parameterOrder": [],
 	//   "parameters": {
 	//     "requestMask.includeField": {
-	//       "description": "Comma-separated list of fields to be included in the response. Omitting this field will include all fields. Each path should start with `person.`: for example, `person.names` or `person.photos`.",
+	//       "description": "Comma-separated list of fields to be included in the response. Omitting\nthis field will include all fields except for connections.list requests,\nwhich have a default mask that includes common fields like metadata, name,\nphoto, and profile url.\nEach path should start with `person.`: for example, `person.names` or\n`person.photos`.",
+	//       "format": "google-fieldmask",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
 	//     "resourceNames": {
-	//       "description": "The resource name, such as one returned by [`people.connections.list`](/people/api/rest/v1/people.connections/list), of one of the people to provide information about. You can include this parameter up to 50 times in one request.",
+	//       "description": "The resource name, such as one returned by\n[`people.connections.list`](/people/api/rest/v1/people.connections/list),\nof one of the people to provide information about. You can include this\nparameter up to 50 times in one request.",
 	//       "location": "query",
 	//       "repeated": true,
 	//       "type": "string"
@@ -1957,11 +2173,10 @@
 
 }
 
-// method id "people.people.connections.list":
+// method id "people.people.me.connections.list":
 
-type PeopleConnectionsListCall struct {
+type PeopleMeConnectionsListCall struct {
 	s            *Service
-	resourceName string
 	urlParams_   gensupport.URLParams
 	ifNoneMatch_ string
 	ctx_         context.Context
@@ -1969,55 +2184,63 @@
 }
 
 // List: Provides a list of the authenticated user's contacts merged
-// with any linked profiles.
-func (r *PeopleConnectionsService) List(resourceName string) *PeopleConnectionsListCall {
-	c := &PeopleConnectionsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
-	c.resourceName = resourceName
+// with any
+// linked profiles.
+func (r *PeopleMeConnectionsService) List() *PeopleMeConnectionsListCall {
+	c := &PeopleMeConnectionsListCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	return c
 }
 
 // PageSize sets the optional parameter "pageSize": The number of
-// connections to include in the response. Valid values are between 1
-// and 500, inclusive. Defaults to 100.
-func (c *PeopleConnectionsListCall) PageSize(pageSize int64) *PeopleConnectionsListCall {
+// connections to include in the response. Valid values are
+// between 1 and 500, inclusive. Defaults to 100.
+func (c *PeopleMeConnectionsListCall) PageSize(pageSize int64) *PeopleMeConnectionsListCall {
 	c.urlParams_.Set("pageSize", fmt.Sprint(pageSize))
 	return c
 }
 
 // PageToken sets the optional parameter "pageToken": The token of the
 // page to be returned.
-func (c *PeopleConnectionsListCall) PageToken(pageToken string) *PeopleConnectionsListCall {
+func (c *PeopleMeConnectionsListCall) PageToken(pageToken string) *PeopleMeConnectionsListCall {
 	c.urlParams_.Set("pageToken", pageToken)
 	return c
 }
 
 // RequestMaskIncludeField sets the optional parameter
 // "requestMask.includeField": Comma-separated list of fields to be
-// included in the response. Omitting this field will include all
-// fields. Each path should start with `person.`: for example,
-// `person.names` or `person.photos`.
-func (c *PeopleConnectionsListCall) RequestMaskIncludeField(requestMaskIncludeField string) *PeopleConnectionsListCall {
+// included in the response. Omitting
+// this field will include all fields except for connections.list
+// requests,
+// which have a default mask that includes common fields like metadata,
+// name,
+// photo, and profile url.
+// Each path should start with `person.`: for example, `person.names`
+// or
+// `person.photos`.
+func (c *PeopleMeConnectionsListCall) RequestMaskIncludeField(requestMaskIncludeField string) *PeopleMeConnectionsListCall {
 	c.urlParams_.Set("requestMask.includeField", requestMaskIncludeField)
 	return c
 }
 
 // SortOrder sets the optional parameter "sortOrder": The order in which
-// the connections should be sorted. Defaults to
+// the connections should be sorted. Defaults
+// to
 // `LAST_MODIFIED_ASCENDING`.
 //
 // Possible values:
 //   "LAST_MODIFIED_ASCENDING"
 //   "FIRST_NAME_ASCENDING"
 //   "LAST_NAME_ASCENDING"
-func (c *PeopleConnectionsListCall) SortOrder(sortOrder string) *PeopleConnectionsListCall {
+func (c *PeopleMeConnectionsListCall) SortOrder(sortOrder string) *PeopleMeConnectionsListCall {
 	c.urlParams_.Set("sortOrder", sortOrder)
 	return c
 }
 
 // SyncToken sets the optional parameter "syncToken": A sync token,
-// returned by a previous call to `people.connections.list`. Only
-// resources changed since the sync token was created are returned.
-func (c *PeopleConnectionsListCall) SyncToken(syncToken string) *PeopleConnectionsListCall {
+// returned by a previous call to `people.connections.list`.
+// Only resources changed since the sync token was created will be
+// returned.
+func (c *PeopleMeConnectionsListCall) SyncToken(syncToken string) *PeopleMeConnectionsListCall {
 	c.urlParams_.Set("syncToken", syncToken)
 	return c
 }
@@ -2025,7 +2248,7 @@
 // Fields allows partial responses to be retrieved. See
 // https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
 // for more information.
-func (c *PeopleConnectionsListCall) Fields(s ...googleapi.Field) *PeopleConnectionsListCall {
+func (c *PeopleMeConnectionsListCall) Fields(s ...googleapi.Field) *PeopleMeConnectionsListCall {
 	c.urlParams_.Set("fields", googleapi.CombineFields(s))
 	return c
 }
@@ -2035,7 +2258,7 @@
 // getting updates only after the object has changed since the last
 // request. Use googleapi.IsNotModified to check whether the response
 // error from Do is the result of In-None-Match.
-func (c *PeopleConnectionsListCall) IfNoneMatch(entityTag string) *PeopleConnectionsListCall {
+func (c *PeopleMeConnectionsListCall) IfNoneMatch(entityTag string) *PeopleMeConnectionsListCall {
 	c.ifNoneMatch_ = entityTag
 	return c
 }
@@ -2043,49 +2266,47 @@
 // Context sets the context to be used in this call's Do method. Any
 // pending HTTP request will be aborted if the provided context is
 // canceled.
-func (c *PeopleConnectionsListCall) Context(ctx context.Context) *PeopleConnectionsListCall {
+func (c *PeopleMeConnectionsListCall) Context(ctx context.Context) *PeopleMeConnectionsListCall {
 	c.ctx_ = ctx
 	return c
 }
 
 // Header returns an http.Header that can be modified by the caller to
 // add HTTP headers to the request.
-func (c *PeopleConnectionsListCall) Header() http.Header {
+func (c *PeopleMeConnectionsListCall) Header() http.Header {
 	if c.header_ == nil {
 		c.header_ = make(http.Header)
 	}
 	return c.header_
 }
 
-func (c *PeopleConnectionsListCall) doRequest(alt string) (*http.Response, error) {
+func (c *PeopleMeConnectionsListCall) doRequest(alt string) (*http.Response, error) {
 	reqHeaders := make(http.Header)
 	for k, v := range c.header_ {
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
-	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+resourceName}/connections")
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/people/me/connections")
 	urls += "?" + c.urlParams_.Encode()
 	req, _ := http.NewRequest("GET", urls, body)
 	req.Header = reqHeaders
-	googleapi.Expand(req.URL, map[string]string{
-		"resourceName": c.resourceName,
-	})
 	return gensupport.SendRequest(c.ctx_, c.s.client, req)
 }
 
-// Do executes the "people.people.connections.list" call.
+// Do executes the "people.people.me.connections.list" call.
 // Exactly one of *ListConnectionsResponse or error will be non-nil. Any
 // non-2xx status code is an error. Response headers are in either
 // *ListConnectionsResponse.ServerResponse.Header or (if a response was
 // returned at all) in error.(*googleapi.Error).Header. Use
 // googleapi.IsNotModified to check whether the returned error was
 // because http.StatusNotModified was returned.
-func (c *PeopleConnectionsListCall) Do(opts ...googleapi.CallOption) (*ListConnectionsResponse, error) {
+func (c *PeopleMeConnectionsListCall) Do(opts ...googleapi.CallOption) (*ListConnectionsResponse, error) {
 	gensupport.SetOptions(c.urlParams_, opts...)
 	res, err := c.doRequest("json")
 	if res != nil && res.StatusCode == http.StatusNotModified {
@@ -2116,15 +2337,14 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Provides a list of the authenticated user's contacts merged with any linked profiles.",
+	//   "description": "Provides a list of the authenticated user's contacts merged with any\nlinked profiles.",
+	//   "flatPath": "v1/people/me/connections",
 	//   "httpMethod": "GET",
-	//   "id": "people.people.connections.list",
-	//   "parameterOrder": [
-	//     "resourceName"
-	//   ],
+	//   "id": "people.people.me.connections.list",
+	//   "parameterOrder": [],
 	//   "parameters": {
 	//     "pageSize": {
-	//       "description": "The number of connections to include in the response. Valid values are between 1 and 500, inclusive. Defaults to 100.",
+	//       "description": "The number of connections to include in the response. Valid values are\nbetween 1 and 500, inclusive. Defaults to 100.",
 	//       "format": "int32",
 	//       "location": "query",
 	//       "type": "integer"
@@ -2135,19 +2355,13 @@
 	//       "type": "string"
 	//     },
 	//     "requestMask.includeField": {
-	//       "description": "Comma-separated list of fields to be included in the response. Omitting this field will include all fields. Each path should start with `person.`: for example, `person.names` or `person.photos`.",
+	//       "description": "Comma-separated list of fields to be included in the response. Omitting\nthis field will include all fields except for connections.list requests,\nwhich have a default mask that includes common fields like metadata, name,\nphoto, and profile url.\nEach path should start with `person.`: for example, `person.names` or\n`person.photos`.",
+	//       "format": "google-fieldmask",
 	//       "location": "query",
 	//       "type": "string"
 	//     },
-	//     "resourceName": {
-	//       "description": "The resource name to return connections for. Only `people/me` is valid.",
-	//       "location": "path",
-	//       "pattern": "^people/[^/]*$",
-	//       "required": true,
-	//       "type": "string"
-	//     },
 	//     "sortOrder": {
-	//       "description": "The order in which the connections should be sorted. Defaults to `LAST_MODIFIED_ASCENDING`.",
+	//       "description": "The order in which the connections should be sorted. Defaults to\n`LAST_MODIFIED_ASCENDING`.",
 	//       "enum": [
 	//         "LAST_MODIFIED_ASCENDING",
 	//         "FIRST_NAME_ASCENDING",
@@ -2157,12 +2371,12 @@
 	//       "type": "string"
 	//     },
 	//     "syncToken": {
-	//       "description": "A sync token, returned by a previous call to `people.connections.list`. Only resources changed since the sync token was created are returned.",
+	//       "description": "A sync token, returned by a previous call to `people.connections.list`.\nOnly resources changed since the sync token was created will be returned.",
 	//       "location": "query",
 	//       "type": "string"
 	//     }
 	//   },
-	//   "path": "v1/{+resourceName}/connections",
+	//   "path": "v1/people/me/connections",
 	//   "response": {
 	//     "$ref": "ListConnectionsResponse"
 	//   },
@@ -2177,7 +2391,7 @@
 // Pages invokes f for each page of results.
 // A non-nil error returned from f will halt the iteration.
 // The provided context supersedes any context provided to the Context method.
-func (c *PeopleConnectionsListCall) Pages(ctx context.Context, f func(*ListConnectionsResponse) error) error {
+func (c *PeopleMeConnectionsListCall) Pages(ctx context.Context, f func(*ListConnectionsResponse) error) error {
 	c.ctx_ = ctx
 	defer c.PageToken(c.urlParams_.Get("pageToken")) // reset paging to original point
 	for {
diff --git a/playmoviespartner/v1/playmoviespartner-gen.go b/playmoviespartner/v1/playmoviespartner-gen.go
index 198d74a..c7ee383 100644
--- a/playmoviespartner/v1/playmoviespartner-gen.go
+++ b/playmoviespartner/v1/playmoviespartner-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Avails = NewAccountsAvailsService(s)
@@ -803,6 +808,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1018,6 +1024,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1231,6 +1238,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1443,6 +1451,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1729,6 +1738,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1950,6 +1960,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/plus/v1/plus-gen.go b/plus/v1/plus-gen.go
index 2240e83..89f427a 100644
--- a/plus/v1/plus-gen.go
+++ b/plus/v1/plus-gen.go
@@ -72,9 +72,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Activities *ActivitiesService
 
@@ -90,6 +91,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewActivitiesService(s *Service) *ActivitiesService {
 	rs := &ActivitiesService{s: s}
 	return rs
@@ -2282,6 +2287,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2441,6 +2447,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2667,6 +2674,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2857,6 +2865,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3024,6 +3033,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3213,6 +3223,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3384,6 +3395,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3607,6 +3619,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3822,6 +3835,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/plusdomains/v1/plusdomains-gen.go b/plusdomains/v1/plusdomains-gen.go
index 74cc39a..63e8a0e 100644
--- a/plusdomains/v1/plusdomains-gen.go
+++ b/plusdomains/v1/plusdomains-gen.go
@@ -95,9 +95,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Activities *ActivitiesService
 
@@ -119,6 +120,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewActivitiesService(s *Service) *ActivitiesService {
 	rs := &ActivitiesService{s: s}
 	return rs
@@ -2823,6 +2828,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2962,6 +2968,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.activity)
 	if err != nil {
@@ -3132,6 +3139,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3338,6 +3346,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3516,6 +3525,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "circles/{circleId}/people")
@@ -3663,6 +3673,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3792,6 +3803,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.circle)
 	if err != nil {
@@ -3954,6 +3966,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4120,6 +4133,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.circle)
 	if err != nil {
@@ -4252,6 +4266,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "circles/{circleId}")
@@ -4362,6 +4377,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "circles/{circleId}/people")
@@ -4472,6 +4488,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.circle)
 	if err != nil {
@@ -4615,6 +4632,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4744,6 +4762,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.comment)
 	if err != nil {
@@ -4916,6 +4935,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5152,6 +5172,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.media)
 	if err != nil {
@@ -5374,6 +5395,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5546,6 +5568,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5768,6 +5791,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5977,6 +6001,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/prediction/v1.2/prediction-gen.go b/prediction/v1.2/prediction-gen.go
index 5bdc138..9ae3c2c 100644
--- a/prediction/v1.2/prediction-gen.go
+++ b/prediction/v1.2/prediction-gen.go
@@ -71,9 +71,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Hostedmodels *HostedmodelsService
 
@@ -87,6 +88,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewHostedmodelsService(s *Service) *HostedmodelsService {
 	rs := &HostedmodelsService{s: s}
 	return rs
@@ -419,6 +424,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.input)
 	if err != nil {
@@ -552,6 +558,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.input)
 	if err != nil {
@@ -683,6 +690,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "training/{data}")
@@ -789,6 +797,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -922,6 +931,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.training)
 	if err != nil {
@@ -1051,6 +1061,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.update)
 	if err != nil {
diff --git a/prediction/v1.3/prediction-gen.go b/prediction/v1.3/prediction-gen.go
index 519821d..c865faf 100644
--- a/prediction/v1.3/prediction-gen.go
+++ b/prediction/v1.3/prediction-gen.go
@@ -71,9 +71,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Hostedmodels *HostedmodelsService
 
@@ -87,6 +88,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewHostedmodelsService(s *Service) *HostedmodelsService {
 	rs := &HostedmodelsService{s: s}
 	return rs
@@ -479,6 +484,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.input)
 	if err != nil {
@@ -610,6 +616,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "training/{data}")
@@ -716,6 +723,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -842,6 +850,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.training)
 	if err != nil {
@@ -964,6 +973,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.input)
 	if err != nil {
@@ -1097,6 +1107,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.update)
 	if err != nil {
diff --git a/prediction/v1.4/prediction-gen.go b/prediction/v1.4/prediction-gen.go
index 3829c72..8033ca3 100644
--- a/prediction/v1.4/prediction-gen.go
+++ b/prediction/v1.4/prediction-gen.go
@@ -71,9 +71,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Hostedmodels *HostedmodelsService
 
@@ -87,6 +88,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewHostedmodelsService(s *Service) *HostedmodelsService {
 	rs := &HostedmodelsService{s: s}
 	return rs
@@ -525,6 +530,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.input)
 	if err != nil {
@@ -656,6 +662,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "trainedmodels/{id}")
@@ -762,6 +769,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -888,6 +896,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.training)
 	if err != nil {
@@ -1010,6 +1019,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.input)
 	if err != nil {
@@ -1143,6 +1153,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.update)
 	if err != nil {
diff --git a/prediction/v1.5/prediction-gen.go b/prediction/v1.5/prediction-gen.go
index 55cef8a..0d4fc8d 100644
--- a/prediction/v1.5/prediction-gen.go
+++ b/prediction/v1.5/prediction-gen.go
@@ -71,9 +71,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Hostedmodels *HostedmodelsService
 
@@ -87,6 +88,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewHostedmodelsService(s *Service) *HostedmodelsService {
 	rs := &HostedmodelsService{s: s}
 	return rs
@@ -978,6 +983,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.input)
 	if err != nil {
@@ -1121,6 +1127,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1247,6 +1254,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "trainedmodels/{id}")
@@ -1353,6 +1361,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1479,6 +1488,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.training)
 	if err != nil {
@@ -1621,6 +1631,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1770,6 +1781,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.input)
 	if err != nil {
@@ -1903,6 +1915,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.update)
 	if err != nil {
diff --git a/prediction/v1.6/prediction-gen.go b/prediction/v1.6/prediction-gen.go
index 51b0a18..5f535e3 100644
--- a/prediction/v1.6/prediction-gen.go
+++ b/prediction/v1.6/prediction-gen.go
@@ -74,9 +74,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Hostedmodels *HostedmodelsService
 
@@ -90,6 +91,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewHostedmodelsService(s *Service) *HostedmodelsService {
 	rs := &HostedmodelsService{s: s}
 	return rs
@@ -948,6 +953,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.input)
 	if err != nil {
@@ -1102,6 +1108,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1239,6 +1246,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/trainedmodels/{id}")
@@ -1356,6 +1364,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1493,6 +1502,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.insert)
 	if err != nil {
@@ -1652,6 +1662,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1816,6 +1827,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.input)
 	if err != nil {
@@ -1960,6 +1972,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.update)
 	if err != nil {
diff --git a/proximitybeacon/v1beta1/proximitybeacon-gen.go b/proximitybeacon/v1beta1/proximitybeacon-gen.go
index 1f9e5ee..efaddd0 100644
--- a/proximitybeacon/v1beta1/proximitybeacon-gen.go
+++ b/proximitybeacon/v1beta1/proximitybeacon-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Beaconinfo *BeaconinfoService
 
@@ -84,6 +85,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewBeaconinfoService(s *Service) *BeaconinfoService {
 	rs := &BeaconinfoService{s: s}
 	return rs
@@ -1149,6 +1154,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.getinfoforobservedbeaconsrequest)
 	if err != nil {
@@ -1280,6 +1286,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+beaconName}:activate")
@@ -1425,6 +1432,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+beaconName}:deactivate")
@@ -1569,6 +1577,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+beaconName}:decommission")
@@ -1727,6 +1736,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1948,6 +1958,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2117,6 +2128,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.beacon)
 	if err != nil {
@@ -2262,6 +2274,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.beacon)
 	if err != nil {
@@ -2427,6 +2440,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+beaconName}/attachments:batchDelete")
@@ -2582,6 +2596,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.beaconattachment)
 	if err != nil {
@@ -2734,6 +2749,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+attachmentName}")
@@ -2902,6 +2918,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3093,6 +3110,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3289,6 +3307,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3420,6 +3439,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.namespace)
 	if err != nil {
@@ -3572,6 +3592,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/pubsub/v1/pubsub-api.json b/pubsub/v1/pubsub-api.json
index 08fb767..ca1f7d3 100644
--- a/pubsub/v1/pubsub-api.json
+++ b/pubsub/v1/pubsub-api.json
@@ -1,998 +1,854 @@
 {
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "pubsub",
+  "batchPath": "batch",
+  "revision": "20170124",
   "id": "pubsub:v1",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        },
-        "https://www.googleapis.com/auth/pubsub": {
-          "description": "View and manage Pub/Sub topics and subscriptions"
-        }
-      }
-    }
-  },
-  "description": "Provides reliable, many-to-many, asynchronous messaging between applications.\n",
-  "protocol": "rest",
+  "documentationLink": "https://cloud.google.com/pubsub/docs",
   "title": "Google Cloud Pub/Sub API",
+  "ownerName": "Google",
+  "discoveryVersion": "v1",
   "resources": {
     "projects": {
       "resources": {
         "subscriptions": {
           "methods": {
-            "modifyPushConfig": {
-              "id": "pubsub.projects.subscriptions.modifyPushConfig",
+            "get": {
+              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}",
+              "id": "pubsub.projects.subscriptions.get",
+              "path": "v1/{+subscription}",
+              "description": "Gets the configuration details of a subscription.",
+              "httpMethod": "GET",
               "response": {
-                "$ref": "Empty"
+                "$ref": "Subscription"
               },
               "parameterOrder": [
                 "subscription"
               ],
-              "description": "Modifies the `PushConfig` for a specified subscription.\n\nThis may be used to change a push subscription to a pull one (signified by\nan empty `PushConfig`) or vice versa, or change the endpoint URL and other\nattributes of a push subscription. Messages will accumulate for delivery\ncontinuously through the call regardless of changes to the `PushConfig`.",
-              "request": {
-                "$ref": "ModifyPushConfigRequest"
-              },
-              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyPushConfig",
-              "httpMethod": "POST",
-              "parameters": {
-                "subscription": {
-                  "description": "The name of the subscription.\nFormat is `projects/{project}/subscriptions/{sub}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+subscription}:modifyPushConfig",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "parameters": {
+                "subscription": {
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "location": "path",
+                  "description": "The name of the subscription to get.\nFormat is `projects/{project}/subscriptions/{sub}`.",
+                  "required": true,
+                  "type": "string"
+                }
+              }
             },
-            "getIamPolicy": {
-              "id": "pubsub.projects.subscriptions.getIamPolicy",
+            "testIamPermissions": {
+              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:testIamPermissions",
+              "path": "v1/{+resource}:testIamPermissions",
+              "id": "pubsub.projects.subscriptions.testIamPermissions",
+              "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
+              "request": {
+                "$ref": "TestIamPermissionsRequest"
+              },
               "response": {
-                "$ref": "Policy"
+                "$ref": "TestIamPermissionsResponse"
               },
               "parameterOrder": [
                 "resource"
               ],
-              "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.",
-              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:getIamPolicy",
-              "httpMethod": "GET",
-              "parameters": {
-                "resource": {
-                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+resource}:getIamPolicy",
+              "httpMethod": "POST",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "parameters": {
+                "resource": {
+                  "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "location": "path"
+                }
+              }
+            },
+            "modifyPushConfig": {
+              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyPushConfig",
+              "id": "pubsub.projects.subscriptions.modifyPushConfig",
+              "path": "v1/{+subscription}:modifyPushConfig",
+              "description": "Modifies the `PushConfig` for a specified subscription.\n\nThis may be used to change a push subscription to a pull one (signified by\nan empty `PushConfig`) or vice versa, or change the endpoint URL and other\nattributes of a push subscription. Messages will accumulate for delivery\ncontinuously through the call regardless of changes to the `PushConfig`.",
+              "request": {
+                "$ref": "ModifyPushConfigRequest"
+              },
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "subscription"
+              ],
+              "response": {
+                "$ref": "Empty"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "parameters": {
+                "subscription": {
+                  "description": "The name of the subscription.\nFormat is `projects/{project}/subscriptions/{sub}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "location": "path"
+                }
+              }
+            },
+            "delete": {
+              "httpMethod": "DELETE",
+              "parameterOrder": [
+                "subscription"
+              ],
+              "response": {
+                "$ref": "Empty"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "parameters": {
+                "subscription": {
+                  "description": "The subscription to delete.\nFormat is `projects/{project}/subscriptions/{sub}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}",
+              "id": "pubsub.projects.subscriptions.delete",
+              "path": "v1/{+subscription}",
+              "description": "Deletes an existing subscription. All messages retained in the subscription\nare immediately dropped. Calls to `Pull` after deletion will return\n`NOT_FOUND`. After a subscription is deleted, a new one may be created with\nthe same name, but the new one has no association with the old\nsubscription or its topic unless the same topic is specified."
             },
             "pull": {
-              "id": "pubsub.projects.subscriptions.pull",
+              "request": {
+                "$ref": "PullRequest"
+              },
+              "description": "Pulls messages from the server. Returns an empty list if there are no\nmessages available in the backlog. The server may return `UNAVAILABLE` if\nthere are too many concurrent pull requests pending for the given\nsubscription.",
               "response": {
                 "$ref": "PullResponse"
               },
               "parameterOrder": [
                 "subscription"
               ],
-              "description": "Pulls messages from the server. Returns an empty list if there are no\nmessages available in the backlog. The server may return `UNAVAILABLE` if\nthere are too many concurrent pull requests pending for the given\nsubscription.",
-              "request": {
-                "$ref": "PullRequest"
-              },
-              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:pull",
               "httpMethod": "POST",
               "parameters": {
                 "subscription": {
+                  "location": "path",
                   "description": "The subscription from which messages should be pulled.\nFormat is `projects/{project}/subscriptions/{sub}`.",
                   "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$"
                 }
               },
-              "path": "v1/{+subscription}:pull",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:pull",
+              "path": "v1/{+subscription}:pull",
+              "id": "pubsub.projects.subscriptions.pull"
             },
             "list": {
-              "id": "pubsub.projects.subscriptions.list",
+              "description": "Lists matching subscriptions.",
+              "httpMethod": "GET",
               "response": {
                 "$ref": "ListSubscriptionsResponse"
               },
               "parameterOrder": [
                 "project"
               ],
-              "description": "Lists matching subscriptions.",
-              "flatPath": "v1/projects/{projectsId}/subscriptions",
-              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
               "parameters": {
-                "pageSize": {
-                  "description": "Maximum number of subscriptions to return.",
-                  "location": "query",
-                  "type": "integer",
-                  "format": "int32"
-                },
-                "project": {
-                  "description": "The name of the cloud project that subscriptions belong to.\nFormat is `projects/{project}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                },
                 "pageToken": {
                   "description": "The value returned by the last `ListSubscriptionsResponse`; indicates that\nthis is a continuation of a prior `ListSubscriptions` call, and that the\nsystem should return the next page of data.",
-                  "location": "query",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+project}/subscriptions",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "get": {
-              "id": "pubsub.projects.subscriptions.get",
-              "response": {
-                "$ref": "Subscription"
-              },
-              "parameterOrder": [
-                "subscription"
-              ],
-              "description": "Gets the configuration details of a subscription.",
-              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}",
-              "httpMethod": "GET",
-              "parameters": {
-                "subscription": {
-                  "description": "The name of the subscription to get.\nFormat is `projects/{project}/subscriptions/{sub}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
+                  "description": "Maximum number of subscriptions to return.",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                },
+                "project": {
+                  "pattern": "^projects/[^/]+$",
                   "location": "path",
+                  "description": "The name of the cloud project that subscriptions belong to.\nFormat is `projects/{project}`.",
+                  "required": true,
                   "type": "string"
                 }
               },
-              "path": "v1/{+subscription}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
+              "flatPath": "v1/projects/{projectsId}/subscriptions",
+              "id": "pubsub.projects.subscriptions.list",
+              "path": "v1/{+project}/subscriptions"
             },
             "create": {
+              "parameters": {
+                "name": {
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "location": "path",
+                  "description": "The name of the subscription. It must have the format\n`\"projects/{project}/subscriptions/{subscription}\"`. `{subscription}` must\nstart with a letter, and contain only letters (`[A-Za-z]`), numbers\n(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),\nplus (`+`) or percent signs (`%`). It must be between 3 and 255 characters\nin length, and it must not start with `\"goog\"`.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}",
+              "path": "v1/{+name}",
               "id": "pubsub.projects.subscriptions.create",
+              "request": {
+                "$ref": "Subscription"
+              },
+              "description": "Creates a subscription to a given topic.\nIf the subscription already exists, returns `ALREADY_EXISTS`.\nIf the corresponding topic doesn't exist, returns `NOT_FOUND`.\n\nIf the name is not provided in the request, the server will assign a random\nname for this subscription on the same project as the topic, conforming\nto the\n[resource name format](https://cloud.google.com/pubsub/docs/overview#names).\nThe generated name is populated in the returned Subscription object.\nNote that for REST API requests, you must specify a name in the request.",
               "response": {
                 "$ref": "Subscription"
               },
               "parameterOrder": [
                 "name"
               ],
-              "description": "Creates a subscription to a given topic.\nIf the subscription already exists, returns `ALREADY_EXISTS`.\nIf the corresponding topic doesn't exist, returns `NOT_FOUND`.\n\nIf the name is not provided in the request, the server will assign a random\nname for this subscription on the same project as the topic, conforming\nto the\n[resource name format](https://cloud.google.com/pubsub/docs/overview#names).\nThe generated name is populated in the returned Subscription object.\nNote that for REST API requests, you must specify a name in the request.",
-              "request": {
-                "$ref": "Subscription"
-              },
-              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}",
-              "httpMethod": "PUT",
-              "parameters": {
-                "name": {
-                  "description": "The name of the subscription. It must have the format\n`\"projects/{project}/subscriptions/{subscription}\"`. `{subscription}` must\nstart with a letter, and contain only letters (`[A-Za-z]`), numbers\n(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),\nplus (`+`) or percent signs (`%`). It must be between 3 and 255 characters\nin length, and it must not start with `\"goog\"`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+name}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "modifyAckDeadline": {
-              "id": "pubsub.projects.subscriptions.modifyAckDeadline",
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "subscription"
-              ],
-              "description": "Modifies the ack deadline for a specific message. This method is useful\nto indicate that more time is needed to process a message by the\nsubscriber, or to make the message available for redelivery if the\nprocessing was interrupted. Note that this does not modify the\nsubscription-level `ackDeadlineSeconds` used for subsequent messages.",
-              "request": {
-                "$ref": "ModifyAckDeadlineRequest"
-              },
-              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyAckDeadline",
-              "httpMethod": "POST",
-              "parameters": {
-                "subscription": {
-                  "description": "The name of the subscription.\nFormat is `projects/{project}/subscriptions/{sub}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+subscription}:modifyAckDeadline",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
+              "httpMethod": "PUT"
             },
             "setIamPolicy": {
-              "id": "pubsub.projects.subscriptions.setIamPolicy",
+              "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
+              "request": {
+                "$ref": "SetIamPolicyRequest"
+              },
               "response": {
                 "$ref": "Policy"
               },
               "parameterOrder": [
                 "resource"
               ],
-              "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
-              "request": {
-                "$ref": "SetIamPolicyRequest"
-              },
-              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:setIamPolicy",
               "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
               "parameters": {
                 "resource": {
                   "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
                   "required": true,
+                  "type": "string",
                   "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
+                  "location": "path"
                 }
               },
+              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:setIamPolicy",
               "path": "v1/{+resource}:setIamPolicy",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
+              "id": "pubsub.projects.subscriptions.setIamPolicy"
             },
-            "delete": {
-              "id": "pubsub.projects.subscriptions.delete",
+            "acknowledge": {
+              "path": "v1/{+subscription}:acknowledge",
+              "id": "pubsub.projects.subscriptions.acknowledge",
+              "request": {
+                "$ref": "AcknowledgeRequest"
+              },
+              "description": "Acknowledges the messages associated with the `ack_ids` in the\n`AcknowledgeRequest`. The Pub/Sub system can remove the relevant messages\nfrom the subscription.\n\nAcknowledging a message whose ack deadline has expired may succeed,\nbut such a message may be redelivered later. Acknowledging a message more\nthan once will not result in an error.",
               "response": {
                 "$ref": "Empty"
               },
               "parameterOrder": [
                 "subscription"
               ],
-              "description": "Deletes an existing subscription. All messages retained in the subscription\nare immediately dropped. Calls to `Pull` after deletion will return\n`NOT_FOUND`. After a subscription is deleted, a new one may be created with\nthe same name, but the new one has no association with the old\nsubscription or its topic unless the same topic is specified.",
-              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}",
-              "httpMethod": "DELETE",
+              "httpMethod": "POST",
               "parameters": {
                 "subscription": {
-                  "description": "The subscription to delete.\nFormat is `projects/{project}/subscriptions/{sub}`.",
+                  "description": "The subscription whose message is being acknowledged.\nFormat is `projects/{project}/subscriptions/{sub}`.",
                   "required": true,
+                  "type": "string",
                   "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
+                  "location": "path"
                 }
               },
-              "path": "v1/{+subscription}",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:acknowledge"
+            },
+            "modifyAckDeadline": {
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "subscription"
+              ],
+              "httpMethod": "POST",
+              "parameters": {
+                "subscription": {
+                  "description": "The name of the subscription.\nFormat is `projects/{project}/subscriptions/{sub}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyAckDeadline",
+              "path": "v1/{+subscription}:modifyAckDeadline",
+              "id": "pubsub.projects.subscriptions.modifyAckDeadline",
+              "request": {
+                "$ref": "ModifyAckDeadlineRequest"
+              },
+              "description": "Modifies the ack deadline for a specific message. This method is useful\nto indicate that more time is needed to process a message by the\nsubscriber, or to make the message available for redelivery if the\nprocessing was interrupted. Note that this does not modify the\nsubscription-level `ackDeadlineSeconds` used for subsequent messages."
+            },
+            "getIamPolicy": {
+              "parameters": {
+                "resource": {
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "location": "path",
+                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:getIamPolicy",
+              "id": "pubsub.projects.subscriptions.getIamPolicy",
+              "path": "v1/{+resource}:getIamPolicy",
+              "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "resource"
+              ],
+              "response": {
+                "$ref": "Policy"
+              }
+            }
+          }
+        },
+        "snapshots": {
+          "methods": {
+            "setIamPolicy": {
+              "flatPath": "v1/projects/{projectsId}/snapshots/{snapshotsId}:setIamPolicy",
+              "id": "pubsub.projects.snapshots.setIamPolicy",
+              "path": "v1/{+resource}:setIamPolicy",
+              "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
+              "request": {
+                "$ref": "SetIamPolicyRequest"
+              },
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "resource"
+              ],
+              "response": {
+                "$ref": "Policy"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "parameters": {
+                "resource": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/snapshots/[^/]+$",
+                  "location": "path",
+                  "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`."
+                }
+              }
             },
             "testIamPermissions": {
-              "id": "pubsub.projects.subscriptions.testIamPermissions",
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "resource"
+              ],
+              "response": {
+                "$ref": "TestIamPermissionsResponse"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "parameters": {
+                "resource": {
+                  "location": "path",
+                  "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/snapshots/[^/]+$"
+                }
+              },
+              "flatPath": "v1/projects/{projectsId}/snapshots/{snapshotsId}:testIamPermissions",
+              "id": "pubsub.projects.snapshots.testIamPermissions",
+              "path": "v1/{+resource}:testIamPermissions",
+              "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
+              "request": {
+                "$ref": "TestIamPermissionsRequest"
+              }
+            },
+            "getIamPolicy": {
+              "response": {
+                "$ref": "Policy"
+              },
+              "parameterOrder": [
+                "resource"
+              ],
+              "httpMethod": "GET",
+              "parameters": {
+                "resource": {
+                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/snapshots/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "flatPath": "v1/projects/{projectsId}/snapshots/{snapshotsId}:getIamPolicy",
+              "path": "v1/{+resource}:getIamPolicy",
+              "id": "pubsub.projects.snapshots.getIamPolicy",
+              "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset."
+            }
+          }
+        },
+        "topics": {
+          "methods": {
+            "testIamPermissions": {
               "response": {
                 "$ref": "TestIamPermissionsResponse"
               },
               "parameterOrder": [
                 "resource"
               ],
-              "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
-              "request": {
-                "$ref": "TestIamPermissionsRequest"
-              },
-              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:testIamPermissions",
               "httpMethod": "POST",
               "parameters": {
                 "resource": {
+                  "pattern": "^projects/[^/]+/topics/[^/]+$",
+                  "location": "path",
                   "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
                   "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
                   "type": "string"
                 }
               },
-              "path": "v1/{+resource}:testIamPermissions",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:testIamPermissions",
+              "path": "v1/{+resource}:testIamPermissions",
+              "id": "pubsub.projects.topics.testIamPermissions",
+              "request": {
+                "$ref": "TestIamPermissionsRequest"
+              },
+              "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error."
             },
-            "acknowledge": {
-              "id": "pubsub.projects.subscriptions.acknowledge",
+            "delete": {
+              "path": "v1/{+topic}",
+              "id": "pubsub.projects.topics.delete",
+              "description": "Deletes the topic with the given name. Returns `NOT_FOUND` if the topic\ndoes not exist. After a topic is deleted, a new topic may be created with\nthe same name; this is an entirely new topic with none of the old\nconfiguration or subscriptions. Existing subscriptions to this topic are\nnot deleted, but their `topic` field is set to `_deleted-topic_`.",
               "response": {
                 "$ref": "Empty"
               },
               "parameterOrder": [
-                "subscription"
-              ],
-              "description": "Acknowledges the messages associated with the `ack_ids` in the\n`AcknowledgeRequest`. The Pub/Sub system can remove the relevant messages\nfrom the subscription.\n\nAcknowledging a message whose ack deadline has expired may succeed,\nbut such a message may be redelivered later. Acknowledging a message more\nthan once will not result in an error.",
-              "request": {
-                "$ref": "AcknowledgeRequest"
-              },
-              "flatPath": "v1/projects/{projectsId}/subscriptions/{subscriptionsId}:acknowledge",
-              "httpMethod": "POST",
-              "parameters": {
-                "subscription": {
-                  "description": "The subscription whose message is being acknowledged.\nFormat is `projects/{project}/subscriptions/{sub}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+subscription}:acknowledge",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            }
-          }
-        },
-        "topics": {
-          "resources": {
-            "subscriptions": {
-              "methods": {
-                "list": {
-                  "id": "pubsub.projects.topics.subscriptions.list",
-                  "response": {
-                    "$ref": "ListTopicSubscriptionsResponse"
-                  },
-                  "parameterOrder": [
-                    "topic"
-                  ],
-                  "description": "Lists the name of the subscriptions for this topic.",
-                  "flatPath": "v1/projects/{projectsId}/topics/{topicsId}/subscriptions",
-                  "httpMethod": "GET",
-                  "parameters": {
-                    "topic": {
-                      "description": "The name of the topic that subscriptions are attached to.\nFormat is `projects/{project}/topics/{topic}`.",
-                      "required": true,
-                      "pattern": "^projects/[^/]+/topics/[^/]+$",
-                      "location": "path",
-                      "type": "string"
-                    },
-                    "pageSize": {
-                      "description": "Maximum number of subscription names to return.",
-                      "location": "query",
-                      "type": "integer",
-                      "format": "int32"
-                    },
-                    "pageToken": {
-                      "description": "The value returned by the last `ListTopicSubscriptionsResponse`; indicates\nthat this is a continuation of a prior `ListTopicSubscriptions` call, and\nthat the system should return the next page of data.",
-                      "location": "query",
-                      "type": "string"
-                    }
-                  },
-                  "path": "v1/{+topic}/subscriptions",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/pubsub"
-                  ]
-                }
-              }
-            }
-          },
-          "methods": {
-            "getIamPolicy": {
-              "id": "pubsub.projects.topics.getIamPolicy",
-              "response": {
-                "$ref": "Policy"
-              },
-              "parameterOrder": [
-                "resource"
-              ],
-              "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.",
-              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:getIamPolicy",
-              "httpMethod": "GET",
-              "parameters": {
-                "resource": {
-                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/topics/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+resource}:getIamPolicy",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "publish": {
-              "id": "pubsub.projects.topics.publish",
-              "response": {
-                "$ref": "PublishResponse"
-              },
-              "parameterOrder": [
                 "topic"
               ],
-              "description": "Adds one or more messages to the topic. Returns `NOT_FOUND` if the topic\ndoes not exist. The message payload must not be empty; it must contain\n either a non-empty data field, or at least one attribute.",
-              "request": {
-                "$ref": "PublishRequest"
-              },
-              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:publish",
-              "httpMethod": "POST",
+              "httpMethod": "DELETE",
               "parameters": {
                 "topic": {
-                  "description": "The messages in the request will be published on this topic.\nFormat is `projects/{project}/topics/{topic}`.",
-                  "required": true,
                   "pattern": "^projects/[^/]+/topics/[^/]+$",
                   "location": "path",
+                  "description": "Name of the topic to delete.\nFormat is `projects/{project}/topics/{topic}`.",
+                  "required": true,
                   "type": "string"
                 }
               },
-              "path": "v1/{+topic}:publish",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}"
             },
             "list": {
-              "id": "pubsub.projects.topics.list",
+              "httpMethod": "GET",
               "response": {
                 "$ref": "ListTopicsResponse"
               },
               "parameterOrder": [
                 "project"
               ],
-              "description": "Lists matching topics.",
-              "flatPath": "v1/projects/{projectsId}/topics",
-              "httpMethod": "GET",
               "parameters": {
-                "pageSize": {
-                  "description": "Maximum number of topics to return.",
-                  "location": "query",
-                  "type": "integer",
-                  "format": "int32"
-                },
                 "project": {
-                  "description": "The name of the cloud project that topics belong to.\nFormat is `projects/{project}`.",
-                  "required": true,
                   "pattern": "^projects/[^/]+$",
                   "location": "path",
+                  "description": "The name of the cloud project that topics belong to.\nFormat is `projects/{project}`.",
+                  "required": true,
                   "type": "string"
                 },
                 "pageToken": {
                   "description": "The value returned by the last `ListTopicsResponse`; indicates that this is\na continuation of a prior `ListTopics` call, and that the system should\nreturn the next page of data.",
+                  "type": "string",
+                  "location": "query"
+                },
+                "pageSize": {
                   "location": "query",
-                  "type": "string"
+                  "description": "Maximum number of topics to return.",
+                  "format": "int32",
+                  "type": "integer"
                 }
               },
-              "path": "v1/{+project}/topics",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "get": {
-              "id": "pubsub.projects.topics.get",
-              "response": {
-                "$ref": "Topic"
-              },
-              "parameterOrder": [
-                "topic"
               ],
-              "description": "Gets the configuration of a topic.",
-              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}",
-              "httpMethod": "GET",
-              "parameters": {
-                "topic": {
-                  "description": "The name of the topic to get.\nFormat is `projects/{project}/topics/{topic}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/topics/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+topic}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
+              "flatPath": "v1/projects/{projectsId}/topics",
+              "id": "pubsub.projects.topics.list",
+              "path": "v1/{+project}/topics",
+              "description": "Lists matching topics."
             },
             "create": {
-              "id": "pubsub.projects.topics.create",
               "response": {
                 "$ref": "Topic"
               },
               "parameterOrder": [
                 "name"
               ],
-              "description": "Creates the given topic with the given name.",
-              "request": {
-                "$ref": "Topic"
-              },
-              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}",
               "httpMethod": "PUT",
               "parameters": {
                 "name": {
-                  "description": "The name of the topic. It must have the format\n`\"projects/{project}/topics/{topic}\"`. `{topic}` must start with a letter,\nand contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),\nunderscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent\nsigns (`%`). It must be between 3 and 255 characters in length, and it\nmust not start with `\"goog\"`.",
                   "required": true,
+                  "type": "string",
                   "pattern": "^projects/[^/]+/topics/[^/]+$",
                   "location": "path",
-                  "type": "string"
+                  "description": "The name of the topic. It must have the format\n`\"projects/{project}/topics/{topic}\"`. `{topic}` must start with a letter,\nand contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),\nunderscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent\nsigns (`%`). It must be between 3 and 255 characters in length, and it\nmust not start with `\"goog\"`."
                 }
               },
-              "path": "v1/{+name}",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}",
+              "path": "v1/{+name}",
+              "id": "pubsub.projects.topics.create",
+              "request": {
+                "$ref": "Topic"
+              },
+              "description": "Creates the given topic with the given name."
             },
             "setIamPolicy": {
+              "path": "v1/{+resource}:setIamPolicy",
               "id": "pubsub.projects.topics.setIamPolicy",
+              "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
+              "request": {
+                "$ref": "SetIamPolicyRequest"
+              },
               "response": {
                 "$ref": "Policy"
               },
               "parameterOrder": [
                 "resource"
               ],
-              "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
-              "request": {
-                "$ref": "SetIamPolicyRequest"
-              },
-              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:setIamPolicy",
               "httpMethod": "POST",
-              "parameters": {
-                "resource": {
-                  "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/topics/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+resource}:setIamPolicy",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "delete": {
-              "id": "pubsub.projects.topics.delete",
-              "response": {
-                "$ref": "Empty"
+              ],
+              "parameters": {
+                "resource": {
+                  "pattern": "^projects/[^/]+/topics/[^/]+$",
+                  "location": "path",
+                  "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string"
+                }
               },
+              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:setIamPolicy"
+            },
+            "getIamPolicy": {
+              "path": "v1/{+resource}:getIamPolicy",
+              "id": "pubsub.projects.topics.getIamPolicy",
+              "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.",
+              "response": {
+                "$ref": "Policy"
+              },
+              "parameterOrder": [
+                "resource"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "parameters": {
+                "resource": {
+                  "pattern": "^projects/[^/]+/topics/[^/]+$",
+                  "location": "path",
+                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:getIamPolicy"
+            },
+            "get": {
+              "httpMethod": "GET",
               "parameterOrder": [
                 "topic"
               ],
-              "description": "Deletes the topic with the given name. Returns `NOT_FOUND` if the topic\ndoes not exist. After a topic is deleted, a new topic may be created with\nthe same name; this is an entirely new topic with none of the old\nconfiguration or subscriptions. Existing subscriptions to this topic are\nnot deleted, but their `topic` field is set to `_deleted-topic_`.",
-              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}",
-              "httpMethod": "DELETE",
+              "response": {
+                "$ref": "Topic"
+              },
               "parameters": {
                 "topic": {
-                  "description": "Name of the topic to delete.\nFormat is `projects/{project}/topics/{topic}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/topics/[^/]+$",
                   "location": "path",
-                  "type": "string"
+                  "description": "The name of the topic to get.\nFormat is `projects/{project}/topics/{topic}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/topics/[^/]+$"
                 }
               },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}",
+              "id": "pubsub.projects.topics.get",
               "path": "v1/{+topic}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
+              "description": "Gets the configuration of a topic."
             },
-            "testIamPermissions": {
-              "id": "pubsub.projects.topics.testIamPermissions",
-              "response": {
-                "$ref": "TestIamPermissionsResponse"
-              },
-              "parameterOrder": [
-                "resource"
-              ],
-              "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
+            "publish": {
               "request": {
-                "$ref": "TestIamPermissionsRequest"
+                "$ref": "PublishRequest"
               },
-              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:testIamPermissions",
+              "description": "Adds one or more messages to the topic. Returns `NOT_FOUND` if the topic\ndoes not exist. The message payload must not be empty; it must contain\n either a non-empty data field, or at least one attribute.",
               "httpMethod": "POST",
+              "parameterOrder": [
+                "topic"
+              ],
+              "response": {
+                "$ref": "PublishResponse"
+              },
               "parameters": {
-                "resource": {
-                  "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
+                "topic": {
                   "pattern": "^projects/[^/]+/topics/[^/]+$",
                   "location": "path",
+                  "description": "The messages in the request will be published on this topic.\nFormat is `projects/{project}/topics/{topic}`.",
+                  "required": true,
                   "type": "string"
                 }
               },
-              "path": "v1/{+resource}:testIamPermissions",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "flatPath": "v1/projects/{projectsId}/topics/{topicsId}:publish",
+              "id": "pubsub.projects.topics.publish",
+              "path": "v1/{+topic}:publish"
             }
-          }
-        },
-        "snapshots": {
-          "methods": {
-            "testIamPermissions": {
-              "id": "pubsub.projects.snapshots.testIamPermissions",
-              "response": {
-                "$ref": "TestIamPermissionsResponse"
-              },
-              "parameterOrder": [
-                "resource"
-              ],
-              "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
-              "request": {
-                "$ref": "TestIamPermissionsRequest"
-              },
-              "flatPath": "v1/projects/{projectsId}/snapshots/{snapshotsId}:testIamPermissions",
-              "httpMethod": "POST",
-              "parameters": {
-                "resource": {
-                  "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/snapshots/[^/]+$",
-                  "location": "path",
-                  "type": "string"
+          },
+          "resources": {
+            "subscriptions": {
+              "methods": {
+                "list": {
+                  "response": {
+                    "$ref": "ListTopicSubscriptionsResponse"
+                  },
+                  "parameterOrder": [
+                    "topic"
+                  ],
+                  "httpMethod": "GET",
+                  "parameters": {
+                    "topic": {
+                      "pattern": "^projects/[^/]+/topics/[^/]+$",
+                      "location": "path",
+                      "description": "The name of the topic that subscriptions are attached to.\nFormat is `projects/{project}/topics/{topic}`.",
+                      "required": true,
+                      "type": "string"
+                    },
+                    "pageToken": {
+                      "location": "query",
+                      "description": "The value returned by the last `ListTopicSubscriptionsResponse`; indicates\nthat this is a continuation of a prior `ListTopicSubscriptions` call, and\nthat the system should return the next page of data.",
+                      "type": "string"
+                    },
+                    "pageSize": {
+                      "location": "query",
+                      "description": "Maximum number of subscription names to return.",
+                      "format": "int32",
+                      "type": "integer"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/pubsub"
+                  ],
+                  "flatPath": "v1/projects/{projectsId}/topics/{topicsId}/subscriptions",
+                  "path": "v1/{+topic}/subscriptions",
+                  "id": "pubsub.projects.topics.subscriptions.list",
+                  "description": "Lists the name of the subscriptions for this topic."
                 }
-              },
-              "path": "v1/{+resource}:testIamPermissions",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "setIamPolicy": {
-              "id": "pubsub.projects.snapshots.setIamPolicy",
-              "response": {
-                "$ref": "Policy"
-              },
-              "parameterOrder": [
-                "resource"
-              ],
-              "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
-              "request": {
-                "$ref": "SetIamPolicyRequest"
-              },
-              "flatPath": "v1/projects/{projectsId}/snapshots/{snapshotsId}:setIamPolicy",
-              "httpMethod": "POST",
-              "parameters": {
-                "resource": {
-                  "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/snapshots/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+resource}:setIamPolicy",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "getIamPolicy": {
-              "id": "pubsub.projects.snapshots.getIamPolicy",
-              "response": {
-                "$ref": "Policy"
-              },
-              "parameterOrder": [
-                "resource"
-              ],
-              "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.",
-              "flatPath": "v1/projects/{projectsId}/snapshots/{snapshotsId}:getIamPolicy",
-              "httpMethod": "GET",
-              "parameters": {
-                "resource": {
-                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/snapshots/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/{+resource}:getIamPolicy",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
+              }
             }
           }
         }
       }
     }
   },
+  "parameters": {
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ]
+    },
+    "alt": {
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "key": {
+      "type": "string",
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token."
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
+    },
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
+    },
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    }
+  },
   "schemas": {
-    "Topic": {
-      "description": "A topic resource.",
-      "type": "object",
-      "properties": {
-        "name": {
-          "description": "The name of the topic. It must have the format\n`\"projects/{project}/topics/{topic}\"`. `{topic}` must start with a letter,\nand contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),\nunderscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent\nsigns (`%`). It must be between 3 and 255 characters in length, and it\nmust not start with `\"goog\"`.",
-          "type": "string"
-        }
-      },
-      "id": "Topic"
-    },
-    "SetIamPolicyRequest": {
-      "description": "Request message for `SetIamPolicy` method.",
-      "type": "object",
-      "properties": {
-        "policy": {
-          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them.",
-          "$ref": "Policy"
-        }
-      },
-      "id": "SetIamPolicyRequest"
-    },
-    "ReceivedMessage": {
-      "description": "A message and its corresponding acknowledgment ID.",
-      "type": "object",
-      "properties": {
-        "ackId": {
-          "description": "This ID can be used to acknowledge the received message.",
-          "type": "string"
-        },
-        "message": {
-          "description": "The message.",
-          "$ref": "PubsubMessage"
-        }
-      },
-      "id": "ReceivedMessage"
-    },
-    "PublishRequest": {
-      "description": "Request for the Publish method.",
-      "type": "object",
-      "properties": {
-        "messages": {
-          "description": "The messages to publish.",
-          "type": "array",
-          "items": {
-            "$ref": "PubsubMessage"
-          }
-        }
-      },
-      "id": "PublishRequest"
-    },
-    "TestIamPermissionsResponse": {
-      "description": "Response message for `TestIamPermissions` method.",
-      "type": "object",
-      "properties": {
-        "permissions": {
-          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "TestIamPermissionsResponse"
-    },
-    "PublishResponse": {
-      "description": "Response for the `Publish` method.",
-      "type": "object",
-      "properties": {
-        "messageIds": {
-          "description": "The server-assigned ID of each published message, in the same order as\nthe messages in the request. IDs are guaranteed to be unique within\nthe topic.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "PublishResponse"
-    },
-    "ListSubscriptionsResponse": {
-      "description": "Response for the `ListSubscriptions` method.",
-      "type": "object",
-      "properties": {
-        "subscriptions": {
-          "description": "The subscriptions that match the request.",
-          "type": "array",
-          "items": {
-            "$ref": "Subscription"
-          }
-        },
-        "nextPageToken": {
-          "description": "If not empty, indicates that there may be more subscriptions that match\nthe request; this value should be passed in a new\n`ListSubscriptionsRequest` to get more subscriptions.",
-          "type": "string"
-        }
-      },
-      "id": "ListSubscriptionsResponse"
-    },
-    "Policy": {
-      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
-      "type": "object",
-      "properties": {
-        "bindings": {
-          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
-          "type": "array",
-          "items": {
-            "$ref": "Binding"
-          }
-        },
-        "etag": {
-          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
-          "type": "string",
-          "format": "byte"
-        },
-        "version": {
-          "description": "Version of the `Policy`. The default version is 0.",
-          "type": "integer",
-          "format": "int32"
-        }
-      },
-      "id": "Policy"
-    },
-    "ListTopicSubscriptionsResponse": {
-      "description": "Response for the `ListTopicSubscriptions` method.",
-      "type": "object",
-      "properties": {
-        "subscriptions": {
-          "description": "The names of the subscriptions that match the request.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "nextPageToken": {
-          "description": "If not empty, indicates that there may be more subscriptions that match\nthe request; this value should be passed in a new\n`ListTopicSubscriptionsRequest` to get more subscriptions.",
-          "type": "string"
-        }
-      },
-      "id": "ListTopicSubscriptionsResponse"
-    },
-    "Subscription": {
-      "description": "A subscription resource.",
-      "type": "object",
-      "properties": {
-        "pushConfig": {
-          "description": "If push delivery is used with this subscription, this field is\nused to configure it. An empty `pushConfig` signifies that the subscriber\nwill pull and ack messages using API methods.",
-          "$ref": "PushConfig"
-        },
-        "topic": {
-          "description": "The name of the topic from which this subscription is receiving messages.\nFormat is `projects/{project}/topics/{topic}`.\nThe value of this field will be `_deleted-topic_` if the topic has been\ndeleted.",
-          "type": "string"
-        },
-        "ackDeadlineSeconds": {
-          "description": "This value is the maximum time after a subscriber receives a message\nbefore the subscriber should acknowledge the message. After message\ndelivery but before the ack deadline expires and before the message is\nacknowledged, it is an outstanding message and will not be delivered\nagain during that time (on a best-effort basis).\n\nFor pull subscriptions, this value is used as the initial value for the ack\ndeadline. To override this value for a given message, call\n`ModifyAckDeadline` with the corresponding `ack_id` if using\npull.\nThe minimum custom deadline you can specify is 10 seconds.\nThe maximum custom deadline you can specify is 600 seconds (10 minutes).\nIf this parameter is 0, a default value of 10 seconds is used.\n\nFor push delivery, this value is also used to set the request timeout for\nthe call to the push endpoint.\n\nIf the subscriber never acknowledges the message, the Pub/Sub\nsystem will eventually redeliver the message.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "name": {
-          "description": "The name of the subscription. It must have the format\n`\"projects/{project}/subscriptions/{subscription}\"`. `{subscription}` must\nstart with a letter, and contain only letters (`[A-Za-z]`), numbers\n(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),\nplus (`+`) or percent signs (`%`). It must be between 3 and 255 characters\nin length, and it must not start with `\"goog\"`.",
-          "type": "string"
-        }
-      },
-      "id": "Subscription"
-    },
-    "ModifyAckDeadlineRequest": {
-      "description": "Request for the ModifyAckDeadline method.",
-      "type": "object",
-      "properties": {
-        "ackDeadlineSeconds": {
-          "description": "The new ack deadline with respect to the time this request was sent to\nthe Pub/Sub system. For example, if the value is 10, the new\nack deadline will expire 10 seconds after the `ModifyAckDeadline` call\nwas made. Specifying zero may immediately make the message available for\nanother pull request.\nThe minimum deadline you can specify is 0 seconds.\nThe maximum deadline you can specify is 600 seconds (10 minutes).",
-          "type": "integer",
-          "format": "int32"
-        },
-        "ackIds": {
-          "description": "List of acknowledgment IDs.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "ModifyAckDeadlineRequest"
-    },
-    "TestIamPermissionsRequest": {
-      "description": "Request message for `TestIamPermissions` method.",
-      "type": "object",
-      "properties": {
-        "permissions": {
-          "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "TestIamPermissionsRequest"
-    },
-    "PushConfig": {
-      "description": "Configuration for a push delivery endpoint.",
-      "type": "object",
-      "properties": {
-        "attributes": {
-          "description": "Endpoint configuration attributes.\n\nEvery endpoint has a set of API supported attributes that can be used to\ncontrol different aspects of the message delivery.\n\nThe currently supported attribute is `x-goog-version`, which you can\nuse to change the format of the push message. This attribute\nindicates the version of the data expected by the endpoint. This\ncontrols the shape of the envelope (i.e. its fields and metadata).\nThe endpoint version is based on the version of the Pub/Sub\nAPI.\n\nIf not present during the `CreateSubscription` call, it will default to\nthe version of the API used to make such call. If not present during a\n`ModifyPushConfig` call, its value will not be changed. `GetSubscription`\ncalls will always return a valid version, even if the subscription was\ncreated without this attribute.\n\nThe possible values for this attribute are:\n\n* `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.\n* `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "pushEndpoint": {
-          "description": "A URL locating the endpoint to which messages should be pushed.\nFor example, a Webhook endpoint might use \"https://example.com/push\".",
-          "type": "string"
-        }
-      },
-      "id": "PushConfig"
-    },
-    "PullRequest": {
-      "description": "Request for the `Pull` method.",
-      "type": "object",
-      "properties": {
-        "returnImmediately": {
-          "description": "If this field set to true, the system will respond immediately even if\nit there are no messages available to return in the `Pull` response.\nOtherwise, the system may wait (for a bounded amount of time) until at\nleast one message is available, rather than returning no messages. The\nclient may cancel the request if it does not wish to wait any longer for\nthe response.",
-          "type": "boolean"
-        },
-        "maxMessages": {
-          "description": "The maximum number of messages returned for this request. The Pub/Sub\nsystem may return fewer than the number specified.",
-          "type": "integer",
-          "format": "int32"
-        }
-      },
-      "id": "PullRequest"
-    },
     "ModifyPushConfigRequest": {
-      "description": "Request for the ModifyPushConfig method.",
       "type": "object",
       "properties": {
         "pushConfig": {
-          "description": "The push configuration for future deliveries.\n\nAn empty `pushConfig` indicates that the Pub/Sub system should\nstop pushing messages from the given subscription and allow\nmessages to be pulled and acknowledged - effectively pausing\nthe subscription if `Pull` is not called.",
-          "$ref": "PushConfig"
+          "$ref": "PushConfig",
+          "description": "The push configuration for future deliveries.\n\nAn empty `pushConfig` indicates that the Pub/Sub system should\nstop pushing messages from the given subscription and allow\nmessages to be pulled and acknowledged - effectively pausing\nthe subscription if `Pull` is not called."
         }
       },
-      "id": "ModifyPushConfigRequest"
-    },
-    "PullResponse": {
-      "description": "Response for the `Pull` method.",
-      "type": "object",
-      "properties": {
-        "receivedMessages": {
-          "description": "Received Pub/Sub messages. The Pub/Sub system will return zero messages if\nthere are no more available in the backlog. The Pub/Sub system may return\nfewer than the `maxMessages` requested even if there are more messages\navailable in the backlog.",
-          "type": "array",
-          "items": {
-            "$ref": "ReceivedMessage"
-          }
-        }
-      },
-      "id": "PullResponse"
+      "id": "ModifyPushConfigRequest",
+      "description": "Request for the ModifyPushConfig method."
     },
     "PubsubMessage": {
       "description": "A message data and its attributes. The message payload must not be empty;\nit must contain either a non-empty data field, or at least one attribute.",
       "type": "object",
       "properties": {
+        "publishTime": {
+          "description": "The time at which the message was published, populated by the server when\nit receives the `Publish` call. It must not be populated by the\npublisher in a `Publish` call.",
+          "format": "google-datetime",
+          "type": "string"
+        },
         "data": {
           "description": "The message payload.",
-          "type": "string",
-          "format": "byte"
+          "format": "byte",
+          "type": "string"
         },
         "attributes": {
           "description": "Optional attributes for this message.",
+          "type": "object",
           "additionalProperties": {
             "type": "string"
-          },
-          "type": "object"
+          }
         },
         "messageId": {
-          "description": "ID of this message, assigned by the server when the message is published.\nGuaranteed to be unique within the topic. This value may be read by a\nsubscriber that receives a `PubsubMessage` via a `Pull` call or a push\ndelivery. It must not be populated by the publisher in a `Publish` call.",
-          "type": "string"
-        },
-        "publishTime": {
-          "description": "The time at which the message was published, populated by the server when\nit receives the `Publish` call. It must not be populated by the\npublisher in a `Publish` call.",
           "type": "string",
-          "format": "google-datetime"
+          "description": "ID of this message, assigned by the server when the message is published.\nGuaranteed to be unique within the topic. This value may be read by a\nsubscriber that receives a `PubsubMessage` via a `Pull` call or a push\ndelivery. It must not be populated by the publisher in a `Publish` call."
         }
       },
       "id": "PubsubMessage"
     },
+    "Binding": {
+      "id": "Binding",
+      "description": "Associates `members` with a `role`.",
+      "type": "object",
+      "properties": {
+        "members": {
+          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "role": {
+          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
+          "type": "string"
+        }
+      }
+    },
     "AcknowledgeRequest": {
       "description": "Request for the Acknowledge method.",
       "type": "object",
@@ -1007,152 +863,296 @@
       },
       "id": "AcknowledgeRequest"
     },
-    "Empty": {
-      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
-      "type": "object",
-      "properties": {},
-      "id": "Empty"
-    },
     "ListTopicsResponse": {
       "description": "Response for the `ListTopics` method.",
       "type": "object",
       "properties": {
-        "nextPageToken": {
-          "description": "If not empty, indicates that there may be more topics that match the\nrequest; this value should be passed in a new `ListTopicsRequest`.",
-          "type": "string"
-        },
         "topics": {
-          "description": "The resulting topics.",
           "type": "array",
           "items": {
             "$ref": "Topic"
-          }
+          },
+          "description": "The resulting topics."
+        },
+        "nextPageToken": {
+          "description": "If not empty, indicates that there may be more topics that match the\nrequest; this value should be passed in a new `ListTopicsRequest`.",
+          "type": "string"
         }
       },
       "id": "ListTopicsResponse"
     },
-    "Binding": {
-      "description": "Associates `members` with a `role`.",
-      "type": "object",
+    "Empty": {
+      "properties": {},
+      "id": "Empty",
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
+      "type": "object"
+    },
+    "ListTopicSubscriptionsResponse": {
       "properties": {
-        "members": {
-          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
+        "nextPageToken": {
+          "description": "If not empty, indicates that there may be more subscriptions that match\nthe request; this value should be passed in a new\n`ListTopicSubscriptionsRequest` to get more subscriptions.",
+          "type": "string"
+        },
+        "subscriptions": {
+          "description": "The names of the subscriptions that match the request.",
           "type": "array",
           "items": {
             "type": "string"
           }
+        }
+      },
+      "id": "ListTopicSubscriptionsResponse",
+      "description": "Response for the `ListTopicSubscriptions` method.",
+      "type": "object"
+    },
+    "PullResponse": {
+      "description": "Response for the `Pull` method.",
+      "type": "object",
+      "properties": {
+        "receivedMessages": {
+          "type": "array",
+          "items": {
+            "$ref": "ReceivedMessage"
+          },
+          "description": "Received Pub/Sub messages. The Pub/Sub system will return zero messages if\nthere are no more available in the backlog. The Pub/Sub system may return\nfewer than the `maxMessages` requested even if there are more messages\navailable in the backlog."
+        }
+      },
+      "id": "PullResponse"
+    },
+    "ReceivedMessage": {
+      "type": "object",
+      "properties": {
+        "message": {
+          "description": "The message.",
+          "$ref": "PubsubMessage"
         },
-        "role": {
-          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
+        "ackId": {
+          "description": "This ID can be used to acknowledge the received message.",
           "type": "string"
         }
       },
-      "id": "Binding"
+      "id": "ReceivedMessage",
+      "description": "A message and its corresponding acknowledgment ID."
+    },
+    "PushConfig": {
+      "description": "Configuration for a push delivery endpoint.",
+      "type": "object",
+      "properties": {
+        "pushEndpoint": {
+          "type": "string",
+          "description": "A URL locating the endpoint to which messages should be pushed.\nFor example, a Webhook endpoint might use \"https://example.com/push\"."
+        },
+        "attributes": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Endpoint configuration attributes.\n\nEvery endpoint has a set of API supported attributes that can be used to\ncontrol different aspects of the message delivery.\n\nThe currently supported attribute is `x-goog-version`, which you can\nuse to change the format of the push message. This attribute\nindicates the version of the data expected by the endpoint. This\ncontrols the shape of the envelope (i.e. its fields and metadata).\nThe endpoint version is based on the version of the Pub/Sub\nAPI.\n\nIf not present during the `CreateSubscription` call, it will default to\nthe version of the API used to make such call. If not present during a\n`ModifyPushConfig` call, its value will not be changed. `GetSubscription`\ncalls will always return a valid version, even if the subscription was\ncreated without this attribute.\n\nThe possible values for this attribute are:\n\n* `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.\n* `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.",
+          "type": "object"
+        }
+      },
+      "id": "PushConfig"
+    },
+    "TestIamPermissionsResponse": {
+      "type": "object",
+      "properties": {
+        "permissions": {
+          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "TestIamPermissionsResponse",
+      "description": "Response message for `TestIamPermissions` method."
+    },
+    "PullRequest": {
+      "id": "PullRequest",
+      "description": "Request for the `Pull` method.",
+      "type": "object",
+      "properties": {
+        "maxMessages": {
+          "description": "The maximum number of messages returned for this request. The Pub/Sub\nsystem may return fewer than the number specified.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "returnImmediately": {
+          "description": "If this field set to true, the system will respond immediately even if\nit there are no messages available to return in the `Pull` response.\nOtherwise, the system may wait (for a bounded amount of time) until at\nleast one message is available, rather than returning no messages. The\nclient may cancel the request if it does not wish to wait any longer for\nthe response.",
+          "type": "boolean"
+        }
+      }
+    },
+    "ListSubscriptionsResponse": {
+      "type": "object",
+      "properties": {
+        "nextPageToken": {
+          "type": "string",
+          "description": "If not empty, indicates that there may be more subscriptions that match\nthe request; this value should be passed in a new\n`ListSubscriptionsRequest` to get more subscriptions."
+        },
+        "subscriptions": {
+          "description": "The subscriptions that match the request.",
+          "type": "array",
+          "items": {
+            "$ref": "Subscription"
+          }
+        }
+      },
+      "id": "ListSubscriptionsResponse",
+      "description": "Response for the `ListSubscriptions` method."
+    },
+    "PublishRequest": {
+      "description": "Request for the Publish method.",
+      "type": "object",
+      "properties": {
+        "messages": {
+          "description": "The messages to publish.",
+          "type": "array",
+          "items": {
+            "$ref": "PubsubMessage"
+          }
+        }
+      },
+      "id": "PublishRequest"
+    },
+    "PublishResponse": {
+      "properties": {
+        "messageIds": {
+          "description": "The server-assigned ID of each published message, in the same order as\nthe messages in the request. IDs are guaranteed to be unique within\nthe topic.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "PublishResponse",
+      "description": "Response for the `Publish` method.",
+      "type": "object"
+    },
+    "Subscription": {
+      "properties": {
+        "pushConfig": {
+          "description": "If push delivery is used with this subscription, this field is\nused to configure it. An empty `pushConfig` signifies that the subscriber\nwill pull and ack messages using API methods.",
+          "$ref": "PushConfig"
+        },
+        "ackDeadlineSeconds": {
+          "description": "This value is the maximum time after a subscriber receives a message\nbefore the subscriber should acknowledge the message. After message\ndelivery but before the ack deadline expires and before the message is\nacknowledged, it is an outstanding message and will not be delivered\nagain during that time (on a best-effort basis).\n\nFor pull subscriptions, this value is used as the initial value for the ack\ndeadline. To override this value for a given message, call\n`ModifyAckDeadline` with the corresponding `ack_id` if using\npull.\nThe minimum custom deadline you can specify is 10 seconds.\nThe maximum custom deadline you can specify is 600 seconds (10 minutes).\nIf this parameter is 0, a default value of 10 seconds is used.\n\nFor push delivery, this value is also used to set the request timeout for\nthe call to the push endpoint.\n\nIf the subscriber never acknowledges the message, the Pub/Sub\nsystem will eventually redeliver the message.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "name": {
+          "description": "The name of the subscription. It must have the format\n`\"projects/{project}/subscriptions/{subscription}\"`. `{subscription}` must\nstart with a letter, and contain only letters (`[A-Za-z]`), numbers\n(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),\nplus (`+`) or percent signs (`%`). It must be between 3 and 255 characters\nin length, and it must not start with `\"goog\"`.",
+          "type": "string"
+        },
+        "topic": {
+          "description": "The name of the topic from which this subscription is receiving messages.\nFormat is `projects/{project}/topics/{topic}`.\nThe value of this field will be `_deleted-topic_` if the topic has been\ndeleted.",
+          "type": "string"
+        }
+      },
+      "id": "Subscription",
+      "description": "A subscription resource.",
+      "type": "object"
+    },
+    "TestIamPermissionsRequest": {
+      "type": "object",
+      "properties": {
+        "permissions": {
+          "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "TestIamPermissionsRequest",
+      "description": "Request message for `TestIamPermissions` method."
+    },
+    "Topic": {
+      "id": "Topic",
+      "description": "A topic resource.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The name of the topic. It must have the format\n`\"projects/{project}/topics/{topic}\"`. `{topic}` must start with a letter,\nand contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),\nunderscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent\nsigns (`%`). It must be between 3 and 255 characters in length, and it\nmust not start with `\"goog\"`.",
+          "type": "string"
+        }
+      }
+    },
+    "Policy": {
+      "properties": {
+        "etag": {
+          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
+          "format": "byte",
+          "type": "string"
+        },
+        "version": {
+          "type": "integer",
+          "description": "Version of the `Policy`. The default version is 0.",
+          "format": "int32"
+        },
+        "bindings": {
+          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
+          "type": "array",
+          "items": {
+            "$ref": "Binding"
+          }
+        }
+      },
+      "id": "Policy",
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
+      "type": "object"
+    },
+    "ModifyAckDeadlineRequest": {
+      "description": "Request for the ModifyAckDeadline method.",
+      "type": "object",
+      "properties": {
+        "ackDeadlineSeconds": {
+          "description": "The new ack deadline with respect to the time this request was sent to\nthe Pub/Sub system. For example, if the value is 10, the new\nack deadline will expire 10 seconds after the `ModifyAckDeadline` call\nwas made. Specifying zero may immediately make the message available for\nanother pull request.\nThe minimum deadline you can specify is 0 seconds.\nThe maximum deadline you can specify is 600 seconds (10 minutes).",
+          "format": "int32",
+          "type": "integer"
+        },
+        "ackIds": {
+          "description": "List of acknowledgment IDs.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "ModifyAckDeadlineRequest"
+    },
+    "SetIamPolicyRequest": {
+      "description": "Request message for `SetIamPolicy` method.",
+      "type": "object",
+      "properties": {
+        "policy": {
+          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them.",
+          "$ref": "Policy"
+        }
+      },
+      "id": "SetIamPolicyRequest"
     }
   },
-  "revision": "20170105",
-  "basePath": "",
   "icons": {
-    "x32": "http://www.google.com/images/icons/product/search-32.gif",
-    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
   },
-  "discoveryVersion": "v1",
+  "protocol": "rest",
+  "version": "v1",
   "baseUrl": "https://pubsub.googleapis.com/",
-  "name": "pubsub",
-  "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/pubsub": {
+          "description": "View and manage Pub/Sub topics and subscriptions"
+        },
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
     }
   },
-  "documentationLink": "https://cloud.google.com/pubsub/docs",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
+  "kind": "discovery#restDescription",
+  "description": "Provides reliable, many-to-many, asynchronous messaging between applications.\n",
   "servicePath": "",
-  "ownerName": "Google",
-  "version": "v1",
-  "rootUrl": "https://pubsub.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "rootUrl": "https://pubsub.googleapis.com/"
 }
diff --git a/pubsub/v1/pubsub-gen.go b/pubsub/v1/pubsub-gen.go
index c2cb87c..6b2d923 100644
--- a/pubsub/v1/pubsub-gen.go
+++ b/pubsub/v1/pubsub-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Snapshots = NewProjectsSnapshotsService(s)
@@ -1120,6 +1125,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1253,6 +1259,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -1393,6 +1400,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -1539,6 +1547,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.acknowledgerequest)
 	if err != nil {
@@ -1689,6 +1698,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscription)
 	if err != nil {
@@ -1831,6 +1841,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+subscription}")
@@ -1968,6 +1979,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2111,6 +2123,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2268,6 +2281,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2439,6 +2453,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.modifyackdeadlinerequest)
 	if err != nil {
@@ -2585,6 +2600,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.modifypushconfigrequest)
 	if err != nil {
@@ -2727,6 +2743,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pullrequest)
 	if err != nil {
@@ -2865,6 +2882,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -3005,6 +3023,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -3141,6 +3160,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.topic)
 	if err != nil {
@@ -3283,6 +3303,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+topic}")
@@ -3420,6 +3441,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3563,6 +3585,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3720,6 +3743,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3887,6 +3911,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.publishrequest)
 	if err != nil {
@@ -4025,6 +4050,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -4165,6 +4191,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -4327,6 +4354,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/pubsub/v1beta1a/pubsub-api.json b/pubsub/v1beta1a/pubsub-api.json
index 8bf3b7e..9092e40 100644
--- a/pubsub/v1beta1a/pubsub-api.json
+++ b/pubsub/v1beta1a/pubsub-api.json
@@ -1,515 +1,446 @@
 {
-  "id": "pubsub:v1beta1a",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
+  "discoveryVersion": "v1",
+  "ownerName": "Google",
+  "resources": {
+    "topics": {
+      "methods": {
+        "publish": {
+          "description": "Adds a message to the topic.  Returns NOT_FOUND if the topic does not\nexist.",
+          "request": {
+            "$ref": "PublishRequest"
+          },
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "Empty"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ],
+          "parameters": {},
+          "flatPath": "v1beta1a/topics/publish",
+          "id": "pubsub.topics.publish",
+          "path": "v1beta1a/topics/publish"
         },
-        "https://www.googleapis.com/auth/pubsub": {
-          "description": "View and manage Pub/Sub topics and subscriptions"
+        "delete": {
+          "flatPath": "v1beta1a/topics/{topicsId}",
+          "path": "v1beta1a/topics/{+topic}",
+          "id": "pubsub.topics.delete",
+          "description": "Deletes the topic with the given name. Returns NOT_FOUND if the topic does\nnot exist. After a topic is deleted, a new topic may be created with the\nsame name.",
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameterOrder": [
+            "topic"
+          ],
+          "httpMethod": "DELETE",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ],
+          "parameters": {
+            "topic": {
+              "description": "Name of the topic to delete.",
+              "required": true,
+              "type": "string",
+              "pattern": "^.+$",
+              "location": "path"
+            }
+          }
+        },
+        "publishBatch": {
+          "flatPath": "v1beta1a/topics/publishBatch",
+          "path": "v1beta1a/topics/publishBatch",
+          "id": "pubsub.topics.publishBatch",
+          "request": {
+            "$ref": "PublishBatchRequest"
+          },
+          "description": "Adds one or more messages to the topic. Returns NOT_FOUND if the topic does\nnot exist.",
+          "response": {
+            "$ref": "PublishBatchResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ]
+        },
+        "list": {
+          "response": {
+            "$ref": "ListTopicsResponse"
+          },
+          "parameterOrder": [],
+          "httpMethod": "GET",
+          "parameters": {
+            "pageToken": {
+              "description": "The value obtained in the last \u003ccode\u003eListTopicsResponse\u003c/code\u003e\nfor continuation.",
+              "type": "string",
+              "location": "query"
+            },
+            "query": {
+              "location": "query",
+              "description": "A valid label query expression.",
+              "type": "string"
+            },
+            "maxResults": {
+              "description": "Maximum number of topics to return.",
+              "format": "int32",
+              "type": "integer",
+              "location": "query"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ],
+          "flatPath": "v1beta1a/topics",
+          "path": "v1beta1a/topics",
+          "id": "pubsub.topics.list",
+          "description": "Lists matching topics."
+        },
+        "create": {
+          "description": "Creates the given topic with the given name.",
+          "request": {
+            "$ref": "Topic"
+          },
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "Topic"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ],
+          "parameters": {},
+          "flatPath": "v1beta1a/topics",
+          "id": "pubsub.topics.create",
+          "path": "v1beta1a/topics"
+        },
+        "get": {
+          "description": "Gets the configuration of a topic. Since the topic only has the name\nattribute, this method is only useful to check the existence of a topic.\nIf other attributes are added in the future, they will be returned here.",
+          "response": {
+            "$ref": "Topic"
+          },
+          "parameterOrder": [
+            "topic"
+          ],
+          "httpMethod": "GET",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ],
+          "parameters": {
+            "topic": {
+              "location": "path",
+              "description": "The name of the topic to get.",
+              "required": true,
+              "type": "string",
+              "pattern": "^.+$"
+            }
+          },
+          "flatPath": "v1beta1a/topics/{topicsId}",
+          "path": "v1beta1a/topics/{+topic}",
+          "id": "pubsub.topics.get"
         }
       }
-    }
-  },
-  "description": "Provides reliable, many-to-many, asynchronous messaging between applications.\n",
-  "protocol": "rest",
-  "title": "Google Cloud Pub/Sub API",
-  "resources": {
+    },
     "subscriptions": {
       "methods": {
-        "modifyPushConfig": {
-          "id": "pubsub.subscriptions.modifyPushConfig",
+        "modifyAckDeadline": {
           "response": {
             "$ref": "Empty"
           },
           "parameterOrder": [],
-          "description": "Modifies the \u003ccode\u003ePushConfig\u003c/code\u003e for a specified subscription.\nThis method can be used to suspend the flow of messages to an endpoint\nby clearing the \u003ccode\u003ePushConfig\u003c/code\u003e field in the request. Messages\nwill be accumulated for delivery even if no push configuration is\ndefined or while the configuration is modified.",
+          "httpMethod": "POST",
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ],
+          "flatPath": "v1beta1a/subscriptions/modifyAckDeadline",
+          "path": "v1beta1a/subscriptions/modifyAckDeadline",
+          "id": "pubsub.subscriptions.modifyAckDeadline",
+          "request": {
+            "$ref": "ModifyAckDeadlineRequest"
+          },
+          "description": "Modifies the Ack deadline for a message received from a pull request."
+        },
+        "acknowledge": {
+          "flatPath": "v1beta1a/subscriptions/acknowledge",
+          "path": "v1beta1a/subscriptions/acknowledge",
+          "id": "pubsub.subscriptions.acknowledge",
+          "description": "Acknowledges a particular received message: the Pub/Sub system can remove\nthe given message from the subscription. Acknowledging a message whose\nAck deadline has expired may succeed, but the message could have been\nalready redelivered. Acknowledging a message more than once will not\nresult in an error. This is only used for messages received via pull.",
+          "request": {
+            "$ref": "AcknowledgeRequest"
+          },
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameterOrder": [],
+          "httpMethod": "POST",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ],
+          "parameters": {}
+        },
+        "pullBatch": {
+          "id": "pubsub.subscriptions.pullBatch",
+          "path": "v1beta1a/subscriptions/pullBatch",
+          "request": {
+            "$ref": "PullBatchRequest"
+          },
+          "description": "Pulls messages from the server. Returns an empty list if there are no\nmessages available in the backlog. The system is free to return UNAVAILABLE\nif there are too many pull requests outstanding for the given subscription.",
+          "httpMethod": "POST",
+          "parameterOrder": [],
+          "response": {
+            "$ref": "PullBatchResponse"
+          },
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ],
+          "flatPath": "v1beta1a/subscriptions/pullBatch"
+        },
+        "get": {
+          "flatPath": "v1beta1a/subscriptions/{subscriptionsId}",
+          "id": "pubsub.subscriptions.get",
+          "path": "v1beta1a/subscriptions/{+subscription}",
+          "description": "Gets the configuration details of a subscription.",
+          "httpMethod": "GET",
+          "parameterOrder": [
+            "subscription"
+          ],
+          "response": {
+            "$ref": "Subscription"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ],
+          "parameters": {
+            "subscription": {
+              "required": true,
+              "type": "string",
+              "pattern": "^.+$",
+              "location": "path",
+              "description": "The name of the subscription to get."
+            }
+          }
+        },
+        "modifyPushConfig": {
+          "flatPath": "v1beta1a/subscriptions/modifyPushConfig",
+          "path": "v1beta1a/subscriptions/modifyPushConfig",
+          "id": "pubsub.subscriptions.modifyPushConfig",
           "request": {
             "$ref": "ModifyPushConfigRequest"
           },
-          "flatPath": "v1beta1a/subscriptions/modifyPushConfig",
+          "description": "Modifies the \u003ccode\u003ePushConfig\u003c/code\u003e for a specified subscription.\nThis method can be used to suspend the flow of messages to an endpoint\nby clearing the \u003ccode\u003ePushConfig\u003c/code\u003e field in the request. Messages\nwill be accumulated for delivery even if no push configuration is\ndefined or while the configuration is modified.",
+          "response": {
+            "$ref": "Empty"
+          },
+          "parameterOrder": [],
           "httpMethod": "POST",
           "parameters": {},
-          "path": "v1beta1a/subscriptions/modifyPushConfig",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/pubsub"
           ]
         },
         "pull": {
-          "id": "pubsub.subscriptions.pull",
+          "httpMethod": "POST",
+          "parameterOrder": [],
           "response": {
             "$ref": "PullResponse"
           },
-          "parameterOrder": [],
-          "description": "Pulls a single message from the server.\nIf return_immediately is true, and no messages are available in the\nsubscription, this method returns FAILED_PRECONDITION. The system is free\nto return an UNAVAILABLE error if no messages are available in a\nreasonable amount of time (to reduce system load).",
+          "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ],
+          "flatPath": "v1beta1a/subscriptions/pull",
+          "id": "pubsub.subscriptions.pull",
+          "path": "v1beta1a/subscriptions/pull",
           "request": {
             "$ref": "PullRequest"
           },
-          "flatPath": "v1beta1a/subscriptions/pull",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1beta1a/subscriptions/pull",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
-        },
-        "list": {
-          "id": "pubsub.subscriptions.list",
-          "response": {
-            "$ref": "ListSubscriptionsResponse"
-          },
-          "parameterOrder": [],
-          "description": "Lists matching subscriptions.",
-          "flatPath": "v1beta1a/subscriptions",
-          "httpMethod": "GET",
-          "parameters": {
-            "query": {
-              "description": "A valid label query expression.",
-              "location": "query",
-              "type": "string"
-            },
-            "maxResults": {
-              "description": "Maximum number of subscriptions to return.",
-              "location": "query",
-              "type": "integer",
-              "format": "int32"
-            },
-            "pageToken": {
-              "description": "The value obtained in the last \u003ccode\u003eListSubscriptionsResponse\u003c/code\u003e\nfor continuation.",
-              "location": "query",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1a/subscriptions",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
-        },
-        "get": {
-          "id": "pubsub.subscriptions.get",
-          "response": {
-            "$ref": "Subscription"
-          },
-          "parameterOrder": [
-            "subscription"
-          ],
-          "description": "Gets the configuration details of a subscription.",
-          "flatPath": "v1beta1a/subscriptions/{subscriptionsId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "subscription": {
-              "description": "The name of the subscription to get.",
-              "required": true,
-              "pattern": "^.+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1a/subscriptions/{+subscription}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
-        },
-        "pullBatch": {
-          "id": "pubsub.subscriptions.pullBatch",
-          "response": {
-            "$ref": "PullBatchResponse"
-          },
-          "parameterOrder": [],
-          "description": "Pulls messages from the server. Returns an empty list if there are no\nmessages available in the backlog. The system is free to return UNAVAILABLE\nif there are too many pull requests outstanding for the given subscription.",
-          "request": {
-            "$ref": "PullBatchRequest"
-          },
-          "flatPath": "v1beta1a/subscriptions/pullBatch",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1beta1a/subscriptions/pullBatch",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
-        },
-        "create": {
-          "id": "pubsub.subscriptions.create",
-          "response": {
-            "$ref": "Subscription"
-          },
-          "parameterOrder": [],
-          "description": "Creates a subscription on a given topic for a given subscriber.\nIf the subscription already exists, returns ALREADY_EXISTS.\nIf the corresponding topic doesn't exist, returns NOT_FOUND.\n\nIf the name is not provided in the request, the server will assign a random\nname for this subscription on the same project as the topic.",
-          "request": {
-            "$ref": "Subscription"
-          },
-          "flatPath": "v1beta1a/subscriptions",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1beta1a/subscriptions",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
-        },
-        "modifyAckDeadline": {
-          "id": "pubsub.subscriptions.modifyAckDeadline",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [],
-          "description": "Modifies the Ack deadline for a message received from a pull request.",
-          "request": {
-            "$ref": "ModifyAckDeadlineRequest"
-          },
-          "flatPath": "v1beta1a/subscriptions/modifyAckDeadline",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1beta1a/subscriptions/modifyAckDeadline",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
+          "description": "Pulls a single message from the server.\nIf return_immediately is true, and no messages are available in the\nsubscription, this method returns FAILED_PRECONDITION. The system is free\nto return an UNAVAILABLE error if no messages are available in a\nreasonable amount of time (to reduce system load)."
         },
         "delete": {
-          "id": "pubsub.subscriptions.delete",
-          "response": {
-            "$ref": "Empty"
-          },
           "parameterOrder": [
             "subscription"
           ],
-          "description": "Deletes an existing subscription. All pending messages in the subscription\nare immediately dropped. Calls to Pull after deletion will return\nNOT_FOUND.",
-          "flatPath": "v1beta1a/subscriptions/{subscriptionsId}",
+          "response": {
+            "$ref": "Empty"
+          },
           "httpMethod": "DELETE",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ],
           "parameters": {
             "subscription": {
               "description": "The subscription to delete.",
               "required": true,
+              "type": "string",
               "pattern": "^.+$",
-              "location": "path",
-              "type": "string"
+              "location": "path"
             }
           },
+          "flatPath": "v1beta1a/subscriptions/{subscriptionsId}",
+          "id": "pubsub.subscriptions.delete",
           "path": "v1beta1a/subscriptions/{+subscription}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
-        },
-        "acknowledge": {
-          "id": "pubsub.subscriptions.acknowledge",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [],
-          "description": "Acknowledges a particular received message: the Pub/Sub system can remove\nthe given message from the subscription. Acknowledging a message whose\nAck deadline has expired may succeed, but the message could have been\nalready redelivered. Acknowledging a message more than once will not\nresult in an error. This is only used for messages received via pull.",
-          "request": {
-            "$ref": "AcknowledgeRequest"
-          },
-          "flatPath": "v1beta1a/subscriptions/acknowledge",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1beta1a/subscriptions/acknowledge",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
-        }
-      }
-    },
-    "topics": {
-      "methods": {
-        "publish": {
-          "id": "pubsub.topics.publish",
-          "response": {
-            "$ref": "Empty"
-          },
-          "parameterOrder": [],
-          "description": "Adds a message to the topic.  Returns NOT_FOUND if the topic does not\nexist.",
-          "request": {
-            "$ref": "PublishRequest"
-          },
-          "flatPath": "v1beta1a/topics/publish",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1beta1a/topics/publish",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
+          "description": "Deletes an existing subscription. All pending messages in the subscription\nare immediately dropped. Calls to Pull after deletion will return\nNOT_FOUND."
         },
         "list": {
-          "id": "pubsub.topics.list",
+          "flatPath": "v1beta1a/subscriptions",
+          "id": "pubsub.subscriptions.list",
+          "path": "v1beta1a/subscriptions",
+          "description": "Lists matching subscriptions.",
+          "httpMethod": "GET",
           "response": {
-            "$ref": "ListTopicsResponse"
+            "$ref": "ListSubscriptionsResponse"
           },
           "parameterOrder": [],
-          "description": "Lists matching topics.",
-          "flatPath": "v1beta1a/topics",
-          "httpMethod": "GET",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/pubsub"
+          ],
           "parameters": {
+            "pageToken": {
+              "description": "The value obtained in the last \u003ccode\u003eListSubscriptionsResponse\u003c/code\u003e\nfor continuation.",
+              "type": "string",
+              "location": "query"
+            },
             "query": {
-              "description": "A valid label query expression.",
               "location": "query",
+              "description": "A valid label query expression.",
               "type": "string"
             },
             "maxResults": {
-              "description": "Maximum number of topics to return.",
-              "location": "query",
+              "description": "Maximum number of subscriptions to return.",
+              "format": "int32",
               "type": "integer",
-              "format": "int32"
-            },
-            "pageToken": {
-              "description": "The value obtained in the last \u003ccode\u003eListTopicsResponse\u003c/code\u003e\nfor continuation.",
-              "location": "query",
-              "type": "string"
+              "location": "query"
             }
-          },
-          "path": "v1beta1a/topics",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
-        },
-        "get": {
-          "id": "pubsub.topics.get",
-          "response": {
-            "$ref": "Topic"
-          },
-          "parameterOrder": [
-            "topic"
-          ],
-          "description": "Gets the configuration of a topic. Since the topic only has the name\nattribute, this method is only useful to check the existence of a topic.\nIf other attributes are added in the future, they will be returned here.",
-          "flatPath": "v1beta1a/topics/{topicsId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "topic": {
-              "description": "The name of the topic to get.",
-              "required": true,
-              "pattern": "^.+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1a/topics/{+topic}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
-        },
-        "publishBatch": {
-          "id": "pubsub.topics.publishBatch",
-          "response": {
-            "$ref": "PublishBatchResponse"
-          },
-          "parameterOrder": [],
-          "description": "Adds one or more messages to the topic. Returns NOT_FOUND if the topic does\nnot exist.",
-          "request": {
-            "$ref": "PublishBatchRequest"
-          },
-          "flatPath": "v1beta1a/topics/publishBatch",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1beta1a/topics/publishBatch",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
+          }
         },
         "create": {
-          "id": "pubsub.topics.create",
-          "response": {
-            "$ref": "Topic"
-          },
-          "parameterOrder": [],
-          "description": "Creates the given topic with the given name.",
-          "request": {
-            "$ref": "Topic"
-          },
-          "flatPath": "v1beta1a/topics",
           "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1beta1a/topics",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/pubsub"
-          ]
-        },
-        "delete": {
-          "id": "pubsub.topics.delete",
+          "parameterOrder": [],
           "response": {
-            "$ref": "Empty"
+            "$ref": "Subscription"
           },
-          "parameterOrder": [
-            "topic"
-          ],
-          "description": "Deletes the topic with the given name. Returns NOT_FOUND if the topic does\nnot exist. After a topic is deleted, a new topic may be created with the\nsame name.",
-          "flatPath": "v1beta1a/topics/{topicsId}",
-          "httpMethod": "DELETE",
-          "parameters": {
-            "topic": {
-              "description": "Name of the topic to delete.",
-              "required": true,
-              "pattern": "^.+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1beta1a/topics/{+topic}",
+          "parameters": {},
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/pubsub"
-          ]
+          ],
+          "flatPath": "v1beta1a/subscriptions",
+          "id": "pubsub.subscriptions.create",
+          "path": "v1beta1a/subscriptions",
+          "request": {
+            "$ref": "Subscription"
+          },
+          "description": "Creates a subscription on a given topic for a given subscriber.\nIf the subscription already exists, returns ALREADY_EXISTS.\nIf the corresponding topic doesn't exist, returns NOT_FOUND.\n\nIf the name is not provided in the request, the server will assign a random\nname for this subscription on the same project as the topic."
         }
       }
     }
   },
+  "parameters": {
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "alt": {
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string",
+      "location": "query"
+    },
+    "access_token": {
+      "type": "string",
+      "location": "query",
+      "description": "OAuth access token."
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
+    },
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
+    }
+  },
   "schemas": {
-    "PullBatchResponse": {
-      "description": "Response for the PullBatch method.",
-      "type": "object",
-      "properties": {
-        "pullResponses": {
-          "description": "Received Pub/Sub messages or status events. The Pub/Sub system will return\nzero messages if there are no more messages available in the backlog. The\nPub/Sub system may return fewer than the max_events requested even if\nthere are more messages available in the backlog.",
-          "type": "array",
-          "items": {
-            "$ref": "PullResponse"
-          }
-        }
-      },
-      "id": "PullBatchResponse"
-    },
-    "Topic": {
-      "description": "A topic resource.",
-      "type": "object",
-      "properties": {
-        "name": {
-          "description": "Name of the topic.",
-          "type": "string"
-        }
-      },
-      "id": "Topic"
-    },
-    "PublishBatchResponse": {
-      "description": "Response for the PublishBatch method.",
-      "type": "object",
-      "properties": {
-        "messageIds": {
-          "description": "The server-assigned ID of each published message, in the same order as\nthe messages in the request. IDs are guaranteed to be unique within\nthe topic.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "PublishBatchResponse"
-    },
-    "PublishRequest": {
-      "description": "Request for the Publish method.",
-      "type": "object",
-      "properties": {
-        "topic": {
-          "description": "The message in the request will be published on this topic.",
-          "type": "string"
-        },
-        "message": {
-          "description": "The message to publish.",
-          "$ref": "PubsubMessage"
-        }
-      },
-      "id": "PublishRequest"
-    },
-    "ListSubscriptionsResponse": {
-      "description": "Response for the ListSubscriptions method.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "If not empty, indicates that there are more subscriptions that match the\nrequest and this value should be passed to the next\n\u003ccode\u003eListSubscriptionsRequest\u003c/code\u003e to continue.",
-          "type": "string"
-        },
-        "subscription": {
-          "description": "The subscriptions that match the request.",
-          "type": "array",
-          "items": {
-            "$ref": "Subscription"
-          }
-        }
-      },
-      "id": "ListSubscriptionsResponse"
-    },
-    "Subscription": {
-      "description": "A subscription resource.",
-      "type": "object",
-      "properties": {
-        "pushConfig": {
-          "description": "If push delivery is used with this subscription, this field is\nused to configure it.",
-          "$ref": "PushConfig"
-        },
-        "topic": {
-          "description": "The name of the topic from which this subscription is receiving messages.",
-          "type": "string"
-        },
-        "ackDeadlineSeconds": {
-          "description": "For either push or pull delivery, the value is the maximum time after a\nsubscriber receives a message before the subscriber should acknowledge or\nNack the message. If the Ack deadline for a message passes without an\nAck or a Nack, the Pub/Sub system will eventually redeliver the message.\nIf a subscriber acknowledges after the deadline, the Pub/Sub system may\naccept the Ack, but it is possible that the message has been already\ndelivered again. Multiple Acks to the message are allowed and will\nsucceed.\n\nFor push delivery, this value is used to set the request timeout for\nthe call to the push endpoint.\n\nFor pull delivery, this value is used as the initial value for the Ack\ndeadline. It may be overridden for each message using its corresponding\nack_id with \u003ccode\u003eModifyAckDeadline\u003c/code\u003e.\nWhile a message is outstanding (i.e. it has been delivered to a pull\nsubscriber and the subscriber has not yet Acked or Nacked), the Pub/Sub\nsystem will not deliver that message to another pull subscriber\n(on a best-effort basis).",
-          "type": "integer",
-          "format": "int32"
-        },
-        "name": {
-          "description": "Name of the subscription.",
-          "type": "string"
-        }
-      },
-      "id": "Subscription"
-    },
-    "Label": {
-      "description": "A key-value pair applied to a given object.",
-      "type": "object",
-      "properties": {
-        "strValue": {
-          "description": "A string value.",
-          "type": "string"
-        },
-        "key": {
-          "description": "The key of a label is a syntactically valid URL (as per RFC 1738) with\nthe \"scheme\" and initial slashes omitted and with the additional\nrestrictions noted below.  Each key should be globally unique.  The\n\"host\" portion is called the \"namespace\" and is not necessarily\nresolvable to a network endpoint.  Instead, the namespace indicates what\nsystem or entity defines the semantics of the label.  Namespaces do not\nrestrict the set of objects to which a label may be associated.\n\nKeys are defined by the following grammar:\n\n  key          = hostname \"/\" kpath\n  kpath        = ksegment *[ \"/\" ksegment ]\n  ksegment     = alphadigit | *[ alphadigit | \"-\" | \"_\" | \".\" ]\n\nwhere \"hostname\" and \"alphadigit\" are defined as in RFC 1738.\n\nExample key:\n  spanner.google.com/universe",
-          "type": "string"
-        },
-        "numValue": {
-          "description": "An integer value.",
-          "type": "string",
-          "format": "int64"
-        }
-      },
-      "id": "Label"
-    },
-    "ModifyAckDeadlineRequest": {
-      "description": "Request for the ModifyAckDeadline method.",
-      "type": "object",
-      "properties": {
-        "ackDeadlineSeconds": {
-          "description": "The new ack deadline with respect to the time this request was sent to the\nPub/Sub system. Must be \u003e= 0. For example, if the value is 10, the new ack\ndeadline will expire 10 seconds after the ModifyAckDeadline call was made.\nSpecifying zero may immediately make the message available for another pull\nrequest.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "ackId": {
-          "description": "The acknowledgment ID. Either this or ack_ids must be populated,\nnot both.",
-          "type": "string"
-        },
-        "subscription": {
-          "description": "Next Index: 5\nThe name of the subscription from which messages are being pulled.",
-          "type": "string"
-        },
-        "ackIds": {
-          "description": "List of acknowledgment IDs. Either this field or ack_id\nshould be populated, not both.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "ModifyAckDeadlineRequest"
-    },
     "PushConfig": {
       "description": "Configuration for a push delivery endpoint.",
       "type": "object",
@@ -525,17 +456,189 @@
       "description": "Request for the Pull method.",
       "type": "object",
       "properties": {
+        "subscription": {
+          "type": "string",
+          "description": "The subscription from which a message should be pulled."
+        },
         "returnImmediately": {
           "description": "If this is specified as true the system will respond immediately even if\nit is not able to return a message in the Pull response. Otherwise the\nsystem is allowed to wait until at least one message is available rather\nthan returning FAILED_PRECONDITION. The client may cancel the request if\nit does not wish to wait any longer for the response.",
           "type": "boolean"
-        },
-        "subscription": {
-          "description": "The subscription from which a message should be pulled.",
-          "type": "string"
         }
       },
       "id": "PullRequest"
     },
+    "ListSubscriptionsResponse": {
+      "description": "Response for the ListSubscriptions method.",
+      "type": "object",
+      "properties": {
+        "subscription": {
+          "description": "The subscriptions that match the request.",
+          "type": "array",
+          "items": {
+            "$ref": "Subscription"
+          }
+        },
+        "nextPageToken": {
+          "description": "If not empty, indicates that there are more subscriptions that match the\nrequest and this value should be passed to the next\n\u003ccode\u003eListSubscriptionsRequest\u003c/code\u003e to continue.",
+          "type": "string"
+        }
+      },
+      "id": "ListSubscriptionsResponse"
+    },
+    "PubsubEvent": {
+      "description": "An event indicating a received message or truncation event.",
+      "type": "object",
+      "properties": {
+        "truncated": {
+          "description": "Indicates that this subscription has been truncated.",
+          "type": "boolean"
+        },
+        "deleted": {
+          "description": "Indicates that this subscription has been deleted. (Note that pull\nsubscribers will always receive NOT_FOUND in response in their pull\nrequest on the subscription, rather than seeing this boolean.)",
+          "type": "boolean"
+        },
+        "message": {
+          "$ref": "PubsubMessage",
+          "description": "A received message."
+        },
+        "subscription": {
+          "description": "The subscription that received the event.",
+          "type": "string"
+        }
+      },
+      "id": "PubsubEvent"
+    },
+    "PublishRequest": {
+      "description": "Request for the Publish method.",
+      "type": "object",
+      "properties": {
+        "topic": {
+          "description": "The message in the request will be published on this topic.",
+          "type": "string"
+        },
+        "message": {
+          "$ref": "PubsubMessage",
+          "description": "The message to publish."
+        }
+      },
+      "id": "PublishRequest"
+    },
+    "Subscription": {
+      "description": "A subscription resource.",
+      "type": "object",
+      "properties": {
+        "topic": {
+          "type": "string",
+          "description": "The name of the topic from which this subscription is receiving messages."
+        },
+        "pushConfig": {
+          "$ref": "PushConfig",
+          "description": "If push delivery is used with this subscription, this field is\nused to configure it."
+        },
+        "ackDeadlineSeconds": {
+          "description": "For either push or pull delivery, the value is the maximum time after a\nsubscriber receives a message before the subscriber should acknowledge or\nNack the message. If the Ack deadline for a message passes without an\nAck or a Nack, the Pub/Sub system will eventually redeliver the message.\nIf a subscriber acknowledges after the deadline, the Pub/Sub system may\naccept the Ack, but it is possible that the message has been already\ndelivered again. Multiple Acks to the message are allowed and will\nsucceed.\n\nFor push delivery, this value is used to set the request timeout for\nthe call to the push endpoint.\n\nFor pull delivery, this value is used as the initial value for the Ack\ndeadline. It may be overridden for each message using its corresponding\nack_id with \u003ccode\u003eModifyAckDeadline\u003c/code\u003e.\nWhile a message is outstanding (i.e. it has been delivered to a pull\nsubscriber and the subscriber has not yet Acked or Nacked), the Pub/Sub\nsystem will not deliver that message to another pull subscriber\n(on a best-effort basis).",
+          "format": "int32",
+          "type": "integer"
+        },
+        "name": {
+          "description": "Name of the subscription.",
+          "type": "string"
+        }
+      },
+      "id": "Subscription"
+    },
+    "PublishBatchResponse": {
+      "description": "Response for the PublishBatch method.",
+      "type": "object",
+      "properties": {
+        "messageIds": {
+          "description": "The server-assigned ID of each published message, in the same order as\nthe messages in the request. IDs are guaranteed to be unique within\nthe topic.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "PublishBatchResponse"
+    },
+    "Topic": {
+      "id": "Topic",
+      "description": "A topic resource.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "Name of the topic.",
+          "type": "string"
+        }
+      }
+    },
+    "Label": {
+      "description": "A key-value pair applied to a given object.",
+      "type": "object",
+      "properties": {
+        "strValue": {
+          "description": "A string value.",
+          "type": "string"
+        },
+        "numValue": {
+          "description": "An integer value.",
+          "format": "int64",
+          "type": "string"
+        },
+        "key": {
+          "description": "The key of a label is a syntactically valid URL (as per RFC 1738) with\nthe \"scheme\" and initial slashes omitted and with the additional\nrestrictions noted below.  Each key should be globally unique.  The\n\"host\" portion is called the \"namespace\" and is not necessarily\nresolvable to a network endpoint.  Instead, the namespace indicates what\nsystem or entity defines the semantics of the label.  Namespaces do not\nrestrict the set of objects to which a label may be associated.\n\nKeys are defined by the following grammar:\n\n  key          = hostname \"/\" kpath\n  kpath        = ksegment *[ \"/\" ksegment ]\n  ksegment     = alphadigit | *[ alphadigit | \"-\" | \"_\" | \".\" ]\n\nwhere \"hostname\" and \"alphadigit\" are defined as in RFC 1738.\n\nExample key:\n  spanner.google.com/universe",
+          "type": "string"
+        }
+      },
+      "id": "Label"
+    },
+    "ModifyAckDeadlineRequest": {
+      "description": "Request for the ModifyAckDeadline method.",
+      "type": "object",
+      "properties": {
+        "ackId": {
+          "description": "The acknowledgment ID. Either this or ack_ids must be populated,\nnot both.",
+          "type": "string"
+        },
+        "ackDeadlineSeconds": {
+          "description": "The new ack deadline with respect to the time this request was sent to the\nPub/Sub system. Must be \u003e= 0. For example, if the value is 10, the new ack\ndeadline will expire 10 seconds after the ModifyAckDeadline call was made.\nSpecifying zero may immediately make the message available for another pull\nrequest.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "ackIds": {
+          "description": "List of acknowledgment IDs. Either this field or ack_id\nshould be populated, not both.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "subscription": {
+          "description": "Next Index: 5\nThe name of the subscription from which messages are being pulled.",
+          "type": "string"
+        }
+      },
+      "id": "ModifyAckDeadlineRequest"
+    },
+    "PullBatchRequest": {
+      "properties": {
+        "subscription": {
+          "description": "The subscription from which messages should be pulled.",
+          "type": "string"
+        },
+        "returnImmediately": {
+          "description": "If this is specified as true the system will respond immediately even if\nit is not able to return a message in the Pull response. Otherwise the\nsystem is allowed to wait until at least one message is available rather\nthan returning no messages. The client may cancel the request if it does\nnot wish to wait any longer for the response.",
+          "type": "boolean"
+        },
+        "maxEvents": {
+          "description": "The maximum number of PubsubEvents returned for this request. The Pub/Sub\nsystem may return fewer than the number of events specified.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "PullBatchRequest",
+      "description": "Request for the PullBatch method.",
+      "type": "object"
+    },
     "ModifyPushConfigRequest": {
       "description": "Request for the ModifyPushConfig method.",
       "type": "object",
@@ -551,48 +654,71 @@
       },
       "id": "ModifyPushConfigRequest"
     },
-    "PullResponse": {
-      "description": "Either a \u003ccode\u003ePubsubMessage\u003c/code\u003e or a truncation event. One of these two\nmust be populated.",
-      "type": "object",
-      "properties": {
-        "pubsubEvent": {
-          "description": "A pubsub message or truncation event.",
-          "$ref": "PubsubEvent"
-        },
-        "ackId": {
-          "description": "This ID must be used to acknowledge the received event or message.",
-          "type": "string"
-        }
-      },
-      "id": "PullResponse"
-    },
     "PubsubMessage": {
+      "id": "PubsubMessage",
       "description": "A message data and its labels.",
       "type": "object",
       "properties": {
-        "data": {
-          "description": "The message payload.",
-          "type": "string",
-          "format": "byte"
-        },
         "messageId": {
           "description": "ID of this message assigned by the server at publication time. Guaranteed\nto be unique within the topic. This value may be read by a subscriber\nthat receives a PubsubMessage via a Pull call or a push delivery. It must\nnot be populated by a publisher in a Publish call.",
           "type": "string"
         },
-        "publishTime": {
-          "description": "The time at which the message was published.\nThe time is milliseconds since the UNIX epoch.",
-          "type": "string",
-          "format": "int64"
-        },
         "label": {
           "description": "Optional list of labels for this message. Keys in this collection must\nbe unique.",
           "type": "array",
           "items": {
             "$ref": "Label"
           }
+        },
+        "publishTime": {
+          "description": "The time at which the message was published.\nThe time is milliseconds since the UNIX epoch.",
+          "format": "int64",
+          "type": "string"
+        },
+        "data": {
+          "description": "The message payload.",
+          "format": "byte",
+          "type": "string"
+        }
+      }
+    },
+    "AcknowledgeRequest": {
+      "description": "Request for the Acknowledge method.",
+      "type": "object",
+      "properties": {
+        "subscription": {
+          "description": "The subscription whose message is being acknowledged.",
+          "type": "string"
+        },
+        "ackId": {
+          "description": "The acknowledgment ID for the message being acknowledged. This was\nreturned by the Pub/Sub system in the Pull response.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
         }
       },
-      "id": "PubsubMessage"
+      "id": "AcknowledgeRequest"
+    },
+    "PullBatchResponse": {
+      "type": "object",
+      "properties": {
+        "pullResponses": {
+          "description": "Received Pub/Sub messages or status events. The Pub/Sub system will return\nzero messages if there are no more messages available in the backlog. The\nPub/Sub system may return fewer than the max_events requested even if\nthere are more messages available in the backlog.",
+          "type": "array",
+          "items": {
+            "$ref": "PullResponse"
+          }
+        }
+      },
+      "id": "PullBatchResponse",
+      "description": "Response for the PullBatch method."
+    },
+    "Empty": {
+      "type": "object",
+      "properties": {},
+      "id": "Empty",
+      "description": "An empty message that you can re-use to avoid defining duplicated empty\nmessages in your project. A typical example is to use it as argument or the\nreturn value of a service API. For instance:\n\n  service Foo {\n    rpc Bar (proto2.Empty) returns (proto2.Empty) { };\n  };\n\nBEGIN GOOGLE-INTERNAL\nThe difference between this one and net/rpc/empty-message.proto is that\n1) The generated message here is in proto2 C++ API.\n2) The proto2.Empty has minimum dependencies\n   (no message_set or net/rpc dependencies)\nEND GOOGLE-INTERNAL"
     },
     "PublishBatchRequest": {
       "description": "Request for the PublishBatch method.",
@@ -612,195 +738,69 @@
       },
       "id": "PublishBatchRequest"
     },
-    "AcknowledgeRequest": {
-      "description": "Request for the Acknowledge method.",
-      "type": "object",
-      "properties": {
-        "ackId": {
-          "description": "The acknowledgment ID for the message being acknowledged. This was\nreturned by the Pub/Sub system in the Pull response.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "subscription": {
-          "description": "The subscription whose message is being acknowledged.",
-          "type": "string"
-        }
-      },
-      "id": "AcknowledgeRequest"
-    },
-    "Empty": {
-      "description": "An empty message that you can re-use to avoid defining duplicated empty\nmessages in your project. A typical example is to use it as argument or the\nreturn value of a service API. For instance:\n\n  service Foo {\n    rpc Bar (proto2.Empty) returns (proto2.Empty) { };\n  };\n\nBEGIN GOOGLE-INTERNAL\nThe difference between this one and net/rpc/empty-message.proto is that\n1) The generated message here is in proto2 C++ API.\n2) The proto2.Empty has minimum dependencies\n   (no message_set or net/rpc dependencies)\nEND GOOGLE-INTERNAL",
-      "type": "object",
-      "properties": {},
-      "id": "Empty"
-    },
     "ListTopicsResponse": {
-      "description": "Response for the ListTopics method.",
-      "type": "object",
       "properties": {
         "topic": {
-          "description": "The resulting topics.",
           "type": "array",
           "items": {
             "$ref": "Topic"
-          }
+          },
+          "description": "The resulting topics."
         },
         "nextPageToken": {
           "description": "If not empty, indicates that there are more topics that match the request,\nand this value should be passed to the next \u003ccode\u003eListTopicsRequest\u003c/code\u003e\nto continue.",
           "type": "string"
         }
       },
-      "id": "ListTopicsResponse"
+      "id": "ListTopicsResponse",
+      "description": "Response for the ListTopics method.",
+      "type": "object"
     },
-    "PubsubEvent": {
-      "description": "An event indicating a received message or truncation event.",
+    "PullResponse": {
+      "id": "PullResponse",
+      "description": "Either a \u003ccode\u003ePubsubMessage\u003c/code\u003e or a truncation event. One of these two\nmust be populated.",
       "type": "object",
       "properties": {
-        "truncated": {
-          "description": "Indicates that this subscription has been truncated.",
-          "type": "boolean"
-        },
-        "deleted": {
-          "description": "Indicates that this subscription has been deleted. (Note that pull\nsubscribers will always receive NOT_FOUND in response in their pull\nrequest on the subscription, rather than seeing this boolean.)",
-          "type": "boolean"
-        },
-        "subscription": {
-          "description": "The subscription that received the event.",
+        "ackId": {
+          "description": "This ID must be used to acknowledge the received event or message.",
           "type": "string"
         },
-        "message": {
-          "description": "A received message.",
-          "$ref": "PubsubMessage"
+        "pubsubEvent": {
+          "$ref": "PubsubEvent",
+          "description": "A pubsub message or truncation event."
         }
-      },
-      "id": "PubsubEvent"
-    },
-    "PullBatchRequest": {
-      "description": "Request for the PullBatch method.",
-      "type": "object",
-      "properties": {
-        "maxEvents": {
-          "description": "The maximum number of PubsubEvents returned for this request. The Pub/Sub\nsystem may return fewer than the number of events specified.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "returnImmediately": {
-          "description": "If this is specified as true the system will respond immediately even if\nit is not able to return a message in the Pull response. Otherwise the\nsystem is allowed to wait until at least one message is available rather\nthan returning no messages. The client may cancel the request if it does\nnot wish to wait any longer for the response.",
-          "type": "boolean"
-        },
-        "subscription": {
-          "description": "The subscription from which messages should be pulled.",
-          "type": "string"
-        }
-      },
-      "id": "PullBatchRequest"
+      }
     }
   },
-  "revision": "20170105",
-  "basePath": "",
   "icons": {
-    "x32": "http://www.google.com/images/icons/product/search-32.gif",
-    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
   },
-  "discoveryVersion": "v1",
+  "protocol": "rest",
+  "version": "v1beta1a",
   "baseUrl": "https://pubsub.googleapis.com/",
-  "name": "pubsub",
-  "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        },
+        "https://www.googleapis.com/auth/pubsub": {
+          "description": "View and manage Pub/Sub topics and subscriptions"
+        }
+      }
     }
   },
-  "documentationLink": "https://cloud.google.com/pubsub/docs",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
   "servicePath": "",
-  "ownerName": "Google",
-  "version": "v1beta1a",
+  "kind": "discovery#restDescription",
+  "description": "Provides reliable, many-to-many, asynchronous messaging between applications.\n",
   "rootUrl": "https://pubsub.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "pubsub",
+  "batchPath": "batch",
+  "documentationLink": "https://cloud.google.com/pubsub/docs",
+  "revision": "20170124",
+  "id": "pubsub:v1beta1a",
+  "title": "Google Cloud Pub/Sub API"
 }
diff --git a/pubsub/v1beta1a/pubsub-gen.go b/pubsub/v1beta1a/pubsub-gen.go
index dd370e1..faa6272 100644
--- a/pubsub/v1beta1a/pubsub-gen.go
+++ b/pubsub/v1beta1a/pubsub-gen.go
@@ -65,9 +65,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Subscriptions *SubscriptionsService
 
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewSubscriptionsService(s *Service) *SubscriptionsService {
 	rs := &SubscriptionsService{s: s}
 	return rs
@@ -915,6 +920,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.acknowledgerequest)
 	if err != nil {
@@ -1043,6 +1049,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscription)
 	if err != nil {
@@ -1168,6 +1175,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1a/subscriptions/{+subscription}")
@@ -1305,6 +1313,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1465,6 +1474,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1620,6 +1630,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.modifyackdeadlinerequest)
 	if err != nil {
@@ -1749,6 +1760,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.modifypushconfigrequest)
 	if err != nil {
@@ -1877,6 +1889,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pullrequest)
 	if err != nil {
@@ -2003,6 +2016,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pullbatchrequest)
 	if err != nil {
@@ -2124,6 +2138,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.topic)
 	if err != nil {
@@ -2249,6 +2264,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1a/topics/{+topic}")
@@ -2391,6 +2407,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2551,6 +2568,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2707,6 +2725,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.publishrequest)
 	if err != nil {
@@ -2830,6 +2849,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.publishbatchrequest)
 	if err != nil {
diff --git a/pubsub/v1beta2/pubsub-api.json b/pubsub/v1beta2/pubsub-api.json
index 1afdbbe..3e69231 100644
--- a/pubsub/v1beta2/pubsub-api.json
+++ b/pubsub/v1beta2/pubsub-api.json
@@ -1,5 +1,4 @@
 {
-  "id": "pubsub:v1beta2",
   "auth": {
     "oauth2": {
       "scopes": {
@@ -12,627 +11,715 @@
       }
     }
   },
+  "kind": "discovery#restDescription",
   "description": "Provides reliable, many-to-many, asynchronous messaging between applications.\n",
-  "protocol": "rest",
+  "servicePath": "",
+  "rootUrl": "https://pubsub.googleapis.com/",
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "pubsub",
+  "batchPath": "batch",
+  "revision": "20170124",
+  "documentationLink": "https://cloud.google.com/pubsub/docs",
+  "id": "pubsub:v1beta2",
   "title": "Google Cloud Pub/Sub API",
+  "discoveryVersion": "v1",
+  "ownerName": "Google",
   "resources": {
     "projects": {
       "resources": {
-        "subscriptions": {
+        "topics": {
           "methods": {
-            "modifyPushConfig": {
-              "id": "pubsub.projects.subscriptions.modifyPushConfig",
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "subscription"
-              ],
-              "description": "Modifies the `PushConfig` for a specified subscription.\n\nThis may be used to change a push subscription to a pull one (signified by\nan empty `PushConfig`) or vice versa, or change the endpoint URL and other\nattributes of a push subscription. Messages will accumulate for delivery\ncontinuously through the call regardless of changes to the `PushConfig`.",
+            "publish": {
               "request": {
-                "$ref": "ModifyPushConfigRequest"
+                "$ref": "PublishRequest"
               },
-              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyPushConfig",
+              "description": "Adds one or more messages to the topic. Returns `NOT_FOUND` if the topic\ndoes not exist. The message payload must not be empty; it must contain\n either a non-empty data field, or at least one attribute.",
               "httpMethod": "POST",
-              "parameters": {
-                "subscription": {
-                  "description": "The name of the subscription.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+subscription}:modifyPushConfig",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "getIamPolicy": {
-              "id": "pubsub.projects.subscriptions.getIamPolicy",
-              "response": {
-                "$ref": "Policy"
-              },
               "parameterOrder": [
-                "resource"
+                "topic"
               ],
-              "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.",
-              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:getIamPolicy",
-              "httpMethod": "GET",
-              "parameters": {
-                "resource": {
-                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+resource}:getIamPolicy",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "pull": {
-              "id": "pubsub.projects.subscriptions.pull",
               "response": {
-                "$ref": "PullResponse"
+                "$ref": "PublishResponse"
               },
-              "parameterOrder": [
-                "subscription"
-              ],
-              "description": "Pulls messages from the server. Returns an empty list if there are no\nmessages available in the backlog. The server may return `UNAVAILABLE` if\nthere are too many concurrent pull requests pending for the given\nsubscription.",
-              "request": {
-                "$ref": "PullRequest"
-              },
-              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:pull",
-              "httpMethod": "POST",
               "parameters": {
-                "subscription": {
-                  "description": "The subscription from which messages should be pulled.",
+                "topic": {
                   "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/topics/[^/]+$",
                   "location": "path",
-                  "type": "string"
+                  "description": "The messages in the request will be published on this topic."
                 }
               },
-              "path": "v1beta2/{+subscription}:pull",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "list": {
-              "id": "pubsub.projects.subscriptions.list",
-              "response": {
-                "$ref": "ListSubscriptionsResponse"
-              },
-              "parameterOrder": [
-                "project"
               ],
-              "description": "Lists matching subscriptions.",
-              "flatPath": "v1beta2/projects/{projectsId}/subscriptions",
-              "httpMethod": "GET",
-              "parameters": {
-                "pageSize": {
-                  "description": "Maximum number of subscriptions to return.",
-                  "location": "query",
-                  "type": "integer",
-                  "format": "int32"
-                },
-                "project": {
-                  "description": "The name of the cloud project that subscriptions belong to.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                },
-                "pageToken": {
-                  "description": "The value returned by the last `ListSubscriptionsResponse`; indicates that\nthis is a continuation of a prior `ListSubscriptions` call, and that the\nsystem should return the next page of data.",
-                  "location": "query",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+project}/subscriptions",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "get": {
-              "id": "pubsub.projects.subscriptions.get",
-              "response": {
-                "$ref": "Subscription"
-              },
-              "parameterOrder": [
-                "subscription"
-              ],
-              "description": "Gets the configuration details of a subscription.",
-              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}",
-              "httpMethod": "GET",
-              "parameters": {
-                "subscription": {
-                  "description": "The name of the subscription to get.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+subscription}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "create": {
-              "id": "pubsub.projects.subscriptions.create",
-              "response": {
-                "$ref": "Subscription"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "description": "Creates a subscription to a given topic.\nIf the subscription already exists, returns `ALREADY_EXISTS`.\nIf the corresponding topic doesn't exist, returns `NOT_FOUND`.\n\nIf the name is not provided in the request, the server will assign a random\nname for this subscription on the same project as the topic. Note that\nfor REST API requests, you must specify a name.",
-              "request": {
-                "$ref": "Subscription"
-              },
-              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}",
-              "httpMethod": "PUT",
-              "parameters": {
-                "name": {
-                  "description": "The name of the subscription. It must have the format\n`\"projects/{project}/subscriptions/{subscription}\"`. `{subscription}` must\nstart with a letter, and contain only letters (`[A-Za-z]`), numbers\n(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),\nplus (`+`) or percent signs (`%`). It must be between 3 and 255 characters\nin length, and it must not start with `\"goog\"`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+name}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "modifyAckDeadline": {
-              "id": "pubsub.projects.subscriptions.modifyAckDeadline",
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "subscription"
-              ],
-              "description": "Modifies the ack deadline for a specific message. This method is useful\nto indicate that more time is needed to process a message by the\nsubscriber, or to make the message available for redelivery if the\nprocessing was interrupted. Note that this does not modify the\nsubscription-level `ackDeadlineSeconds` used for subsequent messages.",
-              "request": {
-                "$ref": "ModifyAckDeadlineRequest"
-              },
-              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyAckDeadline",
-              "httpMethod": "POST",
-              "parameters": {
-                "subscription": {
-                  "description": "The name of the subscription.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+subscription}:modifyAckDeadline",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "setIamPolicy": {
-              "id": "pubsub.projects.subscriptions.setIamPolicy",
-              "response": {
-                "$ref": "Policy"
-              },
-              "parameterOrder": [
-                "resource"
-              ],
-              "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
-              "request": {
-                "$ref": "SetIamPolicyRequest"
-              },
-              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:setIamPolicy",
-              "httpMethod": "POST",
-              "parameters": {
-                "resource": {
-                  "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+resource}:setIamPolicy",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "delete": {
-              "id": "pubsub.projects.subscriptions.delete",
-              "response": {
-                "$ref": "Empty"
-              },
-              "parameterOrder": [
-                "subscription"
-              ],
-              "description": "Deletes an existing subscription. All pending messages in the subscription\nare immediately dropped. Calls to `Pull` after deletion will return\n`NOT_FOUND`. After a subscription is deleted, a new one may be created with\nthe same name, but the new one has no association with the old\nsubscription, or its topic unless the same topic is specified.",
-              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}",
-              "httpMethod": "DELETE",
-              "parameters": {
-                "subscription": {
-                  "description": "The subscription to delete.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+subscription}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
+              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}:publish",
+              "id": "pubsub.projects.topics.publish",
+              "path": "v1beta2/{+topic}:publish"
             },
             "testIamPermissions": {
-              "id": "pubsub.projects.subscriptions.testIamPermissions",
               "response": {
                 "$ref": "TestIamPermissionsResponse"
               },
               "parameterOrder": [
                 "resource"
               ],
-              "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
-              "request": {
-                "$ref": "TestIamPermissionsRequest"
-              },
-              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:testIamPermissions",
               "httpMethod": "POST",
               "parameters": {
                 "resource": {
+                  "location": "path",
                   "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
                   "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/topics/[^/]+$"
                 }
               },
-              "path": "v1beta2/{+resource}:testIamPermissions",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}:testIamPermissions",
+              "path": "v1beta2/{+resource}:testIamPermissions",
+              "id": "pubsub.projects.topics.testIamPermissions",
+              "request": {
+                "$ref": "TestIamPermissionsRequest"
+              },
+              "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error."
             },
-            "acknowledge": {
-              "id": "pubsub.projects.subscriptions.acknowledge",
+            "delete": {
+              "httpMethod": "DELETE",
               "response": {
                 "$ref": "Empty"
               },
               "parameterOrder": [
-                "subscription"
-              ],
-              "description": "Acknowledges the messages associated with the `ack_ids` in the\n`AcknowledgeRequest`. The Pub/Sub system can remove the relevant messages\nfrom the subscription.\n\nAcknowledging a message whose ack deadline has expired may succeed,\nbut such a message may be redelivered later. Acknowledging a message more\nthan once will not result in an error.",
-              "request": {
-                "$ref": "AcknowledgeRequest"
-              },
-              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:acknowledge",
-              "httpMethod": "POST",
-              "parameters": {
-                "subscription": {
-                  "description": "The subscription whose message is being acknowledged.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+subscription}:acknowledge",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            }
-          }
-        },
-        "topics": {
-          "resources": {
-            "subscriptions": {
-              "methods": {
-                "list": {
-                  "id": "pubsub.projects.topics.subscriptions.list",
-                  "response": {
-                    "$ref": "ListTopicSubscriptionsResponse"
-                  },
-                  "parameterOrder": [
-                    "topic"
-                  ],
-                  "description": "Lists the name of the subscriptions for this topic.",
-                  "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}/subscriptions",
-                  "httpMethod": "GET",
-                  "parameters": {
-                    "topic": {
-                      "description": "The name of the topic that subscriptions are attached to.",
-                      "required": true,
-                      "pattern": "^projects/[^/]+/topics/[^/]+$",
-                      "location": "path",
-                      "type": "string"
-                    },
-                    "pageSize": {
-                      "description": "Maximum number of subscription names to return.",
-                      "location": "query",
-                      "type": "integer",
-                      "format": "int32"
-                    },
-                    "pageToken": {
-                      "description": "The value returned by the last `ListTopicSubscriptionsResponse`; indicates\nthat this is a continuation of a prior `ListTopicSubscriptions` call, and\nthat the system should return the next page of data.",
-                      "location": "query",
-                      "type": "string"
-                    }
-                  },
-                  "path": "v1beta2/{+topic}/subscriptions",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/pubsub"
-                  ]
-                }
-              }
-            }
-          },
-          "methods": {
-            "getIamPolicy": {
-              "id": "pubsub.projects.topics.getIamPolicy",
-              "response": {
-                "$ref": "Policy"
-              },
-              "parameterOrder": [
-                "resource"
-              ],
-              "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.",
-              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}:getIamPolicy",
-              "httpMethod": "GET",
-              "parameters": {
-                "resource": {
-                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/topics/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+resource}:getIamPolicy",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "publish": {
-              "id": "pubsub.projects.topics.publish",
-              "response": {
-                "$ref": "PublishResponse"
-              },
-              "parameterOrder": [
                 "topic"
               ],
-              "description": "Adds one or more messages to the topic. Returns `NOT_FOUND` if the topic\ndoes not exist. The message payload must not be empty; it must contain\n either a non-empty data field, or at least one attribute.",
-              "request": {
-                "$ref": "PublishRequest"
-              },
-              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}:publish",
-              "httpMethod": "POST",
-              "parameters": {
-                "topic": {
-                  "description": "The messages in the request will be published on this topic.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/topics/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+topic}:publish",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "parameters": {
+                "topic": {
+                  "location": "path",
+                  "description": "Name of the topic to delete.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/topics/[^/]+$"
+                }
+              },
+              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}",
+              "id": "pubsub.projects.topics.delete",
+              "path": "v1beta2/{+topic}",
+              "description": "Deletes the topic with the given name. Returns `NOT_FOUND` if the topic\ndoes not exist. After a topic is deleted, a new topic may be created with\nthe same name; this is an entirely new topic with none of the old\nconfiguration or subscriptions. Existing subscriptions to this topic are\nnot deleted, but their `topic` field is set to `_deleted-topic_`."
             },
             "list": {
+              "flatPath": "v1beta2/projects/{projectsId}/topics",
+              "path": "v1beta2/{+project}/topics",
               "id": "pubsub.projects.topics.list",
+              "description": "Lists matching topics.",
               "response": {
                 "$ref": "ListTopicsResponse"
               },
               "parameterOrder": [
                 "project"
               ],
-              "description": "Lists matching topics.",
-              "flatPath": "v1beta2/projects/{projectsId}/topics",
               "httpMethod": "GET",
               "parameters": {
+                "pageToken": {
+                  "description": "The value returned by the last `ListTopicsResponse`; indicates that this is\na continuation of a prior `ListTopics` call, and that the system should\nreturn the next page of data.",
+                  "type": "string",
+                  "location": "query"
+                },
                 "pageSize": {
                   "description": "Maximum number of topics to return.",
-                  "location": "query",
+                  "format": "int32",
                   "type": "integer",
-                  "format": "int32"
+                  "location": "query"
                 },
                 "project": {
                   "description": "The name of the cloud project that topics belong to.",
                   "required": true,
+                  "type": "string",
                   "pattern": "^projects/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                },
-                "pageToken": {
-                  "description": "The value returned by the last `ListTopicsResponse`; indicates that this is\na continuation of a prior `ListTopics` call, and that the system should\nreturn the next page of data.",
-                  "location": "query",
-                  "type": "string"
+                  "location": "path"
                 }
               },
-              "path": "v1beta2/{+project}/topics",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/pubsub"
-              ]
-            },
-            "get": {
-              "id": "pubsub.projects.topics.get",
-              "response": {
-                "$ref": "Topic"
-              },
-              "parameterOrder": [
-                "topic"
-              ],
-              "description": "Gets the configuration of a topic.",
-              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}",
-              "httpMethod": "GET",
-              "parameters": {
-                "topic": {
-                  "description": "The name of the topic to get.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/topics/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+topic}",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
               ]
             },
             "create": {
-              "id": "pubsub.projects.topics.create",
-              "response": {
-                "$ref": "Topic"
-              },
-              "parameterOrder": [
-                "name"
-              ],
               "description": "Creates the given topic with the given name.",
               "request": {
                 "$ref": "Topic"
               },
-              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}",
               "httpMethod": "PUT",
-              "parameters": {
-                "name": {
-                  "description": "The name of the topic. It must have the format\n`\"projects/{project}/topics/{topic}\"`. `{topic}` must start with a letter,\nand contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),\nunderscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent\nsigns (`%`). It must be between 3 and 255 characters in length, and it\nmust not start with `\"goog\"`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/topics/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "Topic"
               },
-              "path": "v1beta2/{+name}",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "parameters": {
+                "name": {
+                  "location": "path",
+                  "description": "The name of the topic. It must have the format\n`\"projects/{project}/topics/{topic}\"`. `{topic}` must start with a letter,\nand contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),\nunderscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent\nsigns (`%`). It must be between 3 and 255 characters in length, and it\nmust not start with `\"goog\"`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/topics/[^/]+$"
+                }
+              },
+              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}",
+              "id": "pubsub.projects.topics.create",
+              "path": "v1beta2/{+name}"
             },
             "setIamPolicy": {
+              "request": {
+                "$ref": "SetIamPolicyRequest"
+              },
+              "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "resource"
+              ],
+              "response": {
+                "$ref": "Policy"
+              },
+              "parameters": {
+                "resource": {
+                  "pattern": "^projects/[^/]+/topics/[^/]+$",
+                  "location": "path",
+                  "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}:setIamPolicy",
               "id": "pubsub.projects.topics.setIamPolicy",
+              "path": "v1beta2/{+resource}:setIamPolicy"
+            },
+            "getIamPolicy": {
+              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}:getIamPolicy",
+              "id": "pubsub.projects.topics.getIamPolicy",
+              "path": "v1beta2/{+resource}:getIamPolicy",
+              "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.",
+              "httpMethod": "GET",
               "response": {
                 "$ref": "Policy"
               },
               "parameterOrder": [
                 "resource"
               ],
-              "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
-              "request": {
-                "$ref": "SetIamPolicyRequest"
-              },
-              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}:setIamPolicy",
-              "httpMethod": "POST",
-              "parameters": {
-                "resource": {
-                  "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/topics/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+resource}:setIamPolicy",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "parameters": {
+                "resource": {
+                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/topics/[^/]+$",
+                  "location": "path"
+                }
+              }
             },
-            "delete": {
-              "id": "pubsub.projects.topics.delete",
+            "get": {
+              "path": "v1beta2/{+topic}",
+              "id": "pubsub.projects.topics.get",
+              "description": "Gets the configuration of a topic.",
               "response": {
-                "$ref": "Empty"
+                "$ref": "Topic"
               },
               "parameterOrder": [
                 "topic"
               ],
-              "description": "Deletes the topic with the given name. Returns `NOT_FOUND` if the topic\ndoes not exist. After a topic is deleted, a new topic may be created with\nthe same name; this is an entirely new topic with none of the old\nconfiguration or subscriptions. Existing subscriptions to this topic are\nnot deleted, but their `topic` field is set to `_deleted-topic_`.",
-              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}",
-              "httpMethod": "DELETE",
-              "parameters": {
-                "topic": {
-                  "description": "Name of the topic to delete.",
-                  "required": true,
-                  "pattern": "^projects/[^/]+/topics/[^/]+$",
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1beta2/{+topic}",
+              "httpMethod": "GET",
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
-              ]
+              ],
+              "parameters": {
+                "topic": {
+                  "description": "The name of the topic to get.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/topics/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}"
+            }
+          },
+          "resources": {
+            "subscriptions": {
+              "methods": {
+                "list": {
+                  "path": "v1beta2/{+topic}/subscriptions",
+                  "id": "pubsub.projects.topics.subscriptions.list",
+                  "description": "Lists the name of the subscriptions for this topic.",
+                  "parameterOrder": [
+                    "topic"
+                  ],
+                  "response": {
+                    "$ref": "ListTopicSubscriptionsResponse"
+                  },
+                  "httpMethod": "GET",
+                  "parameters": {
+                    "pageToken": {
+                      "location": "query",
+                      "description": "The value returned by the last `ListTopicSubscriptionsResponse`; indicates\nthat this is a continuation of a prior `ListTopicSubscriptions` call, and\nthat the system should return the next page of data.",
+                      "type": "string"
+                    },
+                    "pageSize": {
+                      "location": "query",
+                      "description": "Maximum number of subscription names to return.",
+                      "format": "int32",
+                      "type": "integer"
+                    },
+                    "topic": {
+                      "pattern": "^projects/[^/]+/topics/[^/]+$",
+                      "location": "path",
+                      "description": "The name of the topic that subscriptions are attached to.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/pubsub"
+                  ],
+                  "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}/subscriptions"
+                }
+              }
+            }
+          }
+        },
+        "subscriptions": {
+          "methods": {
+            "create": {
+              "httpMethod": "PUT",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "Subscription"
+              },
+              "parameters": {
+                "name": {
+                  "description": "The name of the subscription. It must have the format\n`\"projects/{project}/subscriptions/{subscription}\"`. `{subscription}` must\nstart with a letter, and contain only letters (`[A-Za-z]`), numbers\n(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),\nplus (`+`) or percent signs (`%`). It must be between 3 and 255 characters\nin length, and it must not start with `\"goog\"`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}",
+              "id": "pubsub.projects.subscriptions.create",
+              "path": "v1beta2/{+name}",
+              "request": {
+                "$ref": "Subscription"
+              },
+              "description": "Creates a subscription to a given topic.\nIf the subscription already exists, returns `ALREADY_EXISTS`.\nIf the corresponding topic doesn't exist, returns `NOT_FOUND`.\n\nIf the name is not provided in the request, the server will assign a random\nname for this subscription on the same project as the topic. Note that\nfor REST API requests, you must specify a name."
+            },
+            "setIamPolicy": {
+              "response": {
+                "$ref": "Policy"
+              },
+              "parameterOrder": [
+                "resource"
+              ],
+              "httpMethod": "POST",
+              "parameters": {
+                "resource": {
+                  "location": "path",
+                  "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:setIamPolicy",
+              "path": "v1beta2/{+resource}:setIamPolicy",
+              "id": "pubsub.projects.subscriptions.setIamPolicy",
+              "request": {
+                "$ref": "SetIamPolicyRequest"
+              },
+              "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy."
+            },
+            "getIamPolicy": {
+              "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.",
+              "response": {
+                "$ref": "Policy"
+              },
+              "parameterOrder": [
+                "resource"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "parameters": {
+                "resource": {
+                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:getIamPolicy",
+              "path": "v1beta2/{+resource}:getIamPolicy",
+              "id": "pubsub.projects.subscriptions.getIamPolicy"
+            },
+            "modifyAckDeadline": {
+              "description": "Modifies the ack deadline for a specific message. This method is useful\nto indicate that more time is needed to process a message by the\nsubscriber, or to make the message available for redelivery if the\nprocessing was interrupted. Note that this does not modify the\nsubscription-level `ackDeadlineSeconds` used for subsequent messages.",
+              "request": {
+                "$ref": "ModifyAckDeadlineRequest"
+              },
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameterOrder": [
+                "subscription"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "parameters": {
+                "subscription": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "location": "path",
+                  "description": "The name of the subscription."
+                }
+              },
+              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyAckDeadline",
+              "path": "v1beta2/{+subscription}:modifyAckDeadline",
+              "id": "pubsub.projects.subscriptions.modifyAckDeadline"
+            },
+            "acknowledge": {
+              "request": {
+                "$ref": "AcknowledgeRequest"
+              },
+              "description": "Acknowledges the messages associated with the `ack_ids` in the\n`AcknowledgeRequest`. The Pub/Sub system can remove the relevant messages\nfrom the subscription.\n\nAcknowledging a message whose ack deadline has expired may succeed,\nbut such a message may be redelivered later. Acknowledging a message more\nthan once will not result in an error.",
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "subscription"
+              ],
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameters": {
+                "subscription": {
+                  "location": "path",
+                  "description": "The subscription whose message is being acknowledged.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:acknowledge",
+              "id": "pubsub.projects.subscriptions.acknowledge",
+              "path": "v1beta2/{+subscription}:acknowledge"
+            },
+            "get": {
+              "parameterOrder": [
+                "subscription"
+              ],
+              "response": {
+                "$ref": "Subscription"
+              },
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "parameters": {
+                "subscription": {
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "location": "path",
+                  "description": "The name of the subscription to get.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}",
+              "path": "v1beta2/{+subscription}",
+              "id": "pubsub.projects.subscriptions.get",
+              "description": "Gets the configuration details of a subscription."
             },
             "testIamPermissions": {
-              "id": "pubsub.projects.topics.testIamPermissions",
               "response": {
                 "$ref": "TestIamPermissionsResponse"
               },
               "parameterOrder": [
                 "resource"
               ],
-              "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
-              "request": {
-                "$ref": "TestIamPermissionsRequest"
-              },
-              "flatPath": "v1beta2/projects/{projectsId}/topics/{topicsId}:testIamPermissions",
               "httpMethod": "POST",
               "parameters": {
                 "resource": {
-                  "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
                   "required": true,
-                  "pattern": "^projects/[^/]+/topics/[^/]+$",
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
                   "location": "path",
-                  "type": "string"
+                  "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`."
                 }
               },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:testIamPermissions",
               "path": "v1beta2/{+resource}:testIamPermissions",
+              "id": "pubsub.projects.subscriptions.testIamPermissions",
+              "request": {
+                "$ref": "TestIamPermissionsRequest"
+              },
+              "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error."
+            },
+            "modifyPushConfig": {
+              "description": "Modifies the `PushConfig` for a specified subscription.\n\nThis may be used to change a push subscription to a pull one (signified by\nan empty `PushConfig`) or vice versa, or change the endpoint URL and other\nattributes of a push subscription. Messages will accumulate for delivery\ncontinuously through the call regardless of changes to the `PushConfig`.",
+              "request": {
+                "$ref": "ModifyPushConfigRequest"
+              },
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "subscription"
+              ],
+              "response": {
+                "$ref": "Empty"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "parameters": {
+                "subscription": {
+                  "description": "The name of the subscription.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyPushConfig",
+              "id": "pubsub.projects.subscriptions.modifyPushConfig",
+              "path": "v1beta2/{+subscription}:modifyPushConfig"
+            },
+            "pull": {
+              "response": {
+                "$ref": "PullResponse"
+              },
+              "parameterOrder": [
+                "subscription"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "parameters": {
+                "subscription": {
+                  "location": "path",
+                  "description": "The subscription from which messages should be pulled.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$"
+                }
+              },
+              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:pull",
+              "path": "v1beta2/{+subscription}:pull",
+              "id": "pubsub.projects.subscriptions.pull",
+              "description": "Pulls messages from the server. Returns an empty list if there are no\nmessages available in the backlog. The server may return `UNAVAILABLE` if\nthere are too many concurrent pull requests pending for the given\nsubscription.",
+              "request": {
+                "$ref": "PullRequest"
+              }
+            },
+            "delete": {
+              "flatPath": "v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}",
+              "path": "v1beta2/{+subscription}",
+              "id": "pubsub.projects.subscriptions.delete",
+              "description": "Deletes an existing subscription. All pending messages in the subscription\nare immediately dropped. Calls to `Pull` after deletion will return\n`NOT_FOUND`. After a subscription is deleted, a new one may be created with\nthe same name, but the new one has no association with the old\nsubscription, or its topic unless the same topic is specified.",
+              "response": {
+                "$ref": "Empty"
+              },
+              "httpMethod": "DELETE",
+              "parameterOrder": [
+                "subscription"
+              ],
+              "parameters": {
+                "subscription": {
+                  "location": "path",
+                  "description": "The subscription to delete.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/subscriptions/[^/]+$"
+                }
+              },
               "scopes": [
                 "https://www.googleapis.com/auth/cloud-platform",
                 "https://www.googleapis.com/auth/pubsub"
               ]
+            },
+            "list": {
+              "description": "Lists matching subscriptions.",
+              "response": {
+                "$ref": "ListSubscriptionsResponse"
+              },
+              "parameterOrder": [
+                "project"
+              ],
+              "httpMethod": "GET",
+              "parameters": {
+                "pageToken": {
+                  "location": "query",
+                  "description": "The value returned by the last `ListSubscriptionsResponse`; indicates that\nthis is a continuation of a prior `ListSubscriptions` call, and that the\nsystem should return the next page of data.",
+                  "type": "string"
+                },
+                "pageSize": {
+                  "description": "Maximum number of subscriptions to return.",
+                  "format": "int32",
+                  "type": "integer",
+                  "location": "query"
+                },
+                "project": {
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path",
+                  "description": "The name of the cloud project that subscriptions belong to.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/pubsub"
+              ],
+              "flatPath": "v1beta2/projects/{projectsId}/subscriptions",
+              "path": "v1beta2/{+project}/subscriptions",
+              "id": "pubsub.projects.subscriptions.list"
             }
           }
         }
       }
     }
   },
-  "schemas": {
-    "Topic": {
-      "description": "A topic resource.",
-      "type": "object",
-      "properties": {
-        "name": {
-          "description": "The name of the topic. It must have the format\n`\"projects/{project}/topics/{topic}\"`. `{topic}` must start with a letter,\nand contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),\nunderscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent\nsigns (`%`). It must be between 3 and 255 characters in length, and it\nmust not start with `\"goog\"`.",
-          "type": "string"
-        }
-      },
-      "id": "Topic"
+  "parameters": {
+    "alt": {
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string"
     },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "key": {
+      "type": "string",
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token."
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "bearer_token": {
+      "location": "query",
+      "description": "OAuth bearer token.",
+      "type": "string"
+    },
+    "oauth_token": {
+      "location": "query",
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string"
+    },
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    },
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    }
+  },
+  "schemas": {
     "SetIamPolicyRequest": {
       "description": "Request message for `SetIamPolicy` method.",
       "type": "object",
@@ -644,104 +731,100 @@
       },
       "id": "SetIamPolicyRequest"
     },
-    "ReceivedMessage": {
-      "description": "A message and its corresponding acknowledgment ID.",
+    "PubsubMessage": {
+      "description": "A message data and its attributes. The message payload must not be empty;\nit must contain either a non-empty data field, or at least one attribute.",
       "type": "object",
       "properties": {
-        "ackId": {
-          "description": "This ID can be used to acknowledge the received message.",
+        "attributes": {
+          "additionalProperties": {
+            "type": "string"
+          },
+          "description": "Optional attributes for this message.",
+          "type": "object"
+        },
+        "messageId": {
+          "description": "ID of this message, assigned by the server when the message is published.\nGuaranteed to be unique within the topic. This value may be read by a\nsubscriber that receives a `PubsubMessage` via a `Pull` call or a push\ndelivery. It must not be populated by the publisher in a `Publish` call.",
           "type": "string"
         },
-        "message": {
-          "description": "The message.",
-          "$ref": "PubsubMessage"
+        "publishTime": {
+          "description": "The time at which the message was published, populated by the server when\nit receives the `Publish` call. It must not be populated by the\npublisher in a `Publish` call.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "data": {
+          "type": "string",
+          "description": "The message payload. For JSON requests, the value of this field must be\n[base64-encoded](https://tools.ietf.org/html/rfc4648).",
+          "format": "byte"
         }
       },
-      "id": "ReceivedMessage"
+      "id": "PubsubMessage"
     },
-    "PublishRequest": {
-      "description": "Request for the Publish method.",
+    "ModifyPushConfigRequest": {
       "type": "object",
       "properties": {
-        "messages": {
-          "description": "The messages to publish.",
-          "type": "array",
-          "items": {
-            "$ref": "PubsubMessage"
-          }
+        "pushConfig": {
+          "description": "The push configuration for future deliveries.\n\nAn empty `pushConfig` indicates that the Pub/Sub system should\nstop pushing messages from the given subscription and allow\nmessages to be pulled and acknowledged - effectively pausing\nthe subscription if `Pull` is not called.",
+          "$ref": "PushConfig"
         }
       },
-      "id": "PublishRequest"
+      "id": "ModifyPushConfigRequest",
+      "description": "Request for the ModifyPushConfig method."
     },
-    "TestIamPermissionsResponse": {
-      "description": "Response message for `TestIamPermissions` method.",
+    "Binding": {
       "type": "object",
       "properties": {
-        "permissions": {
-          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
+        "members": {
+          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
           "type": "array",
           "items": {
             "type": "string"
           }
+        },
+        "role": {
+          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
+          "type": "string"
         }
       },
-      "id": "TestIamPermissionsResponse"
+      "id": "Binding",
+      "description": "Associates `members` with a `role`."
     },
-    "PublishResponse": {
-      "description": "Response for the `Publish` method.",
+    "ListTopicsResponse": {
+      "description": "Response for the `ListTopics` method.",
       "type": "object",
       "properties": {
-        "messageIds": {
-          "description": "The server-assigned ID of each published message, in the same order as\nthe messages in the request. IDs are guaranteed to be unique within\nthe topic.",
+        "topics": {
+          "description": "The resulting topics.",
           "type": "array",
           "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "PublishResponse"
-    },
-    "ListSubscriptionsResponse": {
-      "description": "Response for the `ListSubscriptions` method.",
-      "type": "object",
-      "properties": {
-        "subscriptions": {
-          "description": "The subscriptions that match the request.",
-          "type": "array",
-          "items": {
-            "$ref": "Subscription"
+            "$ref": "Topic"
           }
         },
         "nextPageToken": {
-          "description": "If not empty, indicates that there may be more subscriptions that match\nthe request; this value should be passed in a new\n`ListSubscriptionsRequest` to get more subscriptions.",
+          "description": "If not empty, indicates that there may be more topics that match the\nrequest; this value should be passed in a new `ListTopicsRequest`.",
           "type": "string"
         }
       },
-      "id": "ListSubscriptionsResponse"
+      "id": "ListTopicsResponse"
     },
-    "Policy": {
-      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
+    "Empty": {
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
+      "type": "object",
+      "properties": {},
+      "id": "Empty"
+    },
+    "AcknowledgeRequest": {
+      "description": "Request for the Acknowledge method.",
       "type": "object",
       "properties": {
-        "bindings": {
-          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
+        "ackIds": {
+          "description": "The acknowledgment ID for the messages being acknowledged that was returned\nby the Pub/Sub system in the `Pull` response. Must not be empty.",
           "type": "array",
           "items": {
-            "$ref": "Binding"
+            "type": "string"
           }
-        },
-        "etag": {
-          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
-          "type": "string",
-          "format": "byte"
-        },
-        "version": {
-          "description": "Version of the `Policy`. The default version is 0.",
-          "type": "integer",
-          "format": "int32"
         }
       },
-      "id": "Policy"
+      "id": "AcknowledgeRequest"
     },
     "ListTopicSubscriptionsResponse": {
       "description": "Response for the `ListTopicSubscriptions` method.",
@@ -761,85 +844,67 @@
       },
       "id": "ListTopicSubscriptionsResponse"
     },
-    "Subscription": {
-      "description": "A subscription resource.",
+    "PullResponse": {
+      "description": "Response for the `Pull` method.",
       "type": "object",
       "properties": {
-        "pushConfig": {
-          "description": "If push delivery is used with this subscription, this field is\nused to configure it. An empty `pushConfig` signifies that the subscriber\nwill pull and ack messages using API methods.",
-          "$ref": "PushConfig"
-        },
-        "topic": {
-          "description": "The name of the topic from which this subscription is receiving messages.\nThe value of this field will be `_deleted-topic_` if the topic has been\ndeleted.",
-          "type": "string"
-        },
-        "ackDeadlineSeconds": {
-          "description": "This value is the maximum time after a subscriber receives a message\nbefore the subscriber should acknowledge the message. After message\ndelivery but before the ack deadline expires and before the message is\nacknowledged, it is an outstanding message and will not be delivered\nagain during that time (on a best-effort basis).\n\nFor pull subscriptions, this value is used as the initial value for the ack\ndeadline. To override this value for a given message, call\n`ModifyAckDeadline` with the corresponding `ack_id` if using pull.\nThe maximum custom deadline you can specify is 600 seconds (10 minutes).\n\nFor push delivery, this value is also used to set the request timeout for\nthe call to the push endpoint.\n\nIf the subscriber never acknowledges the message, the Pub/Sub\nsystem will eventually redeliver the message.\n\nIf this parameter is 0, a default value of 10 seconds is used.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "name": {
-          "description": "The name of the subscription. It must have the format\n`\"projects/{project}/subscriptions/{subscription}\"`. `{subscription}` must\nstart with a letter, and contain only letters (`[A-Za-z]`), numbers\n(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),\nplus (`+`) or percent signs (`%`). It must be between 3 and 255 characters\nin length, and it must not start with `\"goog\"`.",
-          "type": "string"
+        "receivedMessages": {
+          "type": "array",
+          "items": {
+            "$ref": "ReceivedMessage"
+          },
+          "description": "Received Pub/Sub messages. The Pub/Sub system will return zero messages if\nthere are no more available in the backlog. The Pub/Sub system may return\nfewer than the `maxMessages` requested even if there are more messages\navailable in the backlog."
         }
       },
-      "id": "Subscription"
+      "id": "PullResponse"
     },
-    "ModifyAckDeadlineRequest": {
-      "description": "Request for the ModifyAckDeadline method.",
+    "ReceivedMessage": {
+      "description": "A message and its corresponding acknowledgment ID.",
       "type": "object",
       "properties": {
-        "ackDeadlineSeconds": {
-          "description": "The new ack deadline with respect to the time this request was sent to\nthe Pub/Sub system. Must be \u003e= 0. For example, if the value is 10, the new\nack deadline will expire 10 seconds after the `ModifyAckDeadline` call\nwas made. Specifying zero may immediately make the message available for\nanother pull request.",
-          "type": "integer",
-          "format": "int32"
+        "message": {
+          "$ref": "PubsubMessage",
+          "description": "The message."
         },
         "ackId": {
-          "description": "The acknowledgment ID. Either this or ack_ids must be populated, but not\nboth.",
+          "description": "This ID can be used to acknowledge the received message.",
           "type": "string"
-        },
-        "ackIds": {
-          "description": "List of acknowledgment IDs.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
         }
       },
-      "id": "ModifyAckDeadlineRequest"
-    },
-    "TestIamPermissionsRequest": {
-      "description": "Request message for `TestIamPermissions` method.",
-      "type": "object",
-      "properties": {
-        "permissions": {
-          "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "TestIamPermissionsRequest"
+      "id": "ReceivedMessage"
     },
     "PushConfig": {
       "description": "Configuration for a push delivery endpoint.",
       "type": "object",
       "properties": {
-        "attributes": {
-          "description": "Endpoint configuration attributes.\n\nEvery endpoint has a set of API supported attributes that can be used to\ncontrol different aspects of the message delivery.\n\nThe currently supported attribute is `x-goog-version`, which you can\nuse to change the format of the push message. This attribute\nindicates the version of the data expected by the endpoint. This\ncontrols the shape of the envelope (i.e. its fields and metadata).\nThe endpoint version is based on the version of the Pub/Sub\nAPI.\n\nIf not present during the `CreateSubscription` call, it will default to\nthe version of the API used to make such call. If not present during a\n`ModifyPushConfig` call, its value will not be changed. `GetSubscription`\ncalls will always return a valid version, even if the subscription was\ncreated without this attribute.\n\nThe possible values for this attribute are:\n\n* `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.\n* `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
         "pushEndpoint": {
           "description": "A URL locating the endpoint to which messages should be pushed.\nFor example, a Webhook endpoint might use \"https://example.com/push\".",
           "type": "string"
+        },
+        "attributes": {
+          "description": "Endpoint configuration attributes.\n\nEvery endpoint has a set of API supported attributes that can be used to\ncontrol different aspects of the message delivery.\n\nThe currently supported attribute is `x-goog-version`, which you can\nuse to change the format of the push message. This attribute\nindicates the version of the data expected by the endpoint. This\ncontrols the shape of the envelope (i.e. its fields and metadata).\nThe endpoint version is based on the version of the Pub/Sub\nAPI.\n\nIf not present during the `CreateSubscription` call, it will default to\nthe version of the API used to make such call. If not present during a\n`ModifyPushConfig` call, its value will not be changed. `GetSubscription`\ncalls will always return a valid version, even if the subscription was\ncreated without this attribute.\n\nThe possible values for this attribute are:\n\n* `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.\n* `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "string"
+          }
         }
       },
       "id": "PushConfig"
     },
+    "TestIamPermissionsResponse": {
+      "description": "Response message for `TestIamPermissions` method.",
+      "type": "object",
+      "properties": {
+        "permissions": {
+          "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "TestIamPermissionsResponse"
+    },
     "PullRequest": {
       "description": "Request for the `Pull` method.",
       "type": "object",
@@ -850,225 +915,160 @@
         },
         "maxMessages": {
           "description": "The maximum number of messages returned for this request. The Pub/Sub\nsystem may return fewer than the number specified.",
-          "type": "integer",
-          "format": "int32"
+          "format": "int32",
+          "type": "integer"
         }
       },
       "id": "PullRequest"
     },
-    "ModifyPushConfigRequest": {
-      "description": "Request for the ModifyPushConfig method.",
-      "type": "object",
-      "properties": {
-        "pushConfig": {
-          "description": "The push configuration for future deliveries.\n\nAn empty `pushConfig` indicates that the Pub/Sub system should\nstop pushing messages from the given subscription and allow\nmessages to be pulled and acknowledged - effectively pausing\nthe subscription if `Pull` is not called.",
-          "$ref": "PushConfig"
-        }
-      },
-      "id": "ModifyPushConfigRequest"
-    },
-    "PullResponse": {
-      "description": "Response for the `Pull` method.",
-      "type": "object",
-      "properties": {
-        "receivedMessages": {
-          "description": "Received Pub/Sub messages. The Pub/Sub system will return zero messages if\nthere are no more available in the backlog. The Pub/Sub system may return\nfewer than the `maxMessages` requested even if there are more messages\navailable in the backlog.",
-          "type": "array",
-          "items": {
-            "$ref": "ReceivedMessage"
-          }
-        }
-      },
-      "id": "PullResponse"
-    },
-    "PubsubMessage": {
-      "description": "A message data and its attributes. The message payload must not be empty;\nit must contain either a non-empty data field, or at least one attribute.",
-      "type": "object",
-      "properties": {
-        "data": {
-          "description": "The message payload. For JSON requests, the value of this field must be\n[base64-encoded](https://tools.ietf.org/html/rfc4648).",
-          "type": "string",
-          "format": "byte"
-        },
-        "attributes": {
-          "description": "Optional attributes for this message.",
-          "additionalProperties": {
-            "type": "string"
-          },
-          "type": "object"
-        },
-        "messageId": {
-          "description": "ID of this message, assigned by the server when the message is published.\nGuaranteed to be unique within the topic. This value may be read by a\nsubscriber that receives a `PubsubMessage` via a `Pull` call or a push\ndelivery. It must not be populated by the publisher in a `Publish` call.",
-          "type": "string"
-        },
-        "publishTime": {
-          "description": "The time at which the message was published, populated by the server when\nit receives the `Publish` call. It must not be populated by the\npublisher in a `Publish` call.",
-          "type": "string",
-          "format": "google-datetime"
-        }
-      },
-      "id": "PubsubMessage"
-    },
-    "AcknowledgeRequest": {
-      "description": "Request for the Acknowledge method.",
-      "type": "object",
-      "properties": {
-        "ackIds": {
-          "description": "The acknowledgment ID for the messages being acknowledged that was returned\nby the Pub/Sub system in the `Pull` response. Must not be empty.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "AcknowledgeRequest"
-    },
-    "Empty": {
-      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
-      "type": "object",
-      "properties": {},
-      "id": "Empty"
-    },
-    "ListTopicsResponse": {
-      "description": "Response for the `ListTopics` method.",
+    "ListSubscriptionsResponse": {
+      "description": "Response for the `ListSubscriptions` method.",
       "type": "object",
       "properties": {
         "nextPageToken": {
-          "description": "If not empty, indicates that there may be more topics that match the\nrequest; this value should be passed in a new `ListTopicsRequest`.",
+          "description": "If not empty, indicates that there may be more subscriptions that match\nthe request; this value should be passed in a new\n`ListSubscriptionsRequest` to get more subscriptions.",
           "type": "string"
         },
-        "topics": {
-          "description": "The resulting topics.",
+        "subscriptions": {
+          "description": "The subscriptions that match the request.",
           "type": "array",
           "items": {
-            "$ref": "Topic"
+            "$ref": "Subscription"
           }
         }
       },
-      "id": "ListTopicsResponse"
+      "id": "ListSubscriptionsResponse"
     },
-    "Binding": {
-      "description": "Associates `members` with a `role`.",
+    "PublishRequest": {
+      "properties": {
+        "messages": {
+          "type": "array",
+          "items": {
+            "$ref": "PubsubMessage"
+          },
+          "description": "The messages to publish."
+        }
+      },
+      "id": "PublishRequest",
+      "description": "Request for the Publish method.",
+      "type": "object"
+    },
+    "PublishResponse": {
+      "description": "Response for the `Publish` method.",
       "type": "object",
       "properties": {
-        "members": {
-          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
+        "messageIds": {
+          "description": "The server-assigned ID of each published message, in the same order as\nthe messages in the request. IDs are guaranteed to be unique within\nthe topic.",
           "type": "array",
           "items": {
             "type": "string"
           }
+        }
+      },
+      "id": "PublishResponse"
+    },
+    "Subscription": {
+      "description": "A subscription resource.",
+      "type": "object",
+      "properties": {
+        "topic": {
+          "description": "The name of the topic from which this subscription is receiving messages.\nThe value of this field will be `_deleted-topic_` if the topic has been\ndeleted.",
+          "type": "string"
         },
-        "role": {
-          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
+        "pushConfig": {
+          "$ref": "PushConfig",
+          "description": "If push delivery is used with this subscription, this field is\nused to configure it. An empty `pushConfig` signifies that the subscriber\nwill pull and ack messages using API methods."
+        },
+        "ackDeadlineSeconds": {
+          "description": "This value is the maximum time after a subscriber receives a message\nbefore the subscriber should acknowledge the message. After message\ndelivery but before the ack deadline expires and before the message is\nacknowledged, it is an outstanding message and will not be delivered\nagain during that time (on a best-effort basis).\n\nFor pull subscriptions, this value is used as the initial value for the ack\ndeadline. To override this value for a given message, call\n`ModifyAckDeadline` with the corresponding `ack_id` if using pull.\nThe maximum custom deadline you can specify is 600 seconds (10 minutes).\n\nFor push delivery, this value is also used to set the request timeout for\nthe call to the push endpoint.\n\nIf the subscriber never acknowledges the message, the Pub/Sub\nsystem will eventually redeliver the message.\n\nIf this parameter is 0, a default value of 10 seconds is used.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "name": {
+          "description": "The name of the subscription. It must have the format\n`\"projects/{project}/subscriptions/{subscription}\"`. `{subscription}` must\nstart with a letter, and contain only letters (`[A-Za-z]`), numbers\n(`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),\nplus (`+`) or percent signs (`%`). It must be between 3 and 255 characters\nin length, and it must not start with `\"goog\"`.",
           "type": "string"
         }
       },
-      "id": "Binding"
+      "id": "Subscription"
+    },
+    "TestIamPermissionsRequest": {
+      "description": "Request message for `TestIamPermissions` method.",
+      "type": "object",
+      "properties": {
+        "permissions": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions)."
+        }
+      },
+      "id": "TestIamPermissionsRequest"
+    },
+    "Topic": {
+      "description": "A topic resource.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The name of the topic. It must have the format\n`\"projects/{project}/topics/{topic}\"`. `{topic}` must start with a letter,\nand contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),\nunderscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent\nsigns (`%`). It must be between 3 and 255 characters in length, and it\nmust not start with `\"goog\"`.",
+          "type": "string"
+        }
+      },
+      "id": "Topic"
+    },
+    "Policy": {
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
+      "type": "object",
+      "properties": {
+        "etag": {
+          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
+          "format": "byte",
+          "type": "string"
+        },
+        "version": {
+          "description": "Version of the `Policy`. The default version is 0.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "bindings": {
+          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
+          "type": "array",
+          "items": {
+            "$ref": "Binding"
+          }
+        }
+      },
+      "id": "Policy"
+    },
+    "ModifyAckDeadlineRequest": {
+      "description": "Request for the ModifyAckDeadline method.",
+      "type": "object",
+      "properties": {
+        "ackId": {
+          "description": "The acknowledgment ID. Either this or ack_ids must be populated, but not\nboth.",
+          "type": "string"
+        },
+        "ackDeadlineSeconds": {
+          "description": "The new ack deadline with respect to the time this request was sent to\nthe Pub/Sub system. Must be \u003e= 0. For example, if the value is 10, the new\nack deadline will expire 10 seconds after the `ModifyAckDeadline` call\nwas made. Specifying zero may immediately make the message available for\nanother pull request.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "ackIds": {
+          "description": "List of acknowledgment IDs.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "ModifyAckDeadlineRequest"
     }
   },
-  "revision": "20170105",
-  "basePath": "",
+  "protocol": "rest",
   "icons": {
-    "x32": "http://www.google.com/images/icons/product/search-32.gif",
-    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
   },
-  "discoveryVersion": "v1",
-  "baseUrl": "https://pubsub.googleapis.com/",
-  "name": "pubsub",
-  "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    }
-  },
-  "documentationLink": "https://cloud.google.com/pubsub/docs",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
-  "servicePath": "",
-  "ownerName": "Google",
   "version": "v1beta2",
-  "rootUrl": "https://pubsub.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "baseUrl": "https://pubsub.googleapis.com/"
 }
diff --git a/pubsub/v1beta2/pubsub-gen.go b/pubsub/v1beta2/pubsub-gen.go
index 12ba05f..f6cbb0b 100644
--- a/pubsub/v1beta2/pubsub-gen.go
+++ b/pubsub/v1beta2/pubsub-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Subscriptions = NewProjectsSubscriptionsService(s)
@@ -1108,6 +1113,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.acknowledgerequest)
 	if err != nil {
@@ -1252,6 +1258,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscription)
 	if err != nil {
@@ -1394,6 +1401,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta2/{+subscription}")
@@ -1531,6 +1539,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1674,6 +1683,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1831,6 +1841,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2002,6 +2013,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.modifyackdeadlinerequest)
 	if err != nil {
@@ -2148,6 +2160,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.modifypushconfigrequest)
 	if err != nil {
@@ -2290,6 +2303,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pullrequest)
 	if err != nil {
@@ -2428,6 +2442,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -2568,6 +2583,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -2704,6 +2720,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.topic)
 	if err != nil {
@@ -2846,6 +2863,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta2/{+topic}")
@@ -2983,6 +3001,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3126,6 +3145,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3283,6 +3303,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3450,6 +3471,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.publishrequest)
 	if err != nil {
@@ -3588,6 +3610,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -3728,6 +3751,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -3890,6 +3914,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/qpxexpress/v1/qpxexpress-gen.go b/qpxexpress/v1/qpxexpress-gen.go
index 84605ed..b14aeb2 100644
--- a/qpxexpress/v1/qpxexpress-gen.go
+++ b/qpxexpress/v1/qpxexpress-gen.go
@@ -55,9 +55,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Trips *TripsService
 }
@@ -69,6 +70,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewTripsService(s *Service) *TripsService {
 	rs := &TripsService{s: s}
 	return rs
@@ -1293,6 +1298,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.tripssearchrequest)
 	if err != nil {
diff --git a/replicapool/v1beta1/replicapool-gen.go b/replicapool/v1beta1/replicapool-gen.go
index 9518bfa..f0354f5 100644
--- a/replicapool/v1beta1/replicapool-gen.go
+++ b/replicapool/v1beta1/replicapool-gen.go
@@ -79,9 +79,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Pools *PoolsService
 
@@ -95,6 +96,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewPoolsService(s *Service) *PoolsService {
 	rs := &PoolsService{s: s}
 	return rs
@@ -1118,6 +1123,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.poolsdeleterequest)
 	if err != nil {
@@ -1254,6 +1260,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1405,6 +1412,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pool)
 	if err != nil {
@@ -1575,6 +1583,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1764,6 +1773,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectName}/zones/{zone}/pools/{poolName}/resize")
@@ -1917,6 +1927,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.template)
 	if err != nil {
@@ -2046,6 +2057,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.replicasdeleterequest)
 	if err != nil {
@@ -2220,6 +2232,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2406,6 +2419,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2594,6 +2608,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectName}/zones/{zone}/pools/{poolName}/replicas/{replicaName}/restart")
diff --git a/replicapool/v1beta2/replicapool-gen.go b/replicapool/v1beta2/replicapool-gen.go
index a52b3be..c4a420c 100644
--- a/replicapool/v1beta2/replicapool-gen.go
+++ b/replicapool/v1beta2/replicapool-gen.go
@@ -71,9 +71,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	InstanceGroupManagers *InstanceGroupManagersService
 
@@ -87,6 +88,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewInstanceGroupManagersService(s *Service) *InstanceGroupManagersService {
 	rs := &InstanceGroupManagersService{s: s}
 	return rs
@@ -804,6 +809,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersabandoninstancesrequest)
 	if err != nil {
@@ -962,6 +968,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}")
@@ -1114,6 +1121,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersdeleteinstancesrequest)
 	if err != nil {
@@ -1280,6 +1288,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1434,6 +1443,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanager)
 	if err != nil {
@@ -1622,6 +1632,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1809,6 +1820,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagersrecreateinstancesrequest)
 	if err != nil {
@@ -1968,6 +1980,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize")
@@ -2127,6 +2140,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssetinstancetemplaterequest)
 	if err != nil {
@@ -2286,6 +2300,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancegroupmanagerssettargetpoolsrequest)
 	if err != nil {
@@ -2452,6 +2467,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2635,6 +2651,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/replicapoolupdater/v1beta1/replicapoolupdater-gen.go b/replicapoolupdater/v1beta1/replicapoolupdater-gen.go
index 750c013..3c44f86 100644
--- a/replicapoolupdater/v1beta1/replicapoolupdater-gen.go
+++ b/replicapoolupdater/v1beta1/replicapoolupdater-gen.go
@@ -71,9 +71,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	RollingUpdates *RollingUpdatesService
 
@@ -87,6 +88,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewRollingUpdatesService(s *Service) *RollingUpdatesService {
 	rs := &RollingUpdatesService{s: s}
 	return rs
@@ -850,6 +855,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/cancel")
@@ -1007,6 +1013,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1158,6 +1165,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.rollingupdate)
 	if err != nil {
@@ -1337,6 +1345,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1555,6 +1564,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1748,6 +1758,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/pause")
@@ -1895,6 +1906,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/resume")
@@ -2043,6 +2055,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/rollback")
@@ -2199,6 +2212,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2380,6 +2394,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/reseller/v1/reseller-gen.go b/reseller/v1/reseller-gen.go
index 7d4c2af..a7a6a2b 100644
--- a/reseller/v1/reseller-gen.go
+++ b/reseller/v1/reseller-gen.go
@@ -65,9 +65,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Customers *CustomersService
 
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewCustomersService(s *Service) *CustomersService {
 	rs := &CustomersService{s: s}
 	return rs
@@ -657,6 +662,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -792,6 +798,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.customer)
 	if err != nil {
@@ -919,6 +926,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.customer)
 	if err != nil {
@@ -1053,6 +1061,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.customer)
 	if err != nil {
@@ -1187,6 +1196,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customers/{customerId}/subscriptions/{subscriptionId}/activate")
@@ -1322,6 +1332,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.changeplanrequest)
 	if err != nil {
@@ -1465,6 +1476,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.renewalsettings)
 	if err != nil {
@@ -1608,6 +1620,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.seats)
 	if err != nil {
@@ -1750,6 +1763,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customers/{customerId}/subscriptions/{subscriptionId}")
@@ -1885,6 +1899,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2030,6 +2045,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscription)
 	if err != nil {
@@ -2214,6 +2230,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2380,6 +2397,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customers/{customerId}/subscriptions/{subscriptionId}/startPaidService")
@@ -2513,6 +2531,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "customers/{customerId}/subscriptions/{subscriptionId}/suspend")
diff --git a/resourceviews/v1beta1/resourceviews-gen.go b/resourceviews/v1beta1/resourceviews-gen.go
index 27ac84b..f56ca7b 100644
--- a/resourceviews/v1beta1/resourceviews-gen.go
+++ b/resourceviews/v1beta1/resourceviews-gen.go
@@ -79,9 +79,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	RegionViews *RegionViewsService
 
@@ -95,6 +96,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewRegionViewsService(s *Service) *RegionViewsService {
 	rs := &RegionViewsService{s: s}
 	return rs
@@ -582,6 +587,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regionviewsaddresourcesrequest)
 	if err != nil {
@@ -707,6 +713,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectName}/regions/{region}/resourceViews/{resourceViewName}")
@@ -835,6 +842,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -986,6 +994,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourceview)
 	if err != nil {
@@ -1157,6 +1166,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1352,6 +1362,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectName}/regions/{region}/resourceViews/{resourceViewName}/resources")
@@ -1537,6 +1548,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.regionviewsremoveresourcesrequest)
 	if err != nil {
@@ -1664,6 +1676,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.zoneviewsaddresourcesrequest)
 	if err != nil {
@@ -1789,6 +1802,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectName}/zones/{zone}/resourceViews/{resourceViewName}")
@@ -1917,6 +1931,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2068,6 +2083,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourceview)
 	if err != nil {
@@ -2239,6 +2255,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2434,6 +2451,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectName}/zones/{zone}/resourceViews/{resourceViewName}/resources")
@@ -2619,6 +2637,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.zoneviewsremoveresourcesrequest)
 	if err != nil {
diff --git a/resourceviews/v1beta2/resourceviews-gen.go b/resourceviews/v1beta2/resourceviews-gen.go
index 79f061d..32dede3 100644
--- a/resourceviews/v1beta2/resourceviews-gen.go
+++ b/resourceviews/v1beta2/resourceviews-gen.go
@@ -79,9 +79,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	ZoneOperations *ZoneOperationsService
 
@@ -95,6 +96,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewZoneOperationsService(s *Service) *ZoneOperationsService {
 	rs := &ZoneOperationsService{s: s}
 	return rs
@@ -840,6 +845,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1027,6 +1033,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1214,6 +1221,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.zoneviewsaddresourcesrequest)
 	if err != nil {
@@ -1367,6 +1375,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/resourceViews/{resourceView}")
@@ -1523,6 +1532,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1683,6 +1693,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/resourceViews/{resourceView}/getService")
@@ -1833,6 +1844,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourceview)
 	if err != nil {
@@ -2004,6 +2016,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2243,6 +2256,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2465,6 +2479,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.zoneviewsremoveresourcesrequest)
 	if err != nil {
@@ -2621,6 +2636,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.zoneviewssetservicerequest)
 	if err != nil {
diff --git a/runtimeconfig/v1/runtimeconfig-api.json b/runtimeconfig/v1/runtimeconfig-api.json
index 1a081f4..52d19f3 100644
--- a/runtimeconfig/v1/runtimeconfig-api.json
+++ b/runtimeconfig/v1/runtimeconfig-api.json
@@ -1,45 +1,36 @@
 {
-  "version": "v1",
-  "baseUrl": "https://runtimeconfig.googleapis.com/",
-  "servicePath": "",
-  "description": "Provides capabilities for dynamic configuration and coordination for applications running on Google Cloud Platform.\n",
-  "kind": "discovery#restDescription",
-  "basePath": "",
-  "id": "runtimeconfig:v1",
-  "documentationLink": "https://cloud.google.com/deployment-manager/runtime-configurator/",
-  "revision": "20170123",
   "discoveryVersion": "v1",
   "version_module": "True",
   "schemas": {
     "CancelOperationRequest": {
+      "description": "The request message for Operations.CancelOperation.",
       "type": "object",
       "properties": {},
-      "id": "CancelOperationRequest",
-      "description": "The request message for Operations.CancelOperation."
+      "id": "CancelOperationRequest"
     },
     "Status": {
       "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
       "type": "object",
       "properties": {
+        "details": {
+          "type": "array",
+          "items": {
+            "additionalProperties": {
+              "description": "Properties of the object. Contains field @type with type URL.",
+              "type": "any"
+            },
+            "type": "object"
+          },
+          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use."
+        },
         "code": {
           "description": "The status code, which should be an enum value of google.rpc.Code.",
           "format": "int32",
           "type": "integer"
         },
         "message": {
-          "type": "string",
-          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client."
-        },
-        "details": {
-          "type": "array",
-          "items": {
-            "type": "object",
-            "additionalProperties": {
-              "description": "Properties of the object. Contains field @type with type URL.",
-              "type": "any"
-            }
-          },
-          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use."
+          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
+          "type": "string"
         }
       },
       "id": "Status"
@@ -66,18 +57,6 @@
       "description": "This resource represents a long-running operation that is the result of a\nnetwork API call.",
       "type": "object",
       "properties": {
-        "metadata": {
-          "type": "object",
-          "additionalProperties": {
-            "type": "any",
-            "description": "Properties of the object. Contains field @type with type URL."
-          },
-          "description": "Service-specific metadata associated with the operation.  It typically\ncontains progress information and common metadata such as create time.\nSome services might not provide such metadata.  Any method that returns a\nlong-running operation should document the metadata type, if any."
-        },
-        "done": {
-          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
-          "type": "boolean"
-        },
         "response": {
           "additionalProperties": {
             "description": "Properties of the object. Contains field @type with type URL.",
@@ -91,22 +70,34 @@
           "type": "string"
         },
         "error": {
-          "$ref": "Status",
-          "description": "The error result of the operation in case of failure or cancellation."
+          "description": "The error result of the operation in case of failure or cancellation.",
+          "$ref": "Status"
+        },
+        "metadata": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "Service-specific metadata associated with the operation.  It typically\ncontains progress information and common metadata such as create time.\nSome services might not provide such metadata.  Any method that returns a\nlong-running operation should document the metadata type, if any.",
+          "type": "object"
+        },
+        "done": {
+          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
+          "type": "boolean"
         }
       },
       "id": "Operation"
     },
     "Empty": {
-      "type": "object",
       "properties": {},
       "id": "Empty",
-      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`."
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
+      "type": "object"
     }
   },
   "icons": {
-    "x16": "http://www.google.com/images/icons/product/search-16.gif",
-    "x32": "http://www.google.com/images/icons/product/search-32.gif"
+    "x32": "http://www.google.com/images/icons/product/search-32.gif",
+    "x16": "http://www.google.com/images/icons/product/search-16.gif"
   },
   "protocol": "rest",
   "canonicalName": "Cloud RuntimeConfig",
@@ -131,49 +122,11 @@
   "resources": {
     "operations": {
       "methods": {
-        "list": {
-          "response": {
-            "$ref": "ListOperationsResponse"
-          },
-          "parameterOrder": [
-            "name"
-          ],
-          "httpMethod": "GET",
-          "parameters": {
-            "filter": {
-              "location": "query",
-              "description": "The standard list filter.",
-              "type": "string"
-            },
-            "name": {
-              "location": "path",
-              "description": "The name of the operation collection.",
-              "required": true,
-              "type": "string",
-              "pattern": "^operations$"
-            },
-            "pageToken": {
-              "type": "string",
-              "location": "query",
-              "description": "The standard list page token."
-            },
-            "pageSize": {
-              "location": "query",
-              "description": "The standard list page size.",
-              "format": "int32",
-              "type": "integer"
-            }
-          },
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloudruntimeconfig"
-          ],
-          "flatPath": "v1/operations",
-          "path": "v1/{+name}",
-          "id": "runtimeconfig.operations.list",
-          "description": "Lists operations that match the specified filter in the request. If the\nserver doesn't support this method, it returns `UNIMPLEMENTED`.\n\nNOTE: the `name` binding below allows API services to override the binding\nto use different resource name schemes, such as `users/*/operations`."
-        },
         "cancel": {
+          "description": "Starts asynchronous cancellation on a long-running operation.  The server\nmakes a best effort to cancel the operation, but success is not\nguaranteed.  If the server doesn't support this method, it returns\n`google.rpc.Code.UNIMPLEMENTED`.  Clients can use\nOperations.GetOperation or\nother methods to check whether the cancellation succeeded or whether the\noperation completed despite cancellation. On successful cancellation,\nthe operation is not deleted; instead, it becomes an operation with\nan Operation.error value with a google.rpc.Status.code of 1,\ncorresponding to `Code.CANCELLED`.",
+          "request": {
+            "$ref": "CancelOperationRequest"
+          },
           "httpMethod": "POST",
           "parameterOrder": [
             "name"
@@ -187,26 +140,18 @@
           ],
           "parameters": {
             "name": {
-              "location": "path",
               "description": "The name of the operation resource to be cancelled.",
               "required": true,
               "type": "string",
-              "pattern": "^operations/.+$"
+              "pattern": "^operations/.+$",
+              "location": "path"
             }
           },
           "flatPath": "v1/operations/{operationsId}:cancel",
           "id": "runtimeconfig.operations.cancel",
-          "path": "v1/{+name}:cancel",
-          "description": "Starts asynchronous cancellation on a long-running operation.  The server\nmakes a best effort to cancel the operation, but success is not\nguaranteed.  If the server doesn't support this method, it returns\n`google.rpc.Code.UNIMPLEMENTED`.  Clients can use\nOperations.GetOperation or\nother methods to check whether the cancellation succeeded or whether the\noperation completed despite cancellation. On successful cancellation,\nthe operation is not deleted; instead, it becomes an operation with\nan Operation.error value with a google.rpc.Status.code of 1,\ncorresponding to `Code.CANCELLED`.",
-          "request": {
-            "$ref": "CancelOperationRequest"
-          }
+          "path": "v1/{+name}:cancel"
         },
         "delete": {
-          "flatPath": "v1/operations/{operationsId}",
-          "path": "v1/{+name}",
-          "id": "runtimeconfig.operations.delete",
-          "description": "Deletes a long-running operation. This method indicates that the client is\nno longer interested in the operation result. It does not cancel the\noperation. If the server doesn't support this method, it returns\n`google.rpc.Code.UNIMPLEMENTED`.",
           "response": {
             "$ref": "Empty"
           },
@@ -214,6 +159,33 @@
             "name"
           ],
           "httpMethod": "DELETE",
+          "parameters": {
+            "name": {
+              "description": "The name of the operation resource to be deleted.",
+              "required": true,
+              "type": "string",
+              "pattern": "^operations/.+$",
+              "location": "path"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloudruntimeconfig"
+          ],
+          "flatPath": "v1/operations/{operationsId}",
+          "path": "v1/{+name}",
+          "id": "runtimeconfig.operations.delete",
+          "description": "Deletes a long-running operation. This method indicates that the client is\nno longer interested in the operation result. It does not cancel the\noperation. If the server doesn't support this method, it returns\n`google.rpc.Code.UNIMPLEMENTED`."
+        },
+        "list": {
+          "description": "Lists operations that match the specified filter in the request. If the\nserver doesn't support this method, it returns `UNIMPLEMENTED`.\n\nNOTE: the `name` binding below allows API services to override the binding\nto use different resource name schemes, such as `users/*/operations`.",
+          "httpMethod": "GET",
+          "parameterOrder": [
+            "name"
+          ],
+          "response": {
+            "$ref": "ListOperationsResponse"
+          },
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/cloudruntimeconfig"
@@ -221,21 +193,40 @@
           "parameters": {
             "name": {
               "location": "path",
-              "description": "The name of the operation resource to be deleted.",
+              "description": "The name of the operation collection.",
               "required": true,
               "type": "string",
-              "pattern": "^operations/.+$"
+              "pattern": "^operations$"
+            },
+            "pageToken": {
+              "description": "The standard list page token.",
+              "type": "string",
+              "location": "query"
+            },
+            "pageSize": {
+              "location": "query",
+              "description": "The standard list page size.",
+              "format": "int32",
+              "type": "integer"
+            },
+            "filter": {
+              "description": "The standard list filter.",
+              "type": "string",
+              "location": "query"
             }
-          }
+          },
+          "flatPath": "v1/operations",
+          "id": "runtimeconfig.operations.list",
+          "path": "v1/{+name}"
         }
       }
     }
   },
   "parameters": {
     "upload_protocol": {
-      "type": "string",
       "location": "query",
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\")."
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
     },
     "prettyPrint": {
       "location": "query",
@@ -244,35 +235,34 @@
       "default": "true"
     },
     "uploadType": {
-      "type": "string",
       "location": "query",
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\")."
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
     },
     "fields": {
-      "type": "string",
       "location": "query",
-      "description": "Selector specifying which fields to include in a partial response."
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
     },
     "callback": {
-      "type": "string",
       "location": "query",
-      "description": "JSONP"
+      "description": "JSONP",
+      "type": "string"
     },
     "$.xgafv": {
-      "type": "string",
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
       "location": "query",
       "enum": [
         "1",
         "2"
       ],
-      "description": "V1 error format."
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ]
     },
     "alt": {
-      "type": "string",
       "enumDescriptions": [
         "Responses with Content-Type of application/json",
         "Media download with context-dependent Content-Type",
@@ -285,17 +275,18 @@
         "json",
         "media",
         "proto"
-      ]
-    },
-    "key": {
-      "location": "query",
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      ],
       "type": "string"
     },
-    "access_token": {
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
       "type": "string",
+      "location": "query"
+    },
+    "access_token": {
       "location": "query",
-      "description": "OAuth access token."
+      "description": "OAuth access token.",
+      "type": "string"
     },
     "quotaUser": {
       "location": "query",
@@ -303,20 +294,29 @@
       "type": "string"
     },
     "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
       "type": "boolean",
-      "default": "true",
-      "location": "query",
-      "description": "Pretty-print response."
-    },
-    "bearer_token": {
-      "location": "query",
-      "description": "OAuth bearer token.",
-      "type": "string"
+      "default": "true"
     },
     "oauth_token": {
       "location": "query",
       "description": "OAuth 2.0 token for the current user.",
       "type": "string"
+    },
+    "bearer_token": {
+      "location": "query",
+      "description": "OAuth bearer token.",
+      "type": "string"
     }
-  }
+  },
+  "version": "v1",
+  "baseUrl": "https://runtimeconfig.googleapis.com/",
+  "kind": "discovery#restDescription",
+  "description": "Provides capabilities for dynamic configuration and coordination for applications running on Google Cloud Platform.\n",
+  "servicePath": "",
+  "basePath": "",
+  "id": "runtimeconfig:v1",
+  "revision": "20170123",
+  "documentationLink": "https://cloud.google.com/deployment-manager/runtime-configurator/"
 }
diff --git a/runtimeconfig/v1/runtimeconfig-gen.go b/runtimeconfig/v1/runtimeconfig-gen.go
index a1dc854..e4afffc 100644
--- a/runtimeconfig/v1/runtimeconfig-gen.go
+++ b/runtimeconfig/v1/runtimeconfig-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Operations *OperationsService
 }
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewOperationsService(s *Service) *OperationsService {
 	rs := &OperationsService{s: s}
 	return rs
@@ -404,6 +409,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.canceloperationrequest)
 	if err != nil {
@@ -544,6 +550,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+name}")
@@ -709,6 +716,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/runtimeconfig/v1beta1/runtimeconfig-api.json b/runtimeconfig/v1beta1/runtimeconfig-api.json
index 0ee3d31..ba767f0 100644
--- a/runtimeconfig/v1beta1/runtimeconfig-api.json
+++ b/runtimeconfig/v1beta1/runtimeconfig-api.json
@@ -1,1024 +1,24 @@
 {
-  "resources": {
-    "projects": {
-      "resources": {
-        "configs": {
-          "methods": {
-            "list": {
-              "description": "Lists all the RuntimeConfig resources within project.",
-              "parameterOrder": [
-                "parent"
-              ],
-              "httpMethod": "GET",
-              "response": {
-                "$ref": "ListConfigsResponse"
-              },
-              "parameters": {
-                "pageToken": {
-                  "location": "query",
-                  "description": "Specifies a page token to use. Set `pageToken` to a `nextPageToken`\nreturned by a previous list request to get the next page of results.",
-                  "type": "string"
-                },
-                "pageSize": {
-                  "location": "query",
-                  "description": "Specifies the number of results to return per page. If there are fewer\nelements than the specified number, returns all elements.",
-                  "format": "int32",
-                  "type": "integer"
-                },
-                "parent": {
-                  "description": "The [project ID](https://support.google.com/cloud/answer/6158840?hl=en&ref_topic=6158848)\nfor this request, in the format `projects/[PROJECT_ID]`.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$",
-                  "location": "path"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloudruntimeconfig"
-              ],
-              "flatPath": "v1beta1/projects/{projectsId}/configs",
-              "path": "v1beta1/{+parent}/configs",
-              "id": "runtimeconfig.projects.configs.list"
-            },
-            "create": {
-              "httpMethod": "POST",
-              "parameterOrder": [
-                "parent"
-              ],
-              "response": {
-                "$ref": "RuntimeConfig"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloudruntimeconfig"
-              ],
-              "parameters": {
-                "parent": {
-                  "location": "path",
-                  "description": "The [project ID](https://support.google.com/cloud/answer/6158840?hl=en&ref_topic=6158848)\nfor this request, in the format `projects/[PROJECT_ID]`.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+$"
-                },
-                "requestId": {
-                  "description": "An optional but recommended unique \u003ccode\u003erequest_id\u003c/code\u003e. If the server\nreceives two \u003ccode\u003ecreate()\u003c/code\u003e requests  with the same\n\u003ccode\u003erequest_id\u003c/code\u003e, then the second request will be ignored and the\nfirst resource created and stored in the backend is returned.\nEmpty \u003ccode\u003erequest_id\u003c/code\u003e fields are ignored.\n\nIt is responsibility of the client to ensure uniqueness of the\n\u003ccode\u003erequest_id\u003c/code\u003e strings.\n\n\u003ccode\u003erequest_id\u003c/code\u003e strings are limited to 64 characters.",
-                  "type": "string",
-                  "location": "query"
-                }
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/configs",
-              "id": "runtimeconfig.projects.configs.create",
-              "path": "v1beta1/{+parent}/configs",
-              "description": "Creates a new RuntimeConfig resource. The configuration name must be\nunique within project.",
-              "request": {
-                "$ref": "RuntimeConfig"
-              }
-            },
-            "setIamPolicy": {
-              "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
-              "request": {
-                "$ref": "SetIamPolicyRequest"
-              },
-              "httpMethod": "POST",
-              "parameterOrder": [
-                "resource"
-              ],
-              "response": {
-                "$ref": "Policy"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloudruntimeconfig"
-              ],
-              "parameters": {
-                "resource": {
-                  "pattern": "^projects/[^/]+/configs/[^/]+$",
-                  "location": "path",
-                  "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "type": "string"
-                }
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}:setIamPolicy",
-              "id": "runtimeconfig.projects.configs.setIamPolicy",
-              "path": "v1beta1/{+resource}:setIamPolicy"
-            },
-            "getIamPolicy": {
-              "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}:getIamPolicy",
-              "path": "v1beta1/{+resource}:getIamPolicy",
-              "id": "runtimeconfig.projects.configs.getIamPolicy",
-              "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.",
-              "parameterOrder": [
-                "resource"
-              ],
-              "response": {
-                "$ref": "Policy"
-              },
-              "httpMethod": "GET",
-              "parameters": {
-                "resource": {
-                  "location": "path",
-                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/configs/[^/]+$"
-                }
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloudruntimeconfig"
-              ]
-            },
-            "get": {
-              "httpMethod": "GET",
-              "response": {
-                "$ref": "RuntimeConfig"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloudruntimeconfig"
-              ],
-              "parameters": {
-                "name": {
-                  "location": "path",
-                  "description": "The name of the RuntimeConfig resource to retrieve, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/configs/[^/]+$"
-                }
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}",
-              "id": "runtimeconfig.projects.configs.get",
-              "path": "v1beta1/{+name}",
-              "description": "Gets information about a RuntimeConfig resource."
-            },
-            "update": {
-              "description": "Updates a RuntimeConfig resource. The configuration must exist beforehand.",
-              "request": {
-                "$ref": "RuntimeConfig"
-              },
-              "response": {
-                "$ref": "RuntimeConfig"
-              },
-              "parameterOrder": [
-                "name"
-              ],
-              "httpMethod": "PUT",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloudruntimeconfig"
-              ],
-              "parameters": {
-                "name": {
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/configs/[^/]+$",
-                  "location": "path",
-                  "description": "The name of the RuntimeConfig resource to update, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`"
-                }
-              },
-              "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}",
-              "path": "v1beta1/{+name}",
-              "id": "runtimeconfig.projects.configs.update"
-            },
-            "testIamPermissions": {
-              "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}:testIamPermissions",
-              "id": "runtimeconfig.projects.configs.testIamPermissions",
-              "path": "v1beta1/{+resource}:testIamPermissions",
-              "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
-              "request": {
-                "$ref": "TestIamPermissionsRequest"
-              },
-              "httpMethod": "POST",
-              "parameterOrder": [
-                "resource"
-              ],
-              "response": {
-                "$ref": "TestIamPermissionsResponse"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloudruntimeconfig"
-              ],
-              "parameters": {
-                "resource": {
-                  "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/configs/[^/]+$",
-                  "location": "path"
-                }
-              }
-            },
-            "delete": {
-              "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}",
-              "id": "runtimeconfig.projects.configs.delete",
-              "path": "v1beta1/{+name}",
-              "description": "Deletes a RuntimeConfig resource.",
-              "httpMethod": "DELETE",
-              "parameterOrder": [
-                "name"
-              ],
-              "response": {
-                "$ref": "Empty"
-              },
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloudruntimeconfig"
-              ],
-              "parameters": {
-                "name": {
-                  "required": true,
-                  "type": "string",
-                  "pattern": "^projects/[^/]+/configs/[^/]+$",
-                  "location": "path",
-                  "description": "The RuntimeConfig resource to delete, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`"
-                }
-              }
-            }
-          },
-          "resources": {
-            "operations": {
-              "methods": {
-                "testIamPermissions": {
-                  "response": {
-                    "$ref": "TestIamPermissionsResponse"
-                  },
-                  "httpMethod": "GET",
-                  "parameterOrder": [
-                    "resource"
-                  ],
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "parameters": {
-                    "resource": {
-                      "location": "path",
-                      "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/configs/[^/]+/operations/.+$"
-                    },
-                    "permissions": {
-                      "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
-                      "type": "string",
-                      "repeated": true,
-                      "location": "query"
-                    }
-                  },
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/operations/{operationsId}:testIamPermissions",
-                  "path": "v1beta1/{+resource}:testIamPermissions",
-                  "id": "runtimeconfig.projects.configs.operations.testIamPermissions",
-                  "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error."
-                },
-                "get": {
-                  "parameters": {
-                    "name": {
-                      "location": "path",
-                      "description": "The name of the operation resource.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/configs/[^/]+/operations/.+$"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/operations/{operationsId}",
-                  "path": "v1beta1/{+name}",
-                  "id": "runtimeconfig.projects.configs.operations.get",
-                  "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice.",
-                  "response": {
-                    "$ref": "Operation"
-                  },
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "httpMethod": "GET"
-                }
-              }
-            },
-            "waiters": {
-              "methods": {
-                "delete": {
-                  "description": "Deletes the waiter with the specified name.",
-                  "response": {
-                    "$ref": "Empty"
-                  },
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "httpMethod": "DELETE",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "parameters": {
-                    "name": {
-                      "description": "The Waiter resource to delete, in the format:\n\n `projects/[PROJECT_ID]/configs/[CONFIG_NAME]/waiters/[WAITER_NAME]`",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/configs/[^/]+/waiters/[^/]+$",
-                      "location": "path"
-                    }
-                  },
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/waiters/{waitersId}",
-                  "path": "v1beta1/{+name}",
-                  "id": "runtimeconfig.projects.configs.waiters.delete"
-                },
-                "list": {
-                  "httpMethod": "GET",
-                  "parameterOrder": [
-                    "parent"
-                  ],
-                  "response": {
-                    "$ref": "ListWaitersResponse"
-                  },
-                  "parameters": {
-                    "pageToken": {
-                      "description": "Specifies a page token to use. Set `pageToken` to a `nextPageToken`\nreturned by a previous list request to get the next page of results.",
-                      "type": "string",
-                      "location": "query"
-                    },
-                    "pageSize": {
-                      "location": "query",
-                      "description": "Specifies the number of results to return per page. If there are fewer\nelements than the specified number, returns all elements.",
-                      "format": "int32",
-                      "type": "integer"
-                    },
-                    "parent": {
-                      "description": "The path to the configuration for which you want to get a list of waiters.\nThe configuration must exist beforehand; the path must by in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/configs/[^/]+$",
-                      "location": "path"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/waiters",
-                  "id": "runtimeconfig.projects.configs.waiters.list",
-                  "path": "v1beta1/{+parent}/waiters",
-                  "description": "List waiters within the given configuration."
-                },
-                "get": {
-                  "httpMethod": "GET",
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "response": {
-                    "$ref": "Waiter"
-                  },
-                  "parameters": {
-                    "name": {
-                      "pattern": "^projects/[^/]+/configs/[^/]+/waiters/[^/]+$",
-                      "location": "path",
-                      "description": "The fully-qualified name of the Waiter resource object to retrieve, in the\nformat:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]/waiters/[WAITER_NAME]`",
-                      "required": true,
-                      "type": "string"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/waiters/{waitersId}",
-                  "id": "runtimeconfig.projects.configs.waiters.get",
-                  "path": "v1beta1/{+name}",
-                  "description": "Gets information about a single waiter."
-                },
-                "create": {
-                  "description": "Creates a Waiter resource. This operation returns a long-running Operation\nresource which can be polled for completion. However, a waiter with the\ngiven name will exist (and can be retrieved) prior to the operation\ncompleting. If the operation fails, the failed Waiter resource will\nstill exist and must be deleted prior to subsequent creation attempts.",
-                  "request": {
-                    "$ref": "Waiter"
-                  },
-                  "httpMethod": "POST",
-                  "parameterOrder": [
-                    "parent"
-                  ],
-                  "response": {
-                    "$ref": "Operation"
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "parameters": {
-                    "requestId": {
-                      "location": "query",
-                      "description": "An optional but recommended unique \u003ccode\u003erequest_id\u003c/code\u003e. If the server\nreceives two \u003ccode\u003ecreate()\u003c/code\u003e requests  with the same\n\u003ccode\u003erequest_id\u003c/code\u003e, then the second request will be ignored and the\nfirst resource created and stored in the backend is returned.\nEmpty \u003ccode\u003erequest_id\u003c/code\u003e fields are ignored.\n\nIt is responsibility of the client to ensure uniqueness of the\n\u003ccode\u003erequest_id\u003c/code\u003e strings.\n\n\u003ccode\u003erequest_id\u003c/code\u003e strings are limited to 64 characters.",
-                      "type": "string"
-                    },
-                    "parent": {
-                      "description": "The path to the configuration that will own the waiter.\nThe configuration must exist beforehand; the path must by in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/configs/[^/]+$",
-                      "location": "path"
-                    }
-                  },
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/waiters",
-                  "id": "runtimeconfig.projects.configs.waiters.create",
-                  "path": "v1beta1/{+parent}/waiters"
-                },
-                "testIamPermissions": {
-                  "httpMethod": "GET",
-                  "response": {
-                    "$ref": "TestIamPermissionsResponse"
-                  },
-                  "parameterOrder": [
-                    "resource"
-                  ],
-                  "parameters": {
-                    "resource": {
-                      "location": "path",
-                      "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/configs/[^/]+/waiters/[^/]+$"
-                    },
-                    "permissions": {
-                      "repeated": true,
-                      "location": "query",
-                      "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
-                      "type": "string"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/waiters/{waitersId}:testIamPermissions",
-                  "id": "runtimeconfig.projects.configs.waiters.testIamPermissions",
-                  "path": "v1beta1/{+resource}:testIamPermissions",
-                  "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error."
-                }
-              }
-            },
-            "variables": {
-              "methods": {
-                "delete": {
-                  "description": "Deletes a variable or multiple variables.\n\nIf you specify a variable name, then that variable is deleted. If you\nspecify a prefix and `recursive` is true, then all variables with that\nprefix are deleted. You must set a `recursive` to true if you delete\nvariables by prefix.",
-                  "httpMethod": "DELETE",
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "response": {
-                    "$ref": "Empty"
-                  },
-                  "parameters": {
-                    "recursive": {
-                      "description": "Set to `true` to recursively delete multiple variables with the same\nprefix.",
-                      "type": "boolean",
-                      "location": "query"
-                    },
-                    "name": {
-                      "description": "The name of the variable to delete, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]/variables/[VARIABLE_NAME]`",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/configs/[^/]+/variables/.+$",
-                      "location": "path"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}",
-                  "id": "runtimeconfig.projects.configs.variables.delete",
-                  "path": "v1beta1/{+name}"
-                },
-                "list": {
-                  "description": "Lists variables within given a configuration, matching any provided filters.\nThis only lists variable names, not the values.",
-                  "response": {
-                    "$ref": "ListVariablesResponse"
-                  },
-                  "parameterOrder": [
-                    "parent"
-                  ],
-                  "httpMethod": "GET",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "parameters": {
-                    "pageSize": {
-                      "type": "integer",
-                      "location": "query",
-                      "description": "Specifies the number of results to return per page. If there are fewer\nelements than the specified number, returns all elements.",
-                      "format": "int32"
-                    },
-                    "parent": {
-                      "pattern": "^projects/[^/]+/configs/[^/]+$",
-                      "location": "path",
-                      "description": "The path to the RuntimeConfig resource for which you want to list variables.\nThe configuration must exist beforehand; the path must by in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`",
-                      "required": true,
-                      "type": "string"
-                    },
-                    "filter": {
-                      "description": "Filters variables by matching the specified filter. For example:\n\n`projects/example-project/config/[CONFIG_NAME]/variables/example-variable`.",
-                      "type": "string",
-                      "location": "query"
-                    },
-                    "pageToken": {
-                      "description": "Specifies a page token to use. Set `pageToken` to a `nextPageToken`\nreturned by a previous list request to get the next page of results.",
-                      "type": "string",
-                      "location": "query"
-                    }
-                  },
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables",
-                  "path": "v1beta1/{+parent}/variables",
-                  "id": "runtimeconfig.projects.configs.variables.list"
-                },
-                "create": {
-                  "id": "runtimeconfig.projects.configs.variables.create",
-                  "path": "v1beta1/{+parent}/variables",
-                  "request": {
-                    "$ref": "Variable"
-                  },
-                  "description": "Creates a variable within the given configuration. You cannot create\na variable with a name that is a prefix of an existing variable name, or a\nname that has an existing variable name as a prefix.\n\nTo learn more about creating a variable, read the\n[Setting and Getting Data](/deployment-manager/runtime-configurator/set-and-get-variables)\ndocumentation.",
-                  "httpMethod": "POST",
-                  "parameterOrder": [
-                    "parent"
-                  ],
-                  "response": {
-                    "$ref": "Variable"
-                  },
-                  "parameters": {
-                    "requestId": {
-                      "description": "An optional but recommended unique \u003ccode\u003erequest_id\u003c/code\u003e. If the server\nreceives two \u003ccode\u003ecreate()\u003c/code\u003e requests  with the same\n\u003ccode\u003erequest_id\u003c/code\u003e, then the second request will be ignored and the\nfirst resource created and stored in the backend is returned.\nEmpty \u003ccode\u003erequest_id\u003c/code\u003e fields are ignored.\n\nIt is responsibility of the client to ensure uniqueness of the\n\u003ccode\u003erequest_id\u003c/code\u003e strings.\n\n\u003ccode\u003erequest_id\u003c/code\u003e strings are limited to 64 characters.",
-                      "type": "string",
-                      "location": "query"
-                    },
-                    "parent": {
-                      "pattern": "^projects/[^/]+/configs/[^/]+$",
-                      "location": "path",
-                      "description": "The path to the RutimeConfig resource that this variable should belong to.\nThe configuration must exist beforehand; the path must by in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`",
-                      "required": true,
-                      "type": "string"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables"
-                },
-                "get": {
-                  "description": "Gets information about a single variable.",
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "httpMethod": "GET",
-                  "response": {
-                    "$ref": "Variable"
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "parameters": {
-                    "name": {
-                      "description": "The name of the variable to return, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]/variables/[VARIBLE_NAME]`",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/configs/[^/]+/variables/.+$",
-                      "location": "path"
-                    }
-                  },
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}",
-                  "path": "v1beta1/{+name}",
-                  "id": "runtimeconfig.projects.configs.variables.get"
-                },
-                "watch": {
-                  "parameters": {
-                    "name": {
-                      "location": "path",
-                      "description": "The name of the variable to watch, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/configs/[^/]+/variables/.+$"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}:watch",
-                  "path": "v1beta1/{+name}:watch",
-                  "id": "runtimeconfig.projects.configs.variables.watch",
-                  "request": {
-                    "$ref": "WatchVariableRequest"
-                  },
-                  "description": "Watches a specific variable and waits for a change in the variable's value.\nWhen there is a change, this method returns the new value or times out.\n\nIf a variable is deleted while being watched, the `variableState` state is\nset to `DELETED` and the method returns the last known variable `value`.\n\nIf you set the deadline for watching to a larger value than internal timeout\n(60 seconds), the current variable value is returned and the `variableState`\nwill be `VARIABLE_STATE_UNSPECIFIED`.\n\nTo learn more about creating a watcher, read the\n[Watching a Variable for Changes](/deployment-manager/runtime-configurator/watching-a-variable)\ndocumentation.",
-                  "response": {
-                    "$ref": "Variable"
-                  },
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "httpMethod": "POST"
-                },
-                "update": {
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}",
-                  "path": "v1beta1/{+name}",
-                  "id": "runtimeconfig.projects.configs.variables.update",
-                  "description": "Updates an existing variable with a new value.",
-                  "request": {
-                    "$ref": "Variable"
-                  },
-                  "response": {
-                    "$ref": "Variable"
-                  },
-                  "parameterOrder": [
-                    "name"
-                  ],
-                  "httpMethod": "PUT",
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "parameters": {
-                    "name": {
-                      "description": "The name of the variable to update, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]/variables/[VARIABLE_NAME]`",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/configs/[^/]+/variables/.+$",
-                      "location": "path"
-                    }
-                  }
-                },
-                "testIamPermissions": {
-                  "response": {
-                    "$ref": "TestIamPermissionsResponse"
-                  },
-                  "parameterOrder": [
-                    "resource"
-                  ],
-                  "httpMethod": "GET",
-                  "parameters": {
-                    "resource": {
-                      "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-                      "required": true,
-                      "type": "string",
-                      "pattern": "^projects/[^/]+/configs/[^/]+/variables/.+$",
-                      "location": "path"
-                    },
-                    "permissions": {
-                      "repeated": true,
-                      "location": "query",
-                      "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
-                      "type": "string"
-                    }
-                  },
-                  "scopes": [
-                    "https://www.googleapis.com/auth/cloud-platform",
-                    "https://www.googleapis.com/auth/cloudruntimeconfig"
-                  ],
-                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}:testIamPermissions",
-                  "path": "v1beta1/{+resource}:testIamPermissions",
-                  "id": "runtimeconfig.projects.configs.variables.testIamPermissions",
-                  "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error."
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  },
-  "parameters": {
-    "$.xgafv": {
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "location": "query",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "description": "V1 error format.",
-      "type": "string"
-    },
-    "callback": {
-      "type": "string",
-      "location": "query",
-      "description": "JSONP"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "default": "json",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "type": "string",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "location": "query"
-    },
-    "access_token": {
-      "location": "query",
-      "description": "OAuth access token.",
-      "type": "string"
-    },
-    "key": {
-      "location": "query",
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string"
-    },
-    "quotaUser": {
-      "location": "query",
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string"
-    },
-    "pp": {
-      "location": "query",
-      "description": "Pretty-print response.",
-      "type": "boolean",
-      "default": "true"
-    },
-    "oauth_token": {
-      "type": "string",
-      "location": "query",
-      "description": "OAuth 2.0 token for the current user."
-    },
-    "bearer_token": {
-      "location": "query",
-      "description": "OAuth bearer token.",
-      "type": "string"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "type": "boolean",
-      "default": "true",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    }
-  },
-  "version": "v1beta1",
-  "baseUrl": "https://runtimeconfig.googleapis.com/",
-  "description": "Provides capabilities for dynamic configuration and coordination for applications running on Google Cloud Platform.\n",
-  "servicePath": "",
-  "kind": "discovery#restDescription",
   "basePath": "",
-  "id": "runtimeconfig:v1beta1",
-  "documentationLink": "https://cloud.google.com/deployment-manager/runtime-configurator/",
   "revision": "20170123",
+  "documentationLink": "https://cloud.google.com/deployment-manager/runtime-configurator/",
+  "id": "runtimeconfig:v1beta1",
   "discoveryVersion": "v1",
   "version_module": "True",
   "schemas": {
-    "ListVariablesResponse": {
-      "description": "Response for the `ListVariables()` method.",
-      "type": "object",
-      "properties": {
-        "variables": {
-          "description": "A list of variables and their values. The order of returned variable\nobjects is arbitrary.",
-          "type": "array",
-          "items": {
-            "$ref": "Variable"
-          }
-        },
-        "nextPageToken": {
-          "description": "This token allows you to get the next page of results for list requests.\nIf the number of results is larger than `pageSize`, use the `nextPageToken`\nas a value for the query parameter `pageToken` in the next list request.\nSubsequent list requests will have their own `nextPageToken` to continue\npaging through the results",
-          "type": "string"
-        }
-      },
-      "id": "ListVariablesResponse"
-    },
-    "RuntimeConfig": {
-      "description": "A RuntimeConfig resource is the primary resource in the Cloud RuntimeConfig\nservice. A RuntimeConfig resource consists of metadata and a hierarchy of\nvariables.",
-      "type": "object",
-      "properties": {
-        "name": {
-          "description": "The resource name of a runtime config. The name must have the format:\n\n    projects/[PROJECT_ID]/configs/[CONFIG_NAME]\n\nThe `[PROJECT_ID]` must be a valid project ID, and `[CONFIG_NAME]` is an\narbitrary name that matches RFC 1035 segment specification. The length of\n`[CONFIG_NAME]` must be less than 64 bytes.\n\nYou pick the RuntimeConfig resource name, but the server will validate that\nthe name adheres to this format. After you create the resource, you cannot\nchange the resource's name.",
-          "type": "string"
-        },
-        "description": {
-          "description": "An optional description of the RuntimeConfig object.",
-          "type": "string"
-        }
-      },
-      "id": "RuntimeConfig"
-    },
-    "WatchVariableRequest": {
-      "description": "Request for the `WatchVariable()` method.",
-      "type": "object",
-      "properties": {
-        "newerThan": {
-          "description": "If specified, checks the current timestamp of the variable and if the\ncurrent timestamp is newer than `newerThan` timestamp, the method returns\nimmediately.\n\nIf not specified or the variable has an older timestamp, the watcher waits\nfor a the value to change before returning.",
-          "format": "google-datetime",
-          "type": "string"
-        }
-      },
-      "id": "WatchVariableRequest"
-    },
-    "ListWaitersResponse": {
-      "description": "Response for the `ListWaiters()` method.\nOrder of returned waiter objects is arbitrary.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "This token allows you to get the next page of results for list requests.\nIf the number of results is larger than `pageSize`, use the `nextPageToken`\nas a value for the query parameter `pageToken` in the next list request.\nSubsequent list requests will have their own `nextPageToken` to continue\npaging through the results",
-          "type": "string"
-        },
-        "waiters": {
-          "description": "Found waiters in the project.",
-          "type": "array",
-          "items": {
-            "$ref": "Waiter"
-          }
-        }
-      },
-      "id": "ListWaitersResponse"
-    },
-    "TestIamPermissionsRequest": {
-      "description": "Request message for `TestIamPermissions` method.",
-      "type": "object",
-      "properties": {
-        "permissions": {
-          "type": "array",
-          "items": {
-            "type": "string"
-          },
-          "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions)."
-        }
-      },
-      "id": "TestIamPermissionsRequest"
-    },
-    "Waiter": {
-      "description": "A Waiter resource waits for some end condition within a RuntimeConfig resource\nto be met before it returns. For example, assume you have a distributed\nsystem where each node writes to a Variable resource indidicating the node's\nreadiness as part of the startup process.\n\nYou then configure a Waiter resource with the success condition set to wait\nuntil some number of nodes have checked in. Afterwards, your application\nruns some arbitrary code after the condition has been met and the waiter\nreturns successfully.\n\nOnce created, a Waiter resource is immutable.\n\nTo learn more about using waiters, read the\n[Creating a Waiter](/deployment-manager/runtime-configurator/creating-a-waiter)\ndocumentation.",
-      "type": "object",
-      "properties": {
-        "error": {
-          "description": "[Output Only] If the waiter ended due to a failure or timeout, this value\nwill be set.",
-          "$ref": "Status"
-        },
-        "failure": {
-          "$ref": "EndCondition",
-          "description": "[Optional] The failure condition of this waiter. If this condition is met,\n`done` will be set to `true` and the `error` code will be set to `ABORTED`.\nThe failure condition takes precedence over the success condition. If both\nconditions are met, a failure will be indicated. This value is optional; if\nno failure condition is set, the only failure scenario will be a timeout."
-        },
-        "success": {
-          "$ref": "EndCondition",
-          "description": "[Required] The success condition. If this condition is met, `done` will be\nset to `true` and the `error` value will remain unset. The failure condition\ntakes precedence over the success condition. If both conditions are met, a\nfailure will be indicated."
-        },
-        "done": {
-          "description": "[Output Only] If the value is `false`, it means the waiter is still waiting\nfor one of its conditions to be met.\n\nIf true, the waiter has finished. If the waiter finished due to a timeout\nor failure, `error` will be set.",
-          "type": "boolean"
-        },
-        "createTime": {
-          "description": "[Output Only] The instant at which this Waiter resource was created. Adding\nthe value of `timeout` to this instant yields the timeout deadline for the\nwaiter.",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "timeout": {
-          "description": "[Required] Specifies the timeout of the waiter in seconds, beginning from\nthe instant that `waiters().create` method is called. If this time elapses\nbefore the success or failure conditions are met, the waiter fails and sets\nthe `error` code to `DEADLINE_EXCEEDED`.",
-          "format": "google-duration",
-          "type": "string"
-        },
-        "name": {
-          "description": "The name of the Waiter resource, in the format:\n\n    projects/[PROJECT_ID]/configs/[CONFIG_NAME]/waiters/[WAITER_NAME]\n\nThe `[PROJECT_ID]` must be a valid Google Cloud project ID,\nthe `[CONFIG_NAME]` must be a valid RuntimeConfig resource, the\n`[WAITER_NAME]` must match RFC 1035 segment specification, and the length\nof `[WAITER_NAME]` must be less than 64 bytes.\n\nAfter you create a Waiter resource, you cannot change the resource name.",
-          "type": "string"
-        }
-      },
-      "id": "Waiter"
-    },
-    "Policy": {
-      "id": "Policy",
-      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
-      "type": "object",
-      "properties": {
-        "etag": {
-          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
-          "format": "byte",
-          "type": "string"
-        },
-        "version": {
-          "description": "Version of the `Policy`. The default version is 0.",
-          "format": "int32",
-          "type": "integer"
-        },
-        "bindings": {
-          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
-          "type": "array",
-          "items": {
-            "$ref": "Binding"
-          }
-        }
-      }
-    },
-    "Variable": {
-      "id": "Variable",
-      "description": "Describes a single variable within a RuntimeConfig resource.\nThe name denotes the hierarchical variable name. For example,\n`ports/serving_port` is a valid variable name. The variable value is an\nopaque string and only leaf variables can have values (that is, variables\nthat do not have any child variables).",
-      "type": "object",
-      "properties": {
-        "name": {
-          "type": "string",
-          "description": "The name of the variable resource, in the format:\n\n    projects/[PROJECT_ID]/configs/[CONFIG_NAME]/variables/[VARIABLE_NAME]\n\nThe `[PROJECT_ID]` must be a valid project ID, `[CONFIG_NAME]` must be a\nvalid RuntimeConfig reource and `[VARIABLE_NAME]` follows Unix file system\nfile path naming.\n\nThe `[VARIABLE_NAME]` can contain ASCII letters, numbers, slashes and\ndashes. Slashes are used as path element separators and are not part of the\n`[VARIABLE_NAME]` itself, so `[VARIABLE_NAME]` must contain at least one\nnon-slash character. Multiple slashes are coalesced into single slash\ncharacter. Each path segment should follow RFC 1035 segment specification.\nThe length of a `[VARIABLE_NAME]` must be less than 256 bytes.\n\nOnce you create a variable, you cannot change the variable name."
-        },
-        "text": {
-          "type": "string",
-          "description": "The string value of the variable. The length of the value must be less\nthan 4096 bytes. Empty values are also accepted. For example,\n\u003ccode\u003etext: \"my text value\"\u003c/code\u003e."
-        },
-        "value": {
-          "description": "The binary value of the variable. The length of the value must be less\nthan 4096 bytes. Empty values are also accepted. The value must be\nbase64 encoded. Only one of `value` or `text` can be set.",
-          "format": "byte",
-          "type": "string"
-        },
-        "updateTime": {
-          "description": "[Output Only] The time of the last variable update.",
-          "format": "google-datetime",
-          "type": "string"
-        },
-        "state": {
-          "description": "[Ouput only] The current state of the variable. The variable state indicates\nthe outcome of the `variables().watch` call and is visible through the\n`get` and `list` calls.",
-          "type": "string",
-          "enumDescriptions": [
-            "Default variable state.",
-            "The variable was updated, while `variables().watch` was executing.",
-            "The variable was deleted, while `variables().watch` was executing."
-          ],
-          "enum": [
-            "VARIABLE_STATE_UNSPECIFIED",
-            "UPDATED",
-            "DELETED"
-          ]
-        }
-      }
-    },
-    "Operation": {
-      "description": "This resource represents a long-running operation that is the result of a\nnetwork API call.",
-      "type": "object",
-      "properties": {
-        "done": {
-          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
-          "type": "boolean"
-        },
-        "response": {
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "description": "The normal response of the operation in case of success.  If the original\nmethod returns no data on success, such as `Delete`, the response is\n`google.protobuf.Empty`.  If the original method is standard\n`Get`/`Create`/`Update`, the response should be the resource.  For other\nmethods, the response should have the type `XxxResponse`, where `Xxx`\nis the original method name.  For example, if the original method name\nis `TakeSnapshot()`, the inferred response type is\n`TakeSnapshotResponse`.",
-          "type": "object"
-        },
-        "name": {
-          "type": "string",
-          "description": "The server-assigned name, which is only unique within the same service that\noriginally returns it. If you use the default HTTP mapping, the\n`name` should have the format of `operations/some/unique/name`."
-        },
-        "error": {
-          "$ref": "Status",
-          "description": "The error result of the operation in case of failure or cancellation."
-        },
-        "metadata": {
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "description": "Service-specific metadata associated with the operation.  It typically\ncontains progress information and common metadata such as create time.\nSome services might not provide such metadata.  Any method that returns a\nlong-running operation should document the metadata type, if any.",
-          "type": "object"
-        }
-      },
-      "id": "Operation"
-    },
     "SetIamPolicyRequest": {
-      "description": "Request message for `SetIamPolicy` method.",
       "type": "object",
       "properties": {
         "policy": {
-          "$ref": "Policy",
-          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them."
+          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them.",
+          "$ref": "Policy"
         }
       },
-      "id": "SetIamPolicyRequest"
+      "id": "SetIamPolicyRequest",
+      "description": "Request message for `SetIamPolicy` method."
     },
     "Status": {
+      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
       "type": "object",
       "properties": {
         "message": {
@@ -1042,26 +42,31 @@
           "type": "integer"
         }
       },
-      "id": "Status",
-      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons."
+      "id": "Status"
     },
     "Binding": {
+      "id": "Binding",
       "description": "Associates `members` with a `role`.",
       "type": "object",
       "properties": {
-        "members": {
-          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
         "role": {
           "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
           "type": "string"
+        },
+        "members": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n"
         }
-      },
-      "id": "Binding"
+      }
+    },
+    "Empty": {
+      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
+      "type": "object",
+      "properties": {},
+      "id": "Empty"
     },
     "Cardinality": {
       "description": "A Cardinality condition for the Waiter resource. A cardinality condition is\nmet when the number of variables under a specified path prefix reaches a\npredefined number. For example, if you set a Cardinality condition where\nthe `path` is set to `/foo` and the number of paths is set to 2, the\nfollowing variables would meet the condition in a RuntimeConfig resource:\n\n+ `/foo/variable1 = \"value1\"`\n+ `/foo/variable2 = \"value2\"`\n+ `/bar/variable3 = \"value3\"`\n\nIt would not would not satisify the same condition with the `number` set to\n3, however, because there is only 2 paths that start with `/foo`.\nCardinality conditions are recursive; all subtrees under the specific\npath prefix are counted.",
@@ -1072,19 +77,13 @@
           "type": "string"
         },
         "number": {
-          "type": "integer",
           "description": "The number variables under the `path` that must exist to meet this\ncondition. Defaults to 1 if not specified.",
-          "format": "int32"
+          "format": "int32",
+          "type": "integer"
         }
       },
       "id": "Cardinality"
     },
-    "Empty": {
-      "id": "Empty",
-      "description": "A generic empty message that you can re-use to avoid defining duplicated\nempty messages in your APIs. A typical example is to use it as the request\nor the response type of an API method. For instance:\n\n    service Foo {\n      rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);\n    }\n\nThe JSON representation for `Empty` is empty JSON object `{}`.",
-      "type": "object",
-      "properties": {}
-    },
     "ListConfigsResponse": {
       "description": "`ListConfigs()` returns the following response. The order of returned\nobjects is arbitrary; that is, it is not ordered in any particular way.",
       "type": "object",
@@ -1115,6 +114,8 @@
       "id": "EndCondition"
     },
     "TestIamPermissionsResponse": {
+      "description": "Response message for `TestIamPermissions` method.",
+      "type": "object",
       "properties": {
         "permissions": {
           "description": "A subset of `TestPermissionsRequest.permissions` that the caller is\nallowed.",
@@ -1124,16 +125,226 @@
           }
         }
       },
-      "id": "TestIamPermissionsResponse",
-      "description": "Response message for `TestIamPermissions` method.",
+      "id": "TestIamPermissionsResponse"
+    },
+    "ListVariablesResponse": {
+      "id": "ListVariablesResponse",
+      "description": "Response for the `ListVariables()` method.",
+      "type": "object",
+      "properties": {
+        "nextPageToken": {
+          "description": "This token allows you to get the next page of results for list requests.\nIf the number of results is larger than `pageSize`, use the `nextPageToken`\nas a value for the query parameter `pageToken` in the next list request.\nSubsequent list requests will have their own `nextPageToken` to continue\npaging through the results",
+          "type": "string"
+        },
+        "variables": {
+          "type": "array",
+          "items": {
+            "$ref": "Variable"
+          },
+          "description": "A list of variables and their values. The order of returned variable\nobjects is arbitrary."
+        }
+      }
+    },
+    "RuntimeConfig": {
+      "id": "RuntimeConfig",
+      "description": "A RuntimeConfig resource is the primary resource in the Cloud RuntimeConfig\nservice. A RuntimeConfig resource consists of metadata and a hierarchy of\nvariables.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The resource name of a runtime config. The name must have the format:\n\n    projects/[PROJECT_ID]/configs/[CONFIG_NAME]\n\nThe `[PROJECT_ID]` must be a valid project ID, and `[CONFIG_NAME]` is an\narbitrary name that matches RFC 1035 segment specification. The length of\n`[CONFIG_NAME]` must be less than 64 bytes.\n\nYou pick the RuntimeConfig resource name, but the server will validate that\nthe name adheres to this format. After you create the resource, you cannot\nchange the resource's name.",
+          "type": "string"
+        },
+        "description": {
+          "description": "An optional description of the RuntimeConfig object.",
+          "type": "string"
+        }
+      }
+    },
+    "WatchVariableRequest": {
+      "description": "Request for the `WatchVariable()` method.",
+      "type": "object",
+      "properties": {
+        "newerThan": {
+          "description": "If specified, checks the current timestamp of the variable and if the\ncurrent timestamp is newer than `newerThan` timestamp, the method returns\nimmediately.\n\nIf not specified or the variable has an older timestamp, the watcher waits\nfor a the value to change before returning.",
+          "format": "google-datetime",
+          "type": "string"
+        }
+      },
+      "id": "WatchVariableRequest"
+    },
+    "ListWaitersResponse": {
+      "description": "Response for the `ListWaiters()` method.\nOrder of returned waiter objects is arbitrary.",
+      "type": "object",
+      "properties": {
+        "nextPageToken": {
+          "description": "This token allows you to get the next page of results for list requests.\nIf the number of results is larger than `pageSize`, use the `nextPageToken`\nas a value for the query parameter `pageToken` in the next list request.\nSubsequent list requests will have their own `nextPageToken` to continue\npaging through the results",
+          "type": "string"
+        },
+        "waiters": {
+          "description": "Found waiters in the project.",
+          "type": "array",
+          "items": {
+            "$ref": "Waiter"
+          }
+        }
+      },
+      "id": "ListWaitersResponse"
+    },
+    "Waiter": {
+      "description": "A Waiter resource waits for some end condition within a RuntimeConfig resource\nto be met before it returns. For example, assume you have a distributed\nsystem where each node writes to a Variable resource indidicating the node's\nreadiness as part of the startup process.\n\nYou then configure a Waiter resource with the success condition set to wait\nuntil some number of nodes have checked in. Afterwards, your application\nruns some arbitrary code after the condition has been met and the waiter\nreturns successfully.\n\nOnce created, a Waiter resource is immutable.\n\nTo learn more about using waiters, read the\n[Creating a Waiter](/deployment-manager/runtime-configurator/creating-a-waiter)\ndocumentation.",
+      "type": "object",
+      "properties": {
+        "error": {
+          "$ref": "Status",
+          "description": "[Output Only] If the waiter ended due to a failure or timeout, this value\nwill be set."
+        },
+        "failure": {
+          "description": "[Optional] The failure condition of this waiter. If this condition is met,\n`done` will be set to `true` and the `error` code will be set to `ABORTED`.\nThe failure condition takes precedence over the success condition. If both\nconditions are met, a failure will be indicated. This value is optional; if\nno failure condition is set, the only failure scenario will be a timeout.",
+          "$ref": "EndCondition"
+        },
+        "success": {
+          "$ref": "EndCondition",
+          "description": "[Required] The success condition. If this condition is met, `done` will be\nset to `true` and the `error` value will remain unset. The failure condition\ntakes precedence over the success condition. If both conditions are met, a\nfailure will be indicated."
+        },
+        "done": {
+          "description": "[Output Only] If the value is `false`, it means the waiter is still waiting\nfor one of its conditions to be met.\n\nIf true, the waiter has finished. If the waiter finished due to a timeout\nor failure, `error` will be set.",
+          "type": "boolean"
+        },
+        "createTime": {
+          "description": "[Output Only] The instant at which this Waiter resource was created. Adding\nthe value of `timeout` to this instant yields the timeout deadline for the\nwaiter.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "timeout": {
+          "description": "[Required] Specifies the timeout of the waiter in seconds, beginning from\nthe instant that `waiters().create` method is called. If this time elapses\nbefore the success or failure conditions are met, the waiter fails and sets\nthe `error` code to `DEADLINE_EXCEEDED`.",
+          "format": "google-duration",
+          "type": "string"
+        },
+        "name": {
+          "description": "The name of the Waiter resource, in the format:\n\n    projects/[PROJECT_ID]/configs/[CONFIG_NAME]/waiters/[WAITER_NAME]\n\nThe `[PROJECT_ID]` must be a valid Google Cloud project ID,\nthe `[CONFIG_NAME]` must be a valid RuntimeConfig resource, the\n`[WAITER_NAME]` must match RFC 1035 segment specification, and the length\nof `[WAITER_NAME]` must be less than 64 bytes.\n\nAfter you create a Waiter resource, you cannot change the resource name.",
+          "type": "string"
+        }
+      },
+      "id": "Waiter"
+    },
+    "TestIamPermissionsRequest": {
+      "properties": {
+        "permissions": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions)."
+        }
+      },
+      "id": "TestIamPermissionsRequest",
+      "description": "Request message for `TestIamPermissions` method.",
       "type": "object"
+    },
+    "Policy": {
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
+      "type": "object",
+      "properties": {
+        "bindings": {
+          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
+          "type": "array",
+          "items": {
+            "$ref": "Binding"
+          }
+        },
+        "etag": {
+          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
+          "format": "byte",
+          "type": "string"
+        },
+        "version": {
+          "description": "Version of the `Policy`. The default version is 0.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "Policy"
+    },
+    "Variable": {
+      "type": "object",
+      "properties": {
+        "updateTime": {
+          "description": "[Output Only] The time of the last variable update.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "state": {
+          "enumDescriptions": [
+            "Default variable state.",
+            "The variable was updated, while `variables().watch` was executing.",
+            "The variable was deleted, while `variables().watch` was executing."
+          ],
+          "enum": [
+            "VARIABLE_STATE_UNSPECIFIED",
+            "UPDATED",
+            "DELETED"
+          ],
+          "description": "[Ouput only] The current state of the variable. The variable state indicates\nthe outcome of the `variables().watch` call and is visible through the\n`get` and `list` calls.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The name of the variable resource, in the format:\n\n    projects/[PROJECT_ID]/configs/[CONFIG_NAME]/variables/[VARIABLE_NAME]\n\nThe `[PROJECT_ID]` must be a valid project ID, `[CONFIG_NAME]` must be a\nvalid RuntimeConfig reource and `[VARIABLE_NAME]` follows Unix file system\nfile path naming.\n\nThe `[VARIABLE_NAME]` can contain ASCII letters, numbers, slashes and\ndashes. Slashes are used as path element separators and are not part of the\n`[VARIABLE_NAME]` itself, so `[VARIABLE_NAME]` must contain at least one\nnon-slash character. Multiple slashes are coalesced into single slash\ncharacter. Each path segment should follow RFC 1035 segment specification.\nThe length of a `[VARIABLE_NAME]` must be less than 256 bytes.\n\nOnce you create a variable, you cannot change the variable name.",
+          "type": "string"
+        },
+        "text": {
+          "description": "The string value of the variable. The length of the value must be less\nthan 4096 bytes. Empty values are also accepted. For example,\n\u003ccode\u003etext: \"my text value\"\u003c/code\u003e.",
+          "type": "string"
+        },
+        "value": {
+          "type": "string",
+          "description": "The binary value of the variable. The length of the value must be less\nthan 4096 bytes. Empty values are also accepted. The value must be\nbase64 encoded. Only one of `value` or `text` can be set.",
+          "format": "byte"
+        }
+      },
+      "id": "Variable",
+      "description": "Describes a single variable within a RuntimeConfig resource.\nThe name denotes the hierarchical variable name. For example,\n`ports/serving_port` is a valid variable name. The variable value is an\nopaque string and only leaf variables can have values (that is, variables\nthat do not have any child variables)."
+    },
+    "Operation": {
+      "description": "This resource represents a long-running operation that is the result of a\nnetwork API call.",
+      "type": "object",
+      "properties": {
+        "done": {
+          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
+          "type": "boolean"
+        },
+        "response": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "The normal response of the operation in case of success.  If the original\nmethod returns no data on success, such as `Delete`, the response is\n`google.protobuf.Empty`.  If the original method is standard\n`Get`/`Create`/`Update`, the response should be the resource.  For other\nmethods, the response should have the type `XxxResponse`, where `Xxx`\nis the original method name.  For example, if the original method name\nis `TakeSnapshot()`, the inferred response type is\n`TakeSnapshotResponse`.",
+          "type": "object"
+        },
+        "name": {
+          "description": "The server-assigned name, which is only unique within the same service that\noriginally returns it. If you use the default HTTP mapping, the\n`name` should have the format of `operations/some/unique/name`.",
+          "type": "string"
+        },
+        "error": {
+          "$ref": "Status",
+          "description": "The error result of the operation in case of failure or cancellation."
+        },
+        "metadata": {
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "Service-specific metadata associated with the operation.  It typically\ncontains progress information and common metadata such as create time.\nSome services might not provide such metadata.  Any method that returns a\nlong-running operation should document the metadata type, if any."
+        }
+      },
+      "id": "Operation"
     }
   },
+  "protocol": "rest",
   "icons": {
     "x32": "http://www.google.com/images/icons/product/search-32.gif",
     "x16": "http://www.google.com/images/icons/product/search-16.gif"
   },
-  "protocol": "rest",
   "canonicalName": "Cloud RuntimeConfig",
   "auth": {
     "oauth2": {
@@ -1152,5 +363,794 @@
   "name": "runtimeconfig",
   "batchPath": "batch",
   "title": "Google Cloud RuntimeConfig API",
-  "ownerName": "Google"
+  "ownerName": "Google",
+  "resources": {
+    "projects": {
+      "resources": {
+        "configs": {
+          "methods": {
+            "testIamPermissions": {
+              "response": {
+                "$ref": "TestIamPermissionsResponse"
+              },
+              "parameterOrder": [
+                "resource"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloudruntimeconfig"
+              ],
+              "parameters": {
+                "resource": {
+                  "pattern": "^projects/[^/]+/configs/[^/]+$",
+                  "location": "path",
+                  "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}:testIamPermissions",
+              "path": "v1beta1/{+resource}:testIamPermissions",
+              "id": "runtimeconfig.projects.configs.testIamPermissions",
+              "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
+              "request": {
+                "$ref": "TestIamPermissionsRequest"
+              }
+            },
+            "delete": {
+              "parameterOrder": [
+                "name"
+              ],
+              "httpMethod": "DELETE",
+              "response": {
+                "$ref": "Empty"
+              },
+              "parameters": {
+                "name": {
+                  "location": "path",
+                  "description": "The RuntimeConfig resource to delete, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/configs/[^/]+$"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloudruntimeconfig"
+              ],
+              "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}",
+              "path": "v1beta1/{+name}",
+              "id": "runtimeconfig.projects.configs.delete",
+              "description": "Deletes a RuntimeConfig resource."
+            },
+            "list": {
+              "response": {
+                "$ref": "ListConfigsResponse"
+              },
+              "parameterOrder": [
+                "parent"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloudruntimeconfig"
+              ],
+              "parameters": {
+                "pageToken": {
+                  "location": "query",
+                  "description": "Specifies a page token to use. Set `pageToken` to a `nextPageToken`\nreturned by a previous list request to get the next page of results.",
+                  "type": "string"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "Specifies the number of results to return per page. If there are fewer\nelements than the specified number, returns all elements.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "parent": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$",
+                  "location": "path",
+                  "description": "The [project ID](https://support.google.com/cloud/answer/6158840?hl=en&ref_topic=6158848)\nfor this request, in the format `projects/[PROJECT_ID]`."
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectsId}/configs",
+              "path": "v1beta1/{+parent}/configs",
+              "id": "runtimeconfig.projects.configs.list",
+              "description": "Lists all the RuntimeConfig resources within project."
+            },
+            "create": {
+              "flatPath": "v1beta1/projects/{projectsId}/configs",
+              "id": "runtimeconfig.projects.configs.create",
+              "path": "v1beta1/{+parent}/configs",
+              "request": {
+                "$ref": "RuntimeConfig"
+              },
+              "description": "Creates a new RuntimeConfig resource. The configuration name must be\nunique within project.",
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "parent"
+              ],
+              "response": {
+                "$ref": "RuntimeConfig"
+              },
+              "parameters": {
+                "requestId": {
+                  "location": "query",
+                  "description": "An optional but recommended unique \u003ccode\u003erequest_id\u003c/code\u003e. If the server\nreceives two \u003ccode\u003ecreate()\u003c/code\u003e requests  with the same\n\u003ccode\u003erequest_id\u003c/code\u003e, then the second request will be ignored and the\nfirst resource created and stored in the backend is returned.\nEmpty \u003ccode\u003erequest_id\u003c/code\u003e fields are ignored.\n\nIt is responsibility of the client to ensure uniqueness of the\n\u003ccode\u003erequest_id\u003c/code\u003e strings.\n\n\u003ccode\u003erequest_id\u003c/code\u003e strings are limited to 64 characters.",
+                  "type": "string"
+                },
+                "parent": {
+                  "location": "path",
+                  "description": "The [project ID](https://support.google.com/cloud/answer/6158840?hl=en&ref_topic=6158848)\nfor this request, in the format `projects/[PROJECT_ID]`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+$"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloudruntimeconfig"
+              ]
+            },
+            "setIamPolicy": {
+              "path": "v1beta1/{+resource}:setIamPolicy",
+              "id": "runtimeconfig.projects.configs.setIamPolicy",
+              "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
+              "request": {
+                "$ref": "SetIamPolicyRequest"
+              },
+              "response": {
+                "$ref": "Policy"
+              },
+              "parameterOrder": [
+                "resource"
+              ],
+              "httpMethod": "POST",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloudruntimeconfig"
+              ],
+              "parameters": {
+                "resource": {
+                  "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/configs/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}:setIamPolicy"
+            },
+            "getIamPolicy": {
+              "response": {
+                "$ref": "Policy"
+              },
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "resource"
+              ],
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloudruntimeconfig"
+              ],
+              "parameters": {
+                "resource": {
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/configs/[^/]+$",
+                  "location": "path",
+                  "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`."
+                }
+              },
+              "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}:getIamPolicy",
+              "path": "v1beta1/{+resource}:getIamPolicy",
+              "id": "runtimeconfig.projects.configs.getIamPolicy",
+              "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset."
+            },
+            "get": {
+              "parameters": {
+                "name": {
+                  "description": "The name of the RuntimeConfig resource to retrieve, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/configs/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloudruntimeconfig"
+              ],
+              "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}",
+              "id": "runtimeconfig.projects.configs.get",
+              "path": "v1beta1/{+name}",
+              "description": "Gets information about a RuntimeConfig resource.",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "RuntimeConfig"
+              }
+            },
+            "update": {
+              "request": {
+                "$ref": "RuntimeConfig"
+              },
+              "description": "Updates a RuntimeConfig resource. The configuration must exist beforehand.",
+              "httpMethod": "PUT",
+              "parameterOrder": [
+                "name"
+              ],
+              "response": {
+                "$ref": "RuntimeConfig"
+              },
+              "parameters": {
+                "name": {
+                  "description": "The name of the RuntimeConfig resource to update, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`",
+                  "required": true,
+                  "type": "string",
+                  "pattern": "^projects/[^/]+/configs/[^/]+$",
+                  "location": "path"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloudruntimeconfig"
+              ],
+              "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}",
+              "id": "runtimeconfig.projects.configs.update",
+              "path": "v1beta1/{+name}"
+            }
+          },
+          "resources": {
+            "operations": {
+              "methods": {
+                "testIamPermissions": {
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/operations/{operationsId}:testIamPermissions",
+                  "id": "runtimeconfig.projects.configs.operations.testIamPermissions",
+                  "path": "v1beta1/{+resource}:testIamPermissions",
+                  "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
+                  "httpMethod": "GET",
+                  "parameterOrder": [
+                    "resource"
+                  ],
+                  "response": {
+                    "$ref": "TestIamPermissionsResponse"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "parameters": {
+                    "resource": {
+                      "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/configs/[^/]+/operations/.+$",
+                      "location": "path"
+                    },
+                    "permissions": {
+                      "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
+                      "type": "string",
+                      "repeated": true,
+                      "location": "query"
+                    }
+                  }
+                },
+                "get": {
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "pattern": "^projects/[^/]+/configs/[^/]+/operations/.+$",
+                      "location": "path",
+                      "description": "The name of the operation resource.",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/operations/{operationsId}",
+                  "id": "runtimeconfig.projects.configs.operations.get",
+                  "path": "v1beta1/{+name}",
+                  "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice.",
+                  "httpMethod": "GET",
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "response": {
+                    "$ref": "Operation"
+                  }
+                }
+              }
+            },
+            "waiters": {
+              "methods": {
+                "list": {
+                  "response": {
+                    "$ref": "ListWaitersResponse"
+                  },
+                  "parameterOrder": [
+                    "parent"
+                  ],
+                  "httpMethod": "GET",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "parameters": {
+                    "parent": {
+                      "description": "The path to the configuration for which you want to get a list of waiters.\nThe configuration must exist beforehand; the path must by in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/configs/[^/]+$",
+                      "location": "path"
+                    },
+                    "pageToken": {
+                      "location": "query",
+                      "description": "Specifies a page token to use. Set `pageToken` to a `nextPageToken`\nreturned by a previous list request to get the next page of results.",
+                      "type": "string"
+                    },
+                    "pageSize": {
+                      "type": "integer",
+                      "location": "query",
+                      "description": "Specifies the number of results to return per page. If there are fewer\nelements than the specified number, returns all elements.",
+                      "format": "int32"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/waiters",
+                  "path": "v1beta1/{+parent}/waiters",
+                  "id": "runtimeconfig.projects.configs.waiters.list",
+                  "description": "List waiters within the given configuration."
+                },
+                "get": {
+                  "response": {
+                    "$ref": "Waiter"
+                  },
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "httpMethod": "GET",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "pattern": "^projects/[^/]+/configs/[^/]+/waiters/[^/]+$",
+                      "location": "path",
+                      "description": "The fully-qualified name of the Waiter resource object to retrieve, in the\nformat:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]/waiters/[WAITER_NAME]`",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/waiters/{waitersId}",
+                  "path": "v1beta1/{+name}",
+                  "id": "runtimeconfig.projects.configs.waiters.get",
+                  "description": "Gets information about a single waiter."
+                },
+                "create": {
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/waiters",
+                  "id": "runtimeconfig.projects.configs.waiters.create",
+                  "path": "v1beta1/{+parent}/waiters",
+                  "description": "Creates a Waiter resource. This operation returns a long-running Operation\nresource which can be polled for completion. However, a waiter with the\ngiven name will exist (and can be retrieved) prior to the operation\ncompleting. If the operation fails, the failed Waiter resource will\nstill exist and must be deleted prior to subsequent creation attempts.",
+                  "request": {
+                    "$ref": "Waiter"
+                  },
+                  "httpMethod": "POST",
+                  "parameterOrder": [
+                    "parent"
+                  ],
+                  "response": {
+                    "$ref": "Operation"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "parameters": {
+                    "requestId": {
+                      "description": "An optional but recommended unique \u003ccode\u003erequest_id\u003c/code\u003e. If the server\nreceives two \u003ccode\u003ecreate()\u003c/code\u003e requests  with the same\n\u003ccode\u003erequest_id\u003c/code\u003e, then the second request will be ignored and the\nfirst resource created and stored in the backend is returned.\nEmpty \u003ccode\u003erequest_id\u003c/code\u003e fields are ignored.\n\nIt is responsibility of the client to ensure uniqueness of the\n\u003ccode\u003erequest_id\u003c/code\u003e strings.\n\n\u003ccode\u003erequest_id\u003c/code\u003e strings are limited to 64 characters.",
+                      "type": "string",
+                      "location": "query"
+                    },
+                    "parent": {
+                      "description": "The path to the configuration that will own the waiter.\nThe configuration must exist beforehand; the path must by in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/configs/[^/]+$",
+                      "location": "path"
+                    }
+                  }
+                },
+                "testIamPermissions": {
+                  "response": {
+                    "$ref": "TestIamPermissionsResponse"
+                  },
+                  "parameterOrder": [
+                    "resource"
+                  ],
+                  "httpMethod": "GET",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "parameters": {
+                    "resource": {
+                      "location": "path",
+                      "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/configs/[^/]+/waiters/[^/]+$"
+                    },
+                    "permissions": {
+                      "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
+                      "type": "string",
+                      "repeated": true,
+                      "location": "query"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/waiters/{waitersId}:testIamPermissions",
+                  "path": "v1beta1/{+resource}:testIamPermissions",
+                  "id": "runtimeconfig.projects.configs.waiters.testIamPermissions",
+                  "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error."
+                },
+                "delete": {
+                  "path": "v1beta1/{+name}",
+                  "id": "runtimeconfig.projects.configs.waiters.delete",
+                  "description": "Deletes the waiter with the specified name.",
+                  "response": {
+                    "$ref": "Empty"
+                  },
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "httpMethod": "DELETE",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "description": "The Waiter resource to delete, in the format:\n\n `projects/[PROJECT_ID]/configs/[CONFIG_NAME]/waiters/[WAITER_NAME]`",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/configs/[^/]+/waiters/[^/]+$",
+                      "location": "path"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/waiters/{waitersId}"
+                }
+              }
+            },
+            "variables": {
+              "methods": {
+                "list": {
+                  "httpMethod": "GET",
+                  "parameterOrder": [
+                    "parent"
+                  ],
+                  "response": {
+                    "$ref": "ListVariablesResponse"
+                  },
+                  "parameters": {
+                    "parent": {
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/configs/[^/]+$",
+                      "location": "path",
+                      "description": "The path to the RuntimeConfig resource for which you want to list variables.\nThe configuration must exist beforehand; the path must by in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`"
+                    },
+                    "filter": {
+                      "location": "query",
+                      "description": "Filters variables by matching the specified filter. For example:\n\n`projects/example-project/config/[CONFIG_NAME]/variables/example-variable`.",
+                      "type": "string"
+                    },
+                    "pageToken": {
+                      "type": "string",
+                      "location": "query",
+                      "description": "Specifies a page token to use. Set `pageToken` to a `nextPageToken`\nreturned by a previous list request to get the next page of results."
+                    },
+                    "pageSize": {
+                      "location": "query",
+                      "description": "Specifies the number of results to return per page. If there are fewer\nelements than the specified number, returns all elements.",
+                      "format": "int32",
+                      "type": "integer"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables",
+                  "id": "runtimeconfig.projects.configs.variables.list",
+                  "path": "v1beta1/{+parent}/variables",
+                  "description": "Lists variables within given a configuration, matching any provided filters.\nThis only lists variable names, not the values."
+                },
+                "create": {
+                  "httpMethod": "POST",
+                  "parameterOrder": [
+                    "parent"
+                  ],
+                  "response": {
+                    "$ref": "Variable"
+                  },
+                  "parameters": {
+                    "requestId": {
+                      "location": "query",
+                      "description": "An optional but recommended unique \u003ccode\u003erequest_id\u003c/code\u003e. If the server\nreceives two \u003ccode\u003ecreate()\u003c/code\u003e requests  with the same\n\u003ccode\u003erequest_id\u003c/code\u003e, then the second request will be ignored and the\nfirst resource created and stored in the backend is returned.\nEmpty \u003ccode\u003erequest_id\u003c/code\u003e fields are ignored.\n\nIt is responsibility of the client to ensure uniqueness of the\n\u003ccode\u003erequest_id\u003c/code\u003e strings.\n\n\u003ccode\u003erequest_id\u003c/code\u003e strings are limited to 64 characters.",
+                      "type": "string"
+                    },
+                    "parent": {
+                      "description": "The path to the RutimeConfig resource that this variable should belong to.\nThe configuration must exist beforehand; the path must by in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/configs/[^/]+$",
+                      "location": "path"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables",
+                  "id": "runtimeconfig.projects.configs.variables.create",
+                  "path": "v1beta1/{+parent}/variables",
+                  "request": {
+                    "$ref": "Variable"
+                  },
+                  "description": "Creates a variable within the given configuration. You cannot create\na variable with a name that is a prefix of an existing variable name, or a\nname that has an existing variable name as a prefix.\n\nTo learn more about creating a variable, read the\n[Setting and Getting Data](/deployment-manager/runtime-configurator/set-and-get-variables)\ndocumentation."
+                },
+                "get": {
+                  "description": "Gets information about a single variable.",
+                  "httpMethod": "GET",
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "response": {
+                    "$ref": "Variable"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "pattern": "^projects/[^/]+/configs/[^/]+/variables/.+$",
+                      "location": "path",
+                      "description": "The name of the variable to return, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]/variables/[VARIBLE_NAME]`",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}",
+                  "id": "runtimeconfig.projects.configs.variables.get",
+                  "path": "v1beta1/{+name}"
+                },
+                "watch": {
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/configs/[^/]+/variables/.+$",
+                      "location": "path",
+                      "description": "The name of the variable to watch, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]`"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}:watch",
+                  "path": "v1beta1/{+name}:watch",
+                  "id": "runtimeconfig.projects.configs.variables.watch",
+                  "description": "Watches a specific variable and waits for a change in the variable's value.\nWhen there is a change, this method returns the new value or times out.\n\nIf a variable is deleted while being watched, the `variableState` state is\nset to `DELETED` and the method returns the last known variable `value`.\n\nIf you set the deadline for watching to a larger value than internal timeout\n(60 seconds), the current variable value is returned and the `variableState`\nwill be `VARIABLE_STATE_UNSPECIFIED`.\n\nTo learn more about creating a watcher, read the\n[Watching a Variable for Changes](/deployment-manager/runtime-configurator/watching-a-variable)\ndocumentation.",
+                  "request": {
+                    "$ref": "WatchVariableRequest"
+                  },
+                  "response": {
+                    "$ref": "Variable"
+                  },
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "httpMethod": "POST"
+                },
+                "update": {
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}",
+                  "path": "v1beta1/{+name}",
+                  "id": "runtimeconfig.projects.configs.variables.update",
+                  "description": "Updates an existing variable with a new value.",
+                  "request": {
+                    "$ref": "Variable"
+                  },
+                  "response": {
+                    "$ref": "Variable"
+                  },
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "httpMethod": "PUT",
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "parameters": {
+                    "name": {
+                      "pattern": "^projects/[^/]+/configs/[^/]+/variables/.+$",
+                      "location": "path",
+                      "description": "The name of the variable to update, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]/variables/[VARIABLE_NAME]`",
+                      "required": true,
+                      "type": "string"
+                    }
+                  }
+                },
+                "testIamPermissions": {
+                  "id": "runtimeconfig.projects.configs.variables.testIamPermissions",
+                  "path": "v1beta1/{+resource}:testIamPermissions",
+                  "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
+                  "httpMethod": "GET",
+                  "response": {
+                    "$ref": "TestIamPermissionsResponse"
+                  },
+                  "parameterOrder": [
+                    "resource"
+                  ],
+                  "parameters": {
+                    "resource": {
+                      "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+                      "required": true,
+                      "type": "string",
+                      "pattern": "^projects/[^/]+/configs/[^/]+/variables/.+$",
+                      "location": "path"
+                    },
+                    "permissions": {
+                      "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
+                      "type": "string",
+                      "repeated": true,
+                      "location": "query"
+                    }
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}:testIamPermissions"
+                },
+                "delete": {
+                  "description": "Deletes a variable or multiple variables.\n\nIf you specify a variable name, then that variable is deleted. If you\nspecify a prefix and `recursive` is true, then all variables with that\nprefix are deleted. You must set a `recursive` to true if you delete\nvariables by prefix.",
+                  "httpMethod": "DELETE",
+                  "parameterOrder": [
+                    "name"
+                  ],
+                  "response": {
+                    "$ref": "Empty"
+                  },
+                  "scopes": [
+                    "https://www.googleapis.com/auth/cloud-platform",
+                    "https://www.googleapis.com/auth/cloudruntimeconfig"
+                  ],
+                  "parameters": {
+                    "recursive": {
+                      "description": "Set to `true` to recursively delete multiple variables with the same\nprefix.",
+                      "type": "boolean",
+                      "location": "query"
+                    },
+                    "name": {
+                      "pattern": "^projects/[^/]+/configs/[^/]+/variables/.+$",
+                      "location": "path",
+                      "description": "The name of the variable to delete, in the format:\n\n`projects/[PROJECT_ID]/configs/[CONFIG_NAME]/variables/[VARIABLE_NAME]`",
+                      "required": true,
+                      "type": "string"
+                    }
+                  },
+                  "flatPath": "v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}",
+                  "id": "runtimeconfig.projects.configs.variables.delete",
+                  "path": "v1beta1/{+name}"
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  "parameters": {
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "fields": {
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string",
+      "location": "query"
+    },
+    "callback": {
+      "description": "JSONP",
+      "type": "string",
+      "location": "query"
+    },
+    "$.xgafv": {
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query"
+    },
+    "alt": {
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json"
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
+    },
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
+    },
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
+    },
+    "upload_protocol": {
+      "location": "query",
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string"
+    }
+  },
+  "version": "v1beta1",
+  "baseUrl": "https://runtimeconfig.googleapis.com/",
+  "servicePath": "",
+  "kind": "discovery#restDescription",
+  "description": "Provides capabilities for dynamic configuration and coordination for applications running on Google Cloud Platform.\n"
 }
diff --git a/runtimeconfig/v1beta1/runtimeconfig-gen.go b/runtimeconfig/v1beta1/runtimeconfig-gen.go
index dc0667e..72e6e45 100644
--- a/runtimeconfig/v1beta1/runtimeconfig-gen.go
+++ b/runtimeconfig/v1beta1/runtimeconfig-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Configs = NewProjectsConfigsService(s)
@@ -1204,6 +1209,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.runtimeconfig)
 	if err != nil {
@@ -1343,6 +1349,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+name}")
@@ -1480,6 +1487,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1623,6 +1631,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1779,6 +1788,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1944,6 +1954,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -2084,6 +2095,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -2221,6 +2233,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.runtimeconfig)
 	if err != nil {
@@ -2370,6 +2383,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2526,6 +2540,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2692,6 +2707,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.variable)
 	if err != nil {
@@ -2847,6 +2863,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+name}")
@@ -2989,6 +3006,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3158,6 +3176,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3351,6 +3370,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3488,6 +3508,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.variable)
 	if err != nil {
@@ -3644,6 +3665,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.watchvariablerequest)
 	if err != nil {
@@ -3808,6 +3830,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.waiter)
 	if err != nil {
@@ -3947,6 +3970,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/{+name}")
@@ -4084,6 +4108,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4240,6 +4265,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4428,6 +4454,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/safebrowsing/v4/safebrowsing-gen.go b/safebrowsing/v4/safebrowsing-gen.go
index 729772b..1ce67a2 100644
--- a/safebrowsing/v4/safebrowsing-gen.go
+++ b/safebrowsing/v4/safebrowsing-gen.go
@@ -58,9 +58,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	FullHashes *FullHashesService
 
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewFullHashesService(s *Service) *FullHashesService {
 	rs := &FullHashesService{s: s}
 	return rs
@@ -1121,6 +1126,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.findfullhashesrequest)
 	if err != nil {
@@ -1236,6 +1242,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.fetchthreatlistupdatesrequest)
 	if err != nil {
@@ -1359,6 +1366,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1468,6 +1476,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.findthreatmatchesrequest)
 	if err != nil {
diff --git a/script/v1/script-api.json b/script/v1/script-api.json
index 48eb38c..7625840 100644
--- a/script/v1/script-api.json
+++ b/script/v1/script-api.json
@@ -1,330 +1,332 @@
 {
- "kind": "discovery#restDescription",
- "etag": "\"C5oy1hgQsABtYOYIOXWcR3BgYqU/FcNWZezE05ypidUunx03uCyJR70\"",
- "discoveryVersion": "v1",
- "id": "script:v1",
- "name": "script",
- "version": "v1",
- "revision": "20160801",
- "title": "Google Apps Script Execution API",
- "description": "Executes Google Apps Script projects.",
- "ownerDomain": "google.com",
- "ownerName": "Google",
- "icons": {
-  "x16": "http://www.google.com/images/icons/product/search-16.gif",
-  "x32": "http://www.google.com/images/icons/product/search-32.gif"
- },
- "documentationLink": "https://developers.google.com/apps-script/execution/rest/v1/scripts/run",
- "protocol": "rest",
- "baseUrl": "https://script.googleapis.com/",
- "basePath": "",
- "rootUrl": "https://script.googleapis.com/",
- "servicePath": "",
- "batchPath": "batch",
- "parameters": {
-  "access_token": {
-   "type": "string",
-   "description": "OAuth access token.",
-   "location": "query"
-  },
-  "alt": {
-   "type": "string",
-   "description": "Data format for response.",
-   "default": "json",
-   "enumDescriptions": [
-    "Responses with Content-Type of application/json",
-    "Media download with context-dependent Content-Type",
-    "Responses with Content-Type of application/x-protobuf"
-   ],
-   "location": "query"
-  },
-  "bearer_token": {
-   "type": "string",
-   "description": "OAuth bearer token.",
-   "location": "query"
-  },
-  "callback": {
-   "type": "string",
-   "description": "JSONP",
-   "location": "query"
-  },
-  "fields": {
-   "type": "string",
-   "description": "Selector specifying which fields to include in a partial response.",
-   "location": "query"
-  },
-  "key": {
-   "type": "string",
-   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-   "location": "query"
-  },
-  "oauth_token": {
-   "type": "string",
-   "description": "OAuth 2.0 token for the current user.",
-   "location": "query"
-  },
-  "pp": {
-   "type": "boolean",
-   "description": "Pretty-print response.",
-   "default": "true",
-   "location": "query"
-  },
-  "prettyPrint": {
-   "type": "boolean",
-   "description": "Returns response with indentations and line breaks.",
-   "default": "true",
-   "location": "query"
-  },
-  "quotaUser": {
-   "type": "string",
-   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-   "location": "query"
-  },
-  "upload_protocol": {
-   "type": "string",
-   "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-   "location": "query"
-  },
-  "uploadType": {
-   "type": "string",
-   "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-   "location": "query"
-  },
-  "$.xgafv": {
-   "type": "string",
-   "description": "V1 error format.",
-   "enumDescriptions": [
-    "v1 error format",
-    "v2 error format"
-   ],
-   "location": "query"
-  }
- },
- "auth": {
-  "oauth2": {
-   "scopes": {
-    "https://mail.google.com/": {
-     "description": "View and manage your mail"
-    },
-    "https://www.google.com/calendar/feeds": {
-     "description": "Manage your calendars"
-    },
-    "https://www.google.com/m8/feeds": {
-     "description": "Manage your contacts"
-    },
-    "https://www.googleapis.com/auth/admin.directory.group": {
-     "description": "View and manage the provisioning of groups on your domain"
-    },
-    "https://www.googleapis.com/auth/admin.directory.user": {
-     "description": "View and manage the provisioning of users on your domain"
-    },
-    "https://www.googleapis.com/auth/drive": {
-     "description": "View and manage the files in your Google Drive"
-    },
-    "https://www.googleapis.com/auth/forms": {
-     "description": "View and manage your forms in Google Drive"
-    },
-    "https://www.googleapis.com/auth/forms.currentonly": {
-     "description": "View and manage forms that this application has been installed in"
-    },
-    "https://www.googleapis.com/auth/groups": {
-     "description": "View and manage your Google Groups"
-    },
-    "https://www.googleapis.com/auth/spreadsheets": {
-     "description": "View and manage your spreadsheets in Google Drive"
-    },
-    "https://www.googleapis.com/auth/userinfo.email": {
-     "description": "View your email address"
+  "ownerDomain": "google.com",
+  "name": "script",
+  "batchPath": "batch",
+  "revision": "20170209",
+  "documentationLink": "https://developers.google.com/apps-script/execution/rest/v1/scripts/run",
+  "id": "script:v1",
+  "title": "Google Apps Script Execution API",
+  "discoveryVersion": "v1",
+  "ownerName": "Google",
+  "resources": {
+    "scripts": {
+      "methods": {
+        "run": {
+          "response": {
+            "$ref": "Operation"
+          },
+          "parameterOrder": [
+            "scriptId"
+          ],
+          "httpMethod": "POST",
+          "parameters": {
+            "scriptId": {
+              "location": "path",
+              "description": "The project key of the script to be executed. To find the project key, open\nthe project in the script editor and select **File \u003e Project properties**.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://mail.google.com/",
+            "https://www.google.com/calendar/feeds",
+            "https://www.google.com/m8/feeds",
+            "https://www.googleapis.com/auth/admin.directory.group",
+            "https://www.googleapis.com/auth/admin.directory.user",
+            "https://www.googleapis.com/auth/drive",
+            "https://www.googleapis.com/auth/forms",
+            "https://www.googleapis.com/auth/forms.currentonly",
+            "https://www.googleapis.com/auth/groups",
+            "https://www.googleapis.com/auth/spreadsheets",
+            "https://www.googleapis.com/auth/userinfo.email"
+          ],
+          "flatPath": "v1/scripts/{scriptId}:run",
+          "path": "v1/scripts/{scriptId}:run",
+          "id": "script.scripts.run",
+          "request": {
+            "$ref": "ExecutionRequest"
+          },
+          "description": "Runs a function in an Apps Script project. The project must be deployed\nfor use with the Apps Script Execution API.\n\nThis method requires authorization with an OAuth 2.0 token that includes at\nleast one of the scopes listed in the [Authorization](#authorization)\nsection; script projects that do not require authorization cannot be\nexecuted through this API. To find the correct scopes to include in the\nauthentication token, open the project in the script editor, then select\n**File \u003e Project properties** and click the **Scopes** tab."
+        }
+      }
     }
-   }
-  }
- },
- "schemas": {
-  "ExecutionRequest": {
-   "id": "ExecutionRequest",
-   "type": "object",
-   "description": "A request to run the function in a script. The script is identified by the specified `script_id`. Executing a function on a script will return results based on the implementation of the script.",
-   "properties": {
-    "function": {
-     "type": "string",
-     "description": "The name of the function to execute in the given script. The name does not include parentheses or parameters."
-    },
-    "parameters": {
-     "type": "array",
-     "description": "The parameters to be passed to the function being executed. The type for each parameter should match the expected type in Apps Script. Parameters cannot be Apps Script-specific objects (such as a `Document` or `Calendar`); they can only be primitive types such as a `string`, `number`, `array`, `object`, or `boolean`. Optional.",
-     "items": {
-      "type": "any"
-     }
-    },
-    "sessionState": {
-     "type": "string",
-     "description": "This field is not used."
-    },
-    "devMode": {
-     "type": "boolean",
-     "description": "If `true` and the user is an owner of the script, the script runs at the most recently saved version rather than the version deployed for use with the Execution API. Optional; default is `false`."
-    }
-   }
   },
-  "Operation": {
-   "id": "Operation",
-   "type": "object",
-   "description": "The response will not arrive until the function finishes executing. The maximum runtime is listed in the guide to [limitations in Apps Script](https://developers.google.com/apps-script/guides/services/quotas#current_limitations).\nIf the script function returns successfully, the `response` field will contain an `ExecutionResponse` object with the function's return value in the object's `result` field.\n\nIf the script function (or Apps Script itself) throws an exception, the `error` field will contain a `Status` object. The `Status` object's `details` field will contain an array with a single `ExecutionError` object that provides information about the nature of the error.\n\nIf the `run` call itself fails (for example, because of a malformed request or an authorization error), the method will return an HTTP response code in the 4XX range with a different format for the response body. Client libraries will automatically convert a 4XX response into an exception class.",
-   "properties": {
-    "name": {
-     "type": "string",
-     "description": "This field is not used."
+  "parameters": {
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
     },
-    "metadata": {
-     "type": "object",
-     "description": "This field is not used.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object. Contains field @type with type URL."
-     }
+    "bearer_token": {
+      "description": "OAuth bearer token.",
+      "type": "string",
+      "location": "query"
     },
-    "done": {
-     "type": "boolean",
-     "description": "This field is not used."
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
     },
-    "error": {
-     "$ref": "Status",
-     "description": "If a `run` call succeeds but the script function (or Apps Script itself) throws an exception, this field will contain a `Status` object. The `Status` object's `details` field will contain an array with a single `ExecutionError` object that provides information about the nature of the error."
+    "prettyPrint": {
+      "location": "query",
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true"
     },
-    "response": {
-     "type": "object",
-     "description": "If the script function returns successfully, this field will contain an `ExecutionResponse` object with the function's return value as the object's `result` field.",
-     "additionalProperties": {
-      "type": "any",
-      "description": "Properties of the object. Contains field @type with type URL."
-     }
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "uploadType": {
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "alt": {
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string",
+      "location": "query"
+    },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string",
+      "location": "query"
+    },
+    "pp": {
+      "location": "query",
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true"
     }
-   }
   },
-  "Status": {
-   "id": "Status",
-   "type": "object",
-   "description": "If a `run` call succeeds but the script function (or Apps Script itself) throws an exception, the response body's `error` field will contain this `Status` object.",
-   "properties": {
-    "code": {
-     "type": "integer",
-     "description": "The status code, which should be an enum value of google.rpc.Code.",
-     "format": "int32"
-    },
-    "message": {
-     "type": "string",
-     "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client."
-    },
-    "details": {
-     "type": "array",
-     "description": "An array that contains a single `ExecutionError` object that provides information about the nature of the error.",
-     "items": {
+  "schemas": {
+    "ExecutionResponse": {
+      "description": "An object that provides the return value of a function executed through the\nApps Script Execution API. If a\n`run` call succeeds and the\nscript function returns successfully, the response body's\n`response` field contains this\n`ExecutionResponse` object.",
       "type": "object",
-      "additionalProperties": {
-       "type": "any",
-       "description": "Properties of the object. Contains field @type with type URL."
+      "properties": {
+        "result": {
+          "description": "The return value of the script function. The type matches the object type\nreturned in Apps Script. Functions called through the Execution API cannot\nreturn Apps Script-specific objects (such as a `Document` or a `Calendar`);\nthey can only return primitive types such as a `string`, `number`, `array`,\n`object`, or `boolean`.",
+          "type": "any"
+        }
+      },
+      "id": "ExecutionResponse"
+    },
+    "Operation": {
+      "description": "The response will not arrive until the function finishes executing. The maximum runtime is listed in the guide to [limitations in Apps Script](https://developers.google.com/apps-script/guides/services/quotas#current_limitations).\n\u003cp\u003eIf the script function returns successfully, the `response` field will contain an `ExecutionResponse` object with the function's return value in the object's `result` field.\u003c/p\u003e\n\u003cp\u003eIf the script function (or Apps Script itself) throws an exception, the `error` field will contain a `Status` object. The `Status` object's `details` field will contain an array with a single `ExecutionError` object that provides information about the nature of the error.\u003c/p\u003e\n\u003cp\u003eIf the `run` call itself fails (for example, because of a malformed request or an authorization error), the method will return an HTTP response code in the 4XX range with a different format for the response body. Client libraries will automatically convert a 4XX response into an exception class.\u003c/p\u003e",
+      "type": "object",
+      "properties": {
+        "done": {
+          "description": "This field is not used.",
+          "type": "boolean"
+        },
+        "response": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "If the script function returns successfully, this field will contain an `ExecutionResponse` object with the function's return value as the object's `result` field.",
+          "type": "object"
+        },
+        "name": {
+          "description": "This field is not used.",
+          "type": "string"
+        },
+        "error": {
+          "description": "If a `run` call succeeds but the script function (or Apps Script itself) throws an exception, this field will contain a `Status` object. The `Status` object's `details` field will contain an array with a single `ExecutionError` object that provides information about the nature of the error.",
+          "$ref": "Status"
+        },
+        "metadata": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "This field is not used.",
+          "type": "object"
+        }
+      },
+      "id": "Operation"
+    },
+    "ScriptStackTraceElement": {
+      "description": "A stack trace through the script that shows where the execution failed.",
+      "type": "object",
+      "properties": {
+        "function": {
+          "description": "The name of the function that failed.",
+          "type": "string"
+        },
+        "lineNumber": {
+          "description": "The line number where the script failed.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "ScriptStackTraceElement"
+    },
+    "ExecutionError": {
+      "description": "An object that provides information about the nature of an error in the Apps\nScript Execution API. If an\n`run` call succeeds but the\nscript function (or Apps Script itself) throws an exception, the response\nbody's `error` field contains a\n`Status` object. The `Status` object's `details` field\ncontains an array with a single one of these `ExecutionError` objects.",
+      "type": "object",
+      "properties": {
+        "scriptStackTraceElements": {
+          "description": "An array of objects that provide a stack trace through the script to show\nwhere the execution failed, with the deepest call first.",
+          "type": "array",
+          "items": {
+            "$ref": "ScriptStackTraceElement"
+          }
+        },
+        "errorType": {
+          "description": "The error type, for example `TypeError` or `ReferenceError`. If the error\ntype is unavailable, this field is not included.",
+          "type": "string"
+        },
+        "errorMessage": {
+          "description": "The error message thrown by Apps Script, usually localized into the user's\nlanguage.",
+          "type": "string"
+        }
+      },
+      "id": "ExecutionError"
+    },
+    "Status": {
+      "properties": {
+        "details": {
+          "description": "An array that contains a single `ExecutionError` object that provides information about the nature of the error.",
+          "type": "array",
+          "items": {
+            "additionalProperties": {
+              "description": "Properties of the object. Contains field @type with type URL.",
+              "type": "any"
+            },
+            "type": "object"
+          }
+        },
+        "code": {
+          "description": "The status code. For this API, this value will always be 3, corresponding to an INVALID_ARGUMENT error.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "message": {
+          "description": "A developer-facing error message, which is in English. Any user-facing error message is localized and sent in the [`google.rpc.Status.details`](google.rpc.Status.details) field, or localized by the client.",
+          "type": "string"
+        }
+      },
+      "id": "Status",
+      "description": "If a `run` call succeeds but the script function (or Apps Script itself) throws an exception, the response body's `error` field will contain this `Status` object.",
+      "type": "object"
+    },
+    "ExecutionRequest": {
+      "description": "A request to run the function in a script. The script is identified by the\nspecified `script_id`. Executing a function on a script returns results\nbased on the implementation of the script.",
+      "type": "object",
+      "properties": {
+        "function": {
+          "description": "The name of the function to execute in the given script. The name does not\ninclude parentheses or parameters.",
+          "type": "string"
+        },
+        "devMode": {
+          "description": "If `true` and the user is an owner of the script, the script runs at the\nmost recently saved version rather than the version deployed for use with\nthe Execution API. Optional; default is `false`.",
+          "type": "boolean"
+        },
+        "parameters": {
+          "description": "The parameters to be passed to the function being executed. The object type\nfor each parameter should match the expected type in Apps Script.\nParameters cannot be Apps Script-specific object types (such as a\n`Document` or a `Calendar`); they can only be primitive types such as\n`string`, `number`, `array`, `object`, or `boolean`. Optional.",
+          "type": "array",
+          "items": {
+            "type": "any"
+          }
+        },
+        "sessionState": {
+          "description": "For Android add-ons only. An ID that represents the user's current session\nin the Android app for Google Docs or Sheets, included as extra data in the\n[`Intent`](https://developer.android.com/guide/components/intents-filters.html)\nthat launches the add-on. When an Android add-on is run with a session\nstate, it gains the privileges of a\n[bound](https://developers.google.com/apps-script/guides/bound) script &mdash;\nthat is, it can access information like the user's current cursor position\n(in Docs) or selected cell (in Sheets). To retrieve the state, call\n`Intent.getStringExtra(\"com.google.android.apps.docs.addons.SessionState\")`.\nOptional.",
+          "type": "string"
+        }
+      },
+      "id": "ExecutionRequest"
+    }
+  },
+  "protocol": "rest",
+  "icons": {
+    "x16": "http://www.google.com/images/icons/product/search-16.gif",
+    "x32": "http://www.google.com/images/icons/product/search-32.gif"
+  },
+  "version": "v1",
+  "baseUrl": "https://script.googleapis.com/",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/forms": {
+          "description": "View and manage your forms in Google Drive"
+        },
+        "https://www.google.com/m8/feeds": {
+          "description": "Manage your contacts"
+        },
+        "https://www.googleapis.com/auth/userinfo.email": {
+          "description": "View your email address"
+        },
+        "https://www.google.com/calendar/feeds": {
+          "description": "Manage your calendars"
+        },
+        "https://www.googleapis.com/auth/groups": {
+          "description": "View and manage your Google Groups"
+        },
+        "https://www.googleapis.com/auth/forms.currentonly": {
+          "description": "View and manage forms that this application has been installed in"
+        },
+        "https://www.googleapis.com/auth/drive": {
+          "description": "View and manage the files in your Google Drive"
+        },
+        "https://www.googleapis.com/auth/spreadsheets": {
+          "description": "View and manage your spreadsheets in Google Drive"
+        },
+        "https://mail.google.com/": {
+          "description": "View and manage your mail"
+        },
+        "https://www.googleapis.com/auth/admin.directory.group": {
+          "description": "View and manage the provisioning of groups on your domain"
+        },
+        "https://www.googleapis.com/auth/admin.directory.user": {
+          "description": "View and manage the provisioning of users on your domain"
+        }
       }
-     }
     }
-   }
   },
-  "ExecutionError": {
-   "id": "ExecutionError",
-   "type": "object",
-   "description": "An object that provides information about the nature of an error in the Apps Script Execution API. If an `run` call succeeds but the script function (or Apps Script itself) throws an exception, the response body's `error` field will contain a `Status` object. The `Status` object's `details` field will contain an array with a single one of these `ExecutionError` objects.",
-   "properties": {
-    "scriptStackTraceElements": {
-     "type": "array",
-     "description": "An array of objects that provide a stack trace through the script to show where the execution failed, with the deepest call first.",
-     "items": {
-      "$ref": "ScriptStackTraceElement"
-     }
-    },
-    "errorMessage": {
-     "type": "string",
-     "description": "The error message thrown by Apps Script, usually localized into the user's language."
-    },
-    "errorType": {
-     "type": "string",
-     "description": "The error type, for example `TypeError` or `ReferenceError`. If the error type is unavailable, this field is not included."
-    }
-   }
-  },
-  "ScriptStackTraceElement": {
-   "id": "ScriptStackTraceElement",
-   "type": "object",
-   "description": "A stack trace through the script that shows where the execution failed.",
-   "properties": {
-    "function": {
-     "type": "string",
-     "description": "The name of the function that failed."
-    },
-    "lineNumber": {
-     "type": "integer",
-     "description": "The line number where the script failed.",
-     "format": "int32"
-    }
-   }
-  },
-  "ExecutionResponse": {
-   "id": "ExecutionResponse",
-   "type": "object",
-   "description": "An object that provides the return value of a function executed through the Apps Script Execution API. If an `run` call succeeds and the script function returns successfully, the response body's `response` field will contain this `ExecutionResponse` object.",
-   "properties": {
-    "result": {
-     "type": "any",
-     "description": "The return value of the script function. The type will match the type returned in Apps Script. Functions called through the Execution API cannot return Apps Script-specific objects (such as a `Document` or `Calendar`); they can only return primitive types such as a `string`, `number`, `array`, `object`, or `boolean`."
-    },
-    "status": {
-     "type": "string",
-     "enum": [
-      "SUCCESS",
-      "CANCELED"
-     ]
-    }
-   }
-  }
- },
- "resources": {
-  "scripts": {
-   "methods": {
-    "run": {
-     "id": "script.scripts.run",
-     "path": "v1/scripts/{scriptId}:run",
-     "httpMethod": "POST",
-     "description": "Runs a function in an Apps Script project that has been deployed for use with the Apps Script Execution API. This method requires authorization with an OAuth 2.0 token that includes at least one of the scopes listed in the [Authentication](#authentication) section; script projects that do not require authorization cannot be executed through this API. To find the correct scopes to include in the authentication token, open the project in the script editor, then select **File \u003e Project properties** and click the **Scopes** tab.",
-     "parameters": {
-      "scriptId": {
-       "type": "string",
-       "description": "The project key of the script to be executed. To find the project key, open the project in the script editor, then select **File \u003e Project properties**.",
-       "required": true,
-       "location": "path"
-      }
-     },
-     "parameterOrder": [
-      "scriptId"
-     ],
-     "request": {
-      "$ref": "ExecutionRequest"
-     },
-     "response": {
-      "$ref": "Operation"
-     },
-     "scopes": [
-      "https://mail.google.com/",
-      "https://www.google.com/calendar/feeds",
-      "https://www.google.com/m8/feeds",
-      "https://www.googleapis.com/auth/admin.directory.group",
-      "https://www.googleapis.com/auth/admin.directory.user",
-      "https://www.googleapis.com/auth/drive",
-      "https://www.googleapis.com/auth/forms",
-      "https://www.googleapis.com/auth/forms.currentonly",
-      "https://www.googleapis.com/auth/groups",
-      "https://www.googleapis.com/auth/spreadsheets",
-      "https://www.googleapis.com/auth/userinfo.email"
-     ]
-    }
-   }
-  }
- }
+  "servicePath": "",
+  "description": "Executes Google Apps Script projects.",
+  "kind": "discovery#restDescription",
+  "rootUrl": "https://script.googleapis.com/",
+  "basePath": ""
 }
diff --git a/script/v1/script-gen.go b/script/v1/script-gen.go
index b1baf11..7584026 100644
--- a/script/v1/script-gen.go
+++ b/script/v1/script-gen.go
@@ -91,9 +91,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Scripts *ScriptsService
 }
@@ -105,6 +106,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewScriptsService(s *Service) *ScriptsService {
 	rs := &ScriptsService{s: s}
 	return rs
@@ -115,24 +120,29 @@
 }
 
 // ExecutionError: An object that provides information about the nature
-// of an error in the Apps Script Execution API. If an `run` call
-// succeeds but the script function (or Apps Script itself) throws an
-// exception, the response body's `error` field will contain a `Status`
-// object. The `Status` object's `details` field will contain an array
-// with a single one of these `ExecutionError` objects.
+// of an error in the Apps
+// Script Execution API. If an
+// `run` call succeeds but the
+// script function (or Apps Script itself) throws an exception, the
+// response
+// body's `error` field contains a
+// `Status` object. The `Status` object's `details` field
+// contains an array with a single one of these `ExecutionError`
+// objects.
 type ExecutionError struct {
 	// ErrorMessage: The error message thrown by Apps Script, usually
-	// localized into the user's language.
+	// localized into the user's
+	// language.
 	ErrorMessage string `json:"errorMessage,omitempty"`
 
 	// ErrorType: The error type, for example `TypeError` or
-	// `ReferenceError`. If the error type is unavailable, this field is not
-	// included.
+	// `ReferenceError`. If the error
+	// type is unavailable, this field is not included.
 	ErrorType string `json:"errorType,omitempty"`
 
 	// ScriptStackTraceElements: An array of objects that provide a stack
-	// trace through the script to show where the execution failed, with the
-	// deepest call first.
+	// trace through the script to show
+	// where the execution failed, with the deepest call first.
 	ScriptStackTraceElements []*ScriptStackTraceElement `json:"scriptStackTraceElements,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "ErrorMessage") to
@@ -159,29 +169,54 @@
 }
 
 // ExecutionRequest: A request to run the function in a script. The
-// script is identified by the specified `script_id`. Executing a
-// function on a script will return results based on the implementation
-// of the script.
+// script is identified by the
+// specified `script_id`. Executing a function on a script returns
+// results
+// based on the implementation of the script.
 type ExecutionRequest struct {
 	// DevMode: If `true` and the user is an owner of the script, the script
-	// runs at the most recently saved version rather than the version
-	// deployed for use with the Execution API. Optional; default is
-	// `false`.
+	// runs at the
+	// most recently saved version rather than the version deployed for use
+	// with
+	// the Execution API. Optional; default is `false`.
 	DevMode bool `json:"devMode,omitempty"`
 
 	// Function: The name of the function to execute in the given script.
-	// The name does not include parentheses or parameters.
+	// The name does not
+	// include parentheses or parameters.
 	Function string `json:"function,omitempty"`
 
 	// Parameters: The parameters to be passed to the function being
-	// executed. The type for each parameter should match the expected type
-	// in Apps Script. Parameters cannot be Apps Script-specific objects
-	// (such as a `Document` or `Calendar`); they can only be primitive
-	// types such as a `string`, `number`, `array`, `object`, or `boolean`.
-	// Optional.
+	// executed. The object type
+	// for each parameter should match the expected type in Apps
+	// Script.
+	// Parameters cannot be Apps Script-specific object types (such as
+	// a
+	// `Document` or a `Calendar`); they can only be primitive types such
+	// as
+	// `string`, `number`, `array`, `object`, or `boolean`. Optional.
 	Parameters []interface{} `json:"parameters,omitempty"`
 
-	// SessionState: This field is not used.
+	// SessionState: For Android add-ons only. An ID that represents the
+	// user's current session
+	// in the Android app for Google Docs or Sheets, included as extra data
+	// in
+	// the
+	// [`Intent`](https://developer.android.com/guide/components/intents-
+	// filters.html)
+	// that launches the add-on. When an Android add-on is run with a
+	// session
+	// state, it gains the privileges of
+	// a
+	// [bound](https://developers.google.com/apps-script/guides/bound)
+	// script &mdash;
+	// that is, it can access information like the user's current cursor
+	// position
+	// (in Docs) or selected cell (in Sheets). To retrieve the state,
+	// call
+	// `Intent.getStringExtra("com.google.android.apps.docs.addons.Sessi
+	// onState")`.
+	// Optional.
 	SessionState string `json:"sessionState,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "DevMode") to
@@ -208,23 +243,24 @@
 }
 
 // ExecutionResponse: An object that provides the return value of a
-// function executed through the Apps Script Execution API. If an `run`
-// call succeeds and the script function returns successfully, the
-// response body's `response` field will contain this
+// function executed through the
+// Apps Script Execution API. If a
+// `run` call succeeds and the
+// script function returns successfully, the response body's
+// `response` field contains this
 // `ExecutionResponse` object.
 type ExecutionResponse struct {
-	// Result: The return value of the script function. The type will match
-	// the type returned in Apps Script. Functions called through the
-	// Execution API cannot return Apps Script-specific objects (such as a
-	// `Document` or `Calendar`); they can only return primitive types such
-	// as a `string`, `number`, `array`, `object`, or `boolean`.
+	// Result: The return value of the script function. The type matches the
+	// object type
+	// returned in Apps Script. Functions called through the Execution API
+	// cannot
+	// return Apps Script-specific objects (such as a `Document` or a
+	// `Calendar`);
+	// they can only return primitive types such as a `string`, `number`,
+	// `array`,
+	// `object`, or `boolean`.
 	Result interface{} `json:"result,omitempty"`
 
-	// Possible values:
-	//   "SUCCESS"
-	//   "CANCELED"
-	Status string `json:"status,omitempty"`
-
 	// ForceSendFields is a list of field names (e.g. "Result") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -253,21 +289,19 @@
 // in Apps
 // Script](https://developers.google.com/apps-script/guides/services/quot
 // as#current_limitations).
-// If the script function returns successfully, the `response` field
+// <p>If the script function returns successfully, the `response` field
 // will contain an `ExecutionResponse` object with the function's return
-// value in the object's `result` field.
-//
-// If the script function (or Apps Script itself) throws an exception,
-// the `error` field will contain a `Status` object. The `Status`
-// object's `details` field will contain an array with a single
+// value in the object's `result` field.</p>
+// <p>If the script function (or Apps Script itself) throws an
+// exception, the `error` field will contain a `Status` object. The
+// `Status` object's `details` field will contain an array with a single
 // `ExecutionError` object that provides information about the nature of
-// the error.
-//
-// If the `run` call itself fails (for example, because of a malformed
-// request or an authorization error), the method will return an HTTP
-// response code in the 4XX range with a different format for the
-// response body. Client libraries will automatically convert a 4XX
-// response into an exception class.
+// the error.</p>
+// <p>If the `run` call itself fails (for example, because of a
+// malformed request or an authorization error), the method will return
+// an HTTP response code in the 4XX range with a different format for
+// the response body. Client libraries will automatically convert a 4XX
+// response into an exception class.</p>
 type Operation struct {
 	// Done: This field is not used.
 	Done bool `json:"done,omitempty"`
@@ -353,17 +387,18 @@
 // Script itself) throws an exception, the response body's `error` field
 // will contain this `Status` object.
 type Status struct {
-	// Code: The status code, which should be an enum value of
-	// google.rpc.Code.
+	// Code: The status code. For this API, this value will always be 3,
+	// corresponding to an INVALID_ARGUMENT error.
 	Code int64 `json:"code,omitempty"`
 
 	// Details: An array that contains a single `ExecutionError` object that
 	// provides information about the nature of the error.
 	Details []googleapi.RawMessage `json:"details,omitempty"`
 
-	// Message: A developer-facing error message, which should be in
-	// English. Any user-facing error message should be localized and sent
-	// in the google.rpc.Status.details field, or localized by the client.
+	// Message: A developer-facing error message, which is in English. Any
+	// user-facing error message is localized and sent in the
+	// [`google.rpc.Status.details`](google.rpc.Status.details) field, or
+	// localized by the client.
 	Message string `json:"message,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Code") to
@@ -400,14 +435,21 @@
 	header_          http.Header
 }
 
-// Run: Runs a function in an Apps Script project that has been deployed
-// for use with the Apps Script Execution API. This method requires
-// authorization with an OAuth 2.0 token that includes at least one of
-// the scopes listed in the [Authentication](#authentication) section;
-// script projects that do not require authorization cannot be executed
-// through this API. To find the correct scopes to include in the
+// Run: Runs a function in an Apps Script project. The project must be
+// deployed
+// for use with the Apps Script Execution API.
+//
+// This method requires authorization with an OAuth 2.0 token that
+// includes at
+// least one of the scopes listed in the
+// [Authorization](#authorization)
+// section; script projects that do not require authorization cannot
+// be
+// executed through this API. To find the correct scopes to include in
+// the
 // authentication token, open the project in the script editor, then
-// select **File > Project properties** and click the **Scopes** tab.
+// select
+// **File > Project properties** and click the **Scopes** tab.
 func (r *ScriptsService) Run(scriptId string, executionrequest *ExecutionRequest) *ScriptsRunCall {
 	c := &ScriptsRunCall{s: r.s, urlParams_: make(gensupport.URLParams)}
 	c.scriptId = scriptId
@@ -446,6 +488,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.executionrequest)
 	if err != nil {
@@ -501,7 +544,8 @@
 	}
 	return ret, nil
 	// {
-	//   "description": "Runs a function in an Apps Script project that has been deployed for use with the Apps Script Execution API. This method requires authorization with an OAuth 2.0 token that includes at least one of the scopes listed in the [Authentication](#authentication) section; script projects that do not require authorization cannot be executed through this API. To find the correct scopes to include in the authentication token, open the project in the script editor, then select **File \u003e Project properties** and click the **Scopes** tab.",
+	//   "description": "Runs a function in an Apps Script project. The project must be deployed\nfor use with the Apps Script Execution API.\n\nThis method requires authorization with an OAuth 2.0 token that includes at\nleast one of the scopes listed in the [Authorization](#authorization)\nsection; script projects that do not require authorization cannot be\nexecuted through this API. To find the correct scopes to include in the\nauthentication token, open the project in the script editor, then select\n**File \u003e Project properties** and click the **Scopes** tab.",
+	//   "flatPath": "v1/scripts/{scriptId}:run",
 	//   "httpMethod": "POST",
 	//   "id": "script.scripts.run",
 	//   "parameterOrder": [
@@ -509,7 +553,7 @@
 	//   ],
 	//   "parameters": {
 	//     "scriptId": {
-	//       "description": "The project key of the script to be executed. To find the project key, open the project in the script editor, then select **File \u003e Project properties**.",
+	//       "description": "The project key of the script to be executed. To find the project key, open\nthe project in the script editor and select **File \u003e Project properties**.",
 	//       "location": "path",
 	//       "required": true,
 	//       "type": "string"
diff --git a/searchconsole/v1/searchconsole-api.json b/searchconsole/v1/searchconsole-api.json
new file mode 100644
index 0000000..167c986
--- /dev/null
+++ b/searchconsole/v1/searchconsole-api.json
@@ -0,0 +1,292 @@
+{
+  "baseUrl": "https://searchconsole.googleapis.com/",
+  "canonicalName": "Search Console",
+  "kind": "discovery#restDescription",
+  "servicePath": "",
+  "description": "Provides tools for running validation tests against single URLs",
+  "rootUrl": "https://searchconsole.googleapis.com/",
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "searchconsole",
+  "batchPath": "batch",
+  "revision": "20170208",
+  "documentationLink": "https://developers.google.com/webmaster-tools/search-console-api/",
+  "id": "searchconsole:v1",
+  "title": "Google Search Console URL Testing Tools API",
+  "ownerName": "Google",
+  "discoveryVersion": "v1",
+  "version_module": "True",
+  "resources": {
+    "urlTestingTools": {
+      "resources": {
+        "mobileFriendlyTest": {
+          "methods": {
+            "run": {
+              "response": {
+                "$ref": "RunMobileFriendlyTestResponse"
+              },
+              "parameterOrder": [],
+              "httpMethod": "POST",
+              "parameters": {},
+              "flatPath": "v1/urlTestingTools/mobileFriendlyTest:run",
+              "path": "v1/urlTestingTools/mobileFriendlyTest:run",
+              "id": "searchconsole.urlTestingTools.mobileFriendlyTest.run",
+              "description": "Runs Mobile-Friendly Test for a given URL.",
+              "request": {
+                "$ref": "RunMobileFriendlyTestRequest"
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  "parameters": {
+    "pp": {
+      "description": "Pretty-print response.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
+    },
+    "bearer_token": {
+      "type": "string",
+      "location": "query",
+      "description": "OAuth bearer token."
+    },
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "prettyPrint": {
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "type": "string",
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format."
+    },
+    "callback": {
+      "location": "query",
+      "description": "JSONP",
+      "type": "string"
+    },
+    "alt": {
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json",
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ]
+    },
+    "key": {
+      "location": "query",
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string",
+      "location": "query"
+    }
+  },
+  "schemas": {
+    "MobileFriendlyIssue": {
+      "type": "object",
+      "properties": {
+        "rule": {
+          "enum": [
+            "MOBILE_FRIENDLY_RULE_UNSPECIFIED",
+            "USES_INCOMPATIBLE_PLUGINS",
+            "CONFIGURE_VIEWPORT",
+            "FIXED_WIDTH_VIEWPORT",
+            "SIZE_CONTENT_TO_VIEWPORT",
+            "USE_LEGIBLE_FONT_SIZES",
+            "TAP_TARGETS_TOO_CLOSE"
+          ],
+          "description": "Rule violated.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unknown rule. Sorry, we don't have any description for the rule that was\nbroken.",
+            "Plugins incompatible with mobile devices are being used. [Learn more]\n(https://support.google.com/webmasters/answer/6352293#flash_usage).",
+            "Viewsport is not specified using the meta viewport tag. [Learn more]\n(https://support.google.com/webmasters/answer/6352293#viewport_not_configured).",
+            "Viewport defined to a fixed width. [Learn more]\n(https://support.google.com/webmasters/answer/6352293#fixed-width_viewport).",
+            "Content not sized to viewport. [Learn more]\n(https://support.google.com/webmasters/answer/6352293#content_not_sized_to_viewport).",
+            "Font size is too small for easy reading on a small screen. [Learn More]\n(https://support.google.com/webmasters/answer/6352293#small_font_size).",
+            "Touch elements are too close to each other. [Learn more]\n(https://support.google.com/webmasters/answer/6352293#touch_elements_too_close)."
+          ]
+        }
+      },
+      "id": "MobileFriendlyIssue",
+      "description": "Mobile-friendly issue."
+    },
+    "RunMobileFriendlyTestResponse": {
+      "description": "Mobile-friendly test response, including mobile-friendly issues and resource\nissues.",
+      "type": "object",
+      "properties": {
+        "mobileFriendliness": {
+          "enumDescriptions": [
+            "Internal error when running this test. Please try running the test again.",
+            "The page is mobile friendly.",
+            "The page is not mobile friendly."
+          ],
+          "enum": [
+            "MOBILE_FRIENDLY_TEST_RESULT_UNSPECIFIED",
+            "MOBILE_FRIENDLY",
+            "NOT_MOBILE_FRIENDLY"
+          ],
+          "description": "Test verdict, whether the page is mobile friendly or not.",
+          "type": "string"
+        },
+        "mobileFriendlyIssues": {
+          "description": "List of mobile-usability issues.",
+          "type": "array",
+          "items": {
+            "$ref": "MobileFriendlyIssue"
+          }
+        },
+        "screenshot": {
+          "description": "Screenshot of the requested URL.",
+          "$ref": "Image"
+        },
+        "testStatus": {
+          "description": "Final state of the test, can be either complete or an error.",
+          "$ref": "TestStatus"
+        },
+        "resourceIssues": {
+          "description": "Information about embedded resources issues.",
+          "type": "array",
+          "items": {
+            "$ref": "ResourceIssue"
+          }
+        }
+      },
+      "id": "RunMobileFriendlyTestResponse"
+    },
+    "ResourceIssue": {
+      "properties": {
+        "blockedResource": {
+          "$ref": "BlockedResource",
+          "description": "Describes a blocked resource issue."
+        }
+      },
+      "id": "ResourceIssue",
+      "description": "Information about a resource with issue.",
+      "type": "object"
+    },
+    "BlockedResource": {
+      "description": "Blocked resource.",
+      "type": "object",
+      "properties": {
+        "url": {
+          "type": "string",
+          "description": "URL of the blocked resource."
+        }
+      },
+      "id": "BlockedResource"
+    },
+    "TestStatus": {
+      "description": "Final state of the test, including error details if necessary.",
+      "type": "object",
+      "properties": {
+        "details": {
+          "description": "Error details if applicable.",
+          "type": "string"
+        },
+        "status": {
+          "type": "string",
+          "enumDescriptions": [
+            "Internal error when running this test. Please try running the test again.",
+            "Inspection has completed without errors.",
+            "Inspection terminated in an error state. This indicates a problem in\nGoogle's infrastructure, not a user error. Please try again later.",
+            "Google can not access the URL because of a user error such as a robots.txt\nblockage, a 403 or 500 code etc. Please make sure that the URL provided is\naccessible by Googlebot and is not password protected."
+          ],
+          "enum": [
+            "TEST_STATUS_UNSPECIFIED",
+            "COMPLETE",
+            "INTERNAL_ERROR",
+            "PAGE_UNREACHABLE"
+          ],
+          "description": "Status of the test."
+        }
+      },
+      "id": "TestStatus"
+    },
+    "Image": {
+      "properties": {
+        "mimeType": {
+          "description": "The mime-type of the image data.",
+          "type": "string"
+        },
+        "data": {
+          "type": "string",
+          "description": "Image data in format determined by the mime type. Currently, the format\nwill always be \"image/png\", but this might change in the future.",
+          "format": "byte"
+        }
+      },
+      "id": "Image",
+      "description": "Describe image data.",
+      "type": "object"
+    },
+    "RunMobileFriendlyTestRequest": {
+      "description": "Mobile-friendly test request.",
+      "type": "object",
+      "properties": {
+        "url": {
+          "description": "URL for inspection.",
+          "type": "string"
+        },
+        "requestScreenshot": {
+          "description": "Whether or not screenshot is requested. Default is false.",
+          "type": "boolean"
+        }
+      },
+      "id": "RunMobileFriendlyTestRequest"
+    }
+  },
+  "protocol": "rest",
+  "icons": {
+    "x32": "http://www.google.com/images/icons/product/search-32.gif",
+    "x16": "http://www.google.com/images/icons/product/search-16.gif"
+  },
+  "version": "v1"
+}
diff --git a/searchconsole/v1/searchconsole-gen.go b/searchconsole/v1/searchconsole-gen.go
new file mode 100644
index 0000000..b88c900
--- /dev/null
+++ b/searchconsole/v1/searchconsole-gen.go
@@ -0,0 +1,498 @@
+// Package searchconsole provides access to the Google Search Console URL Testing Tools API.
+//
+// See https://developers.google.com/webmaster-tools/search-console-api/
+//
+// Usage example:
+//
+//   import "google.golang.org/api/searchconsole/v1"
+//   ...
+//   searchconsoleService, err := searchconsole.New(oauthHttpClient)
+package searchconsole // import "google.golang.org/api/searchconsole/v1"
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	context "golang.org/x/net/context"
+	ctxhttp "golang.org/x/net/context/ctxhttp"
+	gensupport "google.golang.org/api/gensupport"
+	googleapi "google.golang.org/api/googleapi"
+	"io"
+	"net/http"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Always reference these packages, just in case the auto-generated code
+// below doesn't.
+var _ = bytes.NewBuffer
+var _ = strconv.Itoa
+var _ = fmt.Sprintf
+var _ = json.NewDecoder
+var _ = io.Copy
+var _ = url.Parse
+var _ = gensupport.MarshalJSON
+var _ = googleapi.Version
+var _ = errors.New
+var _ = strings.Replace
+var _ = context.Canceled
+var _ = ctxhttp.Do
+
+const apiId = "searchconsole:v1"
+const apiName = "searchconsole"
+const apiVersion = "v1"
+const basePath = "https://searchconsole.googleapis.com/"
+
+func New(client *http.Client) (*Service, error) {
+	if client == nil {
+		return nil, errors.New("client is nil")
+	}
+	s := &Service{client: client, BasePath: basePath}
+	s.UrlTestingTools = NewUrlTestingToolsService(s)
+	return s, nil
+}
+
+type Service struct {
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
+
+	UrlTestingTools *UrlTestingToolsService
+}
+
+func (s *Service) userAgent() string {
+	if s.UserAgent == "" {
+		return googleapi.UserAgent
+	}
+	return googleapi.UserAgent + " " + s.UserAgent
+}
+
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
+func NewUrlTestingToolsService(s *Service) *UrlTestingToolsService {
+	rs := &UrlTestingToolsService{s: s}
+	rs.MobileFriendlyTest = NewUrlTestingToolsMobileFriendlyTestService(s)
+	return rs
+}
+
+type UrlTestingToolsService struct {
+	s *Service
+
+	MobileFriendlyTest *UrlTestingToolsMobileFriendlyTestService
+}
+
+func NewUrlTestingToolsMobileFriendlyTestService(s *Service) *UrlTestingToolsMobileFriendlyTestService {
+	rs := &UrlTestingToolsMobileFriendlyTestService{s: s}
+	return rs
+}
+
+type UrlTestingToolsMobileFriendlyTestService struct {
+	s *Service
+}
+
+// BlockedResource: Blocked resource.
+type BlockedResource struct {
+	// Url: URL of the blocked resource.
+	Url string `json:"url,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Url") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Url") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *BlockedResource) MarshalJSON() ([]byte, error) {
+	type noMethod BlockedResource
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// Image: Describe image data.
+type Image struct {
+	// Data: Image data in format determined by the mime type. Currently,
+	// the format
+	// will always be "image/png", but this might change in the future.
+	Data string `json:"data,omitempty"`
+
+	// MimeType: The mime-type of the image data.
+	MimeType string `json:"mimeType,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Data") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Data") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Image) MarshalJSON() ([]byte, error) {
+	type noMethod Image
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// MobileFriendlyIssue: Mobile-friendly issue.
+type MobileFriendlyIssue struct {
+	// Rule: Rule violated.
+	//
+	// Possible values:
+	//   "MOBILE_FRIENDLY_RULE_UNSPECIFIED" - Unknown rule. Sorry, we don't
+	// have any description for the rule that was
+	// broken.
+	//   "USES_INCOMPATIBLE_PLUGINS" - Plugins incompatible with mobile
+	// devices are being used. [Learn
+	// more]
+	// (https://support.google.com/webmasters/answer/6352293#flash_usag
+	// e).
+	//   "CONFIGURE_VIEWPORT" - Viewsport is not specified using the meta
+	// viewport tag. [Learn
+	// more]
+	// (https://support.google.com/webmasters/answer/6352293#viewport_n
+	// ot_configured).
+	//   "FIXED_WIDTH_VIEWPORT" - Viewport defined to a fixed width. [Learn
+	// more]
+	// (https://support.google.com/webmasters/answer/6352293#fixed-widt
+	// h_viewport).
+	//   "SIZE_CONTENT_TO_VIEWPORT" - Content not sized to viewport. [Learn
+	// more]
+	// (https://support.google.com/webmasters/answer/6352293#content_no
+	// t_sized_to_viewport).
+	//   "USE_LEGIBLE_FONT_SIZES" - Font size is too small for easy reading
+	// on a small screen. [Learn
+	// More]
+	// (https://support.google.com/webmasters/answer/6352293#small_font
+	// _size).
+	//   "TAP_TARGETS_TOO_CLOSE" - Touch elements are too close to each
+	// other. [Learn
+	// more]
+	// (https://support.google.com/webmasters/answer/6352293#touch_elem
+	// ents_too_close).
+	Rule string `json:"rule,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Rule") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Rule") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *MobileFriendlyIssue) MarshalJSON() ([]byte, error) {
+	type noMethod MobileFriendlyIssue
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// ResourceIssue: Information about a resource with issue.
+type ResourceIssue struct {
+	// BlockedResource: Describes a blocked resource issue.
+	BlockedResource *BlockedResource `json:"blockedResource,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "BlockedResource") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "BlockedResource") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ResourceIssue) MarshalJSON() ([]byte, error) {
+	type noMethod ResourceIssue
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// RunMobileFriendlyTestRequest: Mobile-friendly test request.
+type RunMobileFriendlyTestRequest struct {
+	// RequestScreenshot: Whether or not screenshot is requested. Default is
+	// false.
+	RequestScreenshot bool `json:"requestScreenshot,omitempty"`
+
+	// Url: URL for inspection.
+	Url string `json:"url,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "RequestScreenshot")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "RequestScreenshot") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *RunMobileFriendlyTestRequest) MarshalJSON() ([]byte, error) {
+	type noMethod RunMobileFriendlyTestRequest
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// RunMobileFriendlyTestResponse: Mobile-friendly test response,
+// including mobile-friendly issues and resource
+// issues.
+type RunMobileFriendlyTestResponse struct {
+	// MobileFriendliness: Test verdict, whether the page is mobile friendly
+	// or not.
+	//
+	// Possible values:
+	//   "MOBILE_FRIENDLY_TEST_RESULT_UNSPECIFIED" - Internal error when
+	// running this test. Please try running the test again.
+	//   "MOBILE_FRIENDLY" - The page is mobile friendly.
+	//   "NOT_MOBILE_FRIENDLY" - The page is not mobile friendly.
+	MobileFriendliness string `json:"mobileFriendliness,omitempty"`
+
+	// MobileFriendlyIssues: List of mobile-usability issues.
+	MobileFriendlyIssues []*MobileFriendlyIssue `json:"mobileFriendlyIssues,omitempty"`
+
+	// ResourceIssues: Information about embedded resources issues.
+	ResourceIssues []*ResourceIssue `json:"resourceIssues,omitempty"`
+
+	// Screenshot: Screenshot of the requested URL.
+	Screenshot *Image `json:"screenshot,omitempty"`
+
+	// TestStatus: Final state of the test, can be either complete or an
+	// error.
+	TestStatus *TestStatus `json:"testStatus,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "MobileFriendliness")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "MobileFriendliness") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *RunMobileFriendlyTestResponse) MarshalJSON() ([]byte, error) {
+	type noMethod RunMobileFriendlyTestResponse
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// TestStatus: Final state of the test, including error details if
+// necessary.
+type TestStatus struct {
+	// Details: Error details if applicable.
+	Details string `json:"details,omitempty"`
+
+	// Status: Status of the test.
+	//
+	// Possible values:
+	//   "TEST_STATUS_UNSPECIFIED" - Internal error when running this test.
+	// Please try running the test again.
+	//   "COMPLETE" - Inspection has completed without errors.
+	//   "INTERNAL_ERROR" - Inspection terminated in an error state. This
+	// indicates a problem in
+	// Google's infrastructure, not a user error. Please try again later.
+	//   "PAGE_UNREACHABLE" - Google can not access the URL because of a
+	// user error such as a robots.txt
+	// blockage, a 403 or 500 code etc. Please make sure that the URL
+	// provided is
+	// accessible by Googlebot and is not password protected.
+	Status string `json:"status,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Details") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Details") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *TestStatus) MarshalJSON() ([]byte, error) {
+	type noMethod TestStatus
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// method id "searchconsole.urlTestingTools.mobileFriendlyTest.run":
+
+type UrlTestingToolsMobileFriendlyTestRunCall struct {
+	s                            *Service
+	runmobilefriendlytestrequest *RunMobileFriendlyTestRequest
+	urlParams_                   gensupport.URLParams
+	ctx_                         context.Context
+	header_                      http.Header
+}
+
+// Run: Runs Mobile-Friendly Test for a given URL.
+func (r *UrlTestingToolsMobileFriendlyTestService) Run(runmobilefriendlytestrequest *RunMobileFriendlyTestRequest) *UrlTestingToolsMobileFriendlyTestRunCall {
+	c := &UrlTestingToolsMobileFriendlyTestRunCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.runmobilefriendlytestrequest = runmobilefriendlytestrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *UrlTestingToolsMobileFriendlyTestRunCall) Fields(s ...googleapi.Field) *UrlTestingToolsMobileFriendlyTestRunCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *UrlTestingToolsMobileFriendlyTestRunCall) Context(ctx context.Context) *UrlTestingToolsMobileFriendlyTestRunCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *UrlTestingToolsMobileFriendlyTestRunCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *UrlTestingToolsMobileFriendlyTestRunCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.runmobilefriendlytestrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/urlTestingTools/mobileFriendlyTest:run")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "searchconsole.urlTestingTools.mobileFriendlyTest.run" call.
+// Exactly one of *RunMobileFriendlyTestResponse or error will be
+// non-nil. Any non-2xx status code is an error. Response headers are in
+// either *RunMobileFriendlyTestResponse.ServerResponse.Header or (if a
+// response was returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *UrlTestingToolsMobileFriendlyTestRunCall) Do(opts ...googleapi.CallOption) (*RunMobileFriendlyTestResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &RunMobileFriendlyTestResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Runs Mobile-Friendly Test for a given URL.",
+	//   "flatPath": "v1/urlTestingTools/mobileFriendlyTest:run",
+	//   "httpMethod": "POST",
+	//   "id": "searchconsole.urlTestingTools.mobileFriendlyTest.run",
+	//   "parameterOrder": [],
+	//   "parameters": {},
+	//   "path": "v1/urlTestingTools/mobileFriendlyTest:run",
+	//   "request": {
+	//     "$ref": "RunMobileFriendlyTestRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "RunMobileFriendlyTestResponse"
+	//   }
+	// }
+
+}
diff --git a/servicecontrol/v1/servicecontrol-api.json b/servicecontrol/v1/servicecontrol-api.json
index 04160f5..e34efd5 100644
--- a/servicecontrol/v1/servicecontrol-api.json
+++ b/servicecontrol/v1/servicecontrol-api.json
@@ -18,6 +18,62 @@
   "resources": {
     "services": {
       "methods": {
+        "endReconciliation": {
+          "id": "servicecontrol.services.endReconciliation",
+          "response": {
+            "$ref": "EndReconciliationResponse"
+          },
+          "parameterOrder": [
+            "serviceName"
+          ],
+          "description": "Signals the quota controller that service ends the ongoing usage\nreconciliation.\n\nThis method requires the `servicemanagement.services.quota`\npermission on the specified service. For more information, see\n[Google Cloud IAM](https://cloud.google.com/iam).",
+          "request": {
+            "$ref": "EndReconciliationRequest"
+          },
+          "flatPath": "v1/services/{serviceName}:endReconciliation",
+          "httpMethod": "POST",
+          "parameters": {
+            "serviceName": {
+              "description": "Name of the service as specified in the service configuration. For example,\n`\"pubsub.googleapis.com\"`.\n\nSee google.api.Service for the definition of a service name.",
+              "required": true,
+              "location": "path",
+              "type": "string"
+            }
+          },
+          "path": "v1/services/{serviceName}:endReconciliation",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/servicecontrol"
+          ]
+        },
+        "releaseQuota": {
+          "id": "servicecontrol.services.releaseQuota",
+          "response": {
+            "$ref": "ReleaseQuotaResponse"
+          },
+          "parameterOrder": [
+            "serviceName"
+          ],
+          "description": "Releases previously allocated quota done through AllocateQuota method.\n\nThis method requires the `servicemanagement.services.quota`\npermission on the specified service. For more information, see\n[Google Cloud IAM](https://cloud.google.com/iam).",
+          "request": {
+            "$ref": "ReleaseQuotaRequest"
+          },
+          "flatPath": "v1/services/{serviceName}:releaseQuota",
+          "httpMethod": "POST",
+          "parameters": {
+            "serviceName": {
+              "description": "Name of the service as specified in the service configuration. For example,\n`\"pubsub.googleapis.com\"`.\n\nSee google.api.Service for the definition of a service name.",
+              "required": true,
+              "location": "path",
+              "type": "string"
+            }
+          },
+          "path": "v1/services/{serviceName}:releaseQuota",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/servicecontrol"
+          ]
+        },
         "check": {
           "id": "servicecontrol.services.check",
           "response": {
@@ -46,6 +102,34 @@
             "https://www.googleapis.com/auth/servicecontrol"
           ]
         },
+        "allocateQuota": {
+          "id": "servicecontrol.services.allocateQuota",
+          "response": {
+            "$ref": "AllocateQuotaResponse"
+          },
+          "parameterOrder": [
+            "serviceName"
+          ],
+          "description": "Attempts to allocate quota for the specified consumer. It should be called\nbefore the operation is executed.\n\nThis method requires the `servicemanagement.services.quota`\npermission on the specified service. For more information, see\n[Google Cloud IAM](https://cloud.google.com/iam).",
+          "request": {
+            "$ref": "AllocateQuotaRequest"
+          },
+          "flatPath": "v1/services/{serviceName}:allocateQuota",
+          "httpMethod": "POST",
+          "parameters": {
+            "serviceName": {
+              "description": "Name of the service as specified in the service configuration. For example,\n`\"pubsub.googleapis.com\"`.\n\nSee google.api.Service for the definition of a service name.",
+              "required": true,
+              "location": "path",
+              "type": "string"
+            }
+          },
+          "path": "v1/services/{serviceName}:allocateQuota",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/servicecontrol"
+          ]
+        },
         "report": {
           "id": "servicecontrol.services.report",
           "response": {
@@ -73,11 +157,89 @@
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/servicecontrol"
           ]
+        },
+        "startReconciliation": {
+          "id": "servicecontrol.services.startReconciliation",
+          "response": {
+            "$ref": "StartReconciliationResponse"
+          },
+          "parameterOrder": [
+            "serviceName"
+          ],
+          "description": "Unlike rate quota, allocation quota does not get refilled periodically.\nSo, it is possible that the quota usage as seen by the service differs from\nwhat the One Platform considers the usage is. This is expected to happen\nonly rarely, but over time this can accumulate. Services can invoke\nStartReconciliation and EndReconciliation to correct this usage drift, as\ndescribed below:\n1. Service sends StartReconciliation with a timestamp in future for each\n   metric that needs to be reconciled. The timestamp being in future allows\n   to account for in-flight AllocateQuota and ReleaseQuota requests for the\n   same metric.\n2. One Platform records this timestamp and starts tracking subsequent\n   AllocateQuota and ReleaseQuota requests until EndReconciliation is\n   called.\n3. At or after the time specified in the StartReconciliation, service\n   sends EndReconciliation with the usage that needs to be reconciled to.\n4. One Platform adjusts its own record of usage for that metric to the\n   value specified in EndReconciliation by taking in to account any\n   allocation or release between StartReconciliation and EndReconciliation.\n\nSignals the quota controller that the service wants to perform a usage\nreconciliation as specified in the request.\n\nThis method requires the `servicemanagement.services.quota`\npermission on the specified service. For more information, see\n[Google Cloud IAM](https://cloud.google.com/iam).",
+          "request": {
+            "$ref": "StartReconciliationRequest"
+          },
+          "flatPath": "v1/services/{serviceName}:startReconciliation",
+          "httpMethod": "POST",
+          "parameters": {
+            "serviceName": {
+              "description": "Name of the service as specified in the service configuration. For example,\n`\"pubsub.googleapis.com\"`.\n\nSee google.api.Service for the definition of a service name.",
+              "required": true,
+              "location": "path",
+              "type": "string"
+            }
+          },
+          "path": "v1/services/{serviceName}:startReconciliation",
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/servicecontrol"
+          ]
         }
       }
     }
   },
   "schemas": {
+    "Money": {
+      "description": "Represents an amount of money with its currency type.",
+      "type": "object",
+      "properties": {
+        "currencyCode": {
+          "description": "The 3-letter currency code defined in ISO 4217.",
+          "type": "string"
+        },
+        "units": {
+          "description": "The whole units of the amount.\nFor example if `currencyCode` is `\"USD\"`, then 1 unit is one US dollar.",
+          "type": "string",
+          "format": "int64"
+        },
+        "nanos": {
+          "description": "Number of nano (10^-9) units of the amount.\nThe value must be between -999,999,999 and +999,999,999 inclusive.\nIf `units` is positive, `nanos` must be positive or zero.\nIf `units` is zero, `nanos` can be positive, zero, or negative.\nIf `units` is negative, `nanos` must be negative or zero.\nFor example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.",
+          "type": "integer",
+          "format": "int32"
+        }
+      },
+      "id": "Money"
+    },
+    "QuotaInfo": {
+      "description": "Contains the quota information for a quota check response.",
+      "type": "object",
+      "properties": {
+        "quotaConsumed": {
+          "description": "Map of quota group name to the actual number of tokens consumed. If the\nquota check was not successful, then this will not be populated due to no\nquota consumption.\nDeprecated: Use quota_metrics to get per quota group usage.",
+          "additionalProperties": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "type": "object"
+        },
+        "limitExceeded": {
+          "description": "Quota Metrics that have exceeded quota limits.\nFor QuotaGroup-based quota, this is QuotaGroup.name\nFor QuotaLimit-based quota, this is QuotaLimit.name\nSee: google.api.Quota\nDeprecated: Use quota_metrics to get per quota group limit exceeded status.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "quotaMetrics": {
+          "description": "Quota metrics to indicate the usage. Depending on the check request, one or\nmore of the following metrics will be included:\n\n1. For rate quota, per quota group or per quota metric incremental usage\nwill be specified using the following delta metric:\n  \"serviceruntime.googleapis.com/api/consumer/quota_used_count\"\n\n2. For allocation quota, per quota metric total usage will be specified\nusing the following gauge metric:\n  \"serviceruntime.googleapis.com/allocation/consumer/quota_used_count\"\n\n3. For both rate quota and allocation quota, the quota limit reached\ncondition will be specified using the following boolean metric:\n  \"serviceruntime.googleapis.com/quota/exceeded\"",
+          "type": "array",
+          "items": {
+            "$ref": "MetricValueSet"
+          }
+        }
+      },
+      "id": "QuotaInfo"
+    },
     "CheckError": {
       "description": "Defines the errors to be returned in\ngoogle.api.servicecontrol.v1.CheckResponse.check_errors.",
       "type": "object",
@@ -89,7 +251,12 @@
             "NOT_FOUND",
             "PERMISSION_DENIED",
             "RESOURCE_EXHAUSTED",
+            "BUDGET_EXCEEDED",
+            "DENIAL_OF_SERVICE_DETECTED",
+            "LOAD_SHEDDING",
+            "ABUSER_DETECTED",
             "SERVICE_NOT_ACTIVATED",
+            "VISIBILITY_DENIED",
             "BILLING_DISABLED",
             "PROJECT_DELETED",
             "PROJECT_INVALID",
@@ -100,16 +267,30 @@
             "API_KEY_INVALID",
             "API_KEY_EXPIRED",
             "API_KEY_NOT_FOUND",
+            "SPATULA_HEADER_INVALID",
+            "LOAS_ROLE_INVALID",
+            "NO_LOAS_PROJECT",
+            "LOAS_PROJECT_DISABLED",
+            "SECURITY_POLICY_VIOLATED",
             "NAMESPACE_LOOKUP_UNAVAILABLE",
             "SERVICE_STATUS_UNAVAILABLE",
-            "BILLING_STATUS_UNAVAILABLE"
+            "BILLING_STATUS_UNAVAILABLE",
+            "QUOTA_CHECK_UNAVAILABLE",
+            "LOAS_PROJECT_LOOKUP_UNAVAILABLE",
+            "CLOUD_RESOURCE_MANAGER_BACKEND_UNAVAILABLE",
+            "SECURITY_POLICY_BACKEND_UNAVAILABLE"
           ],
           "enumDescriptions": [
             "This is never used in `CheckResponse`.",
             "The consumer's project id was not found.\nSame as google.rpc.Code.NOT_FOUND.",
             "The consumer doesn't have access to the specified resource.\nSame as google.rpc.Code.PERMISSION_DENIED.",
             "Quota check failed. Same as google.rpc.Code.RESOURCE_EXHAUSTED.",
+            "Budget check failed.",
+            "The consumer's request has been flagged as a DoS attack.",
+            "The consumer's request should be rejected in order to protect the service\nfrom being overloaded.",
+            "The consumer has been flagged as an abuser.",
             "The consumer hasn't activated the service.",
+            "The consumer cannot access the service due to visibility configuration.",
             "The consumer cannot access the service because billing is disabled.",
             "The consumer's project has been marked as deleted (soft deletion).",
             "The consumer's project number or id does not represent a valid project.",
@@ -120,9 +301,18 @@
             "The consumer's API key is invalid.",
             "The consumer's API Key has expired.",
             "The consumer's API Key was not found in config record.",
+            "The consumer's spatula header is invalid.",
+            "The consumer's LOAS role is invalid.",
+            "The consumer's LOAS role has no associated project.",
+            "The consumer's LOAS project is not `ACTIVE` in LoquatV2.",
+            "Request is not allowed as per security policies defined in Org Policy.",
             "The backend server for looking up project id/number is unavailable.",
             "The backend server for checking service status is unavailable.",
-            "The backend server for checking billing status is unavailable."
+            "The backend server for checking billing status is unavailable.",
+            "The backend server for checking quota limits is unavailable.",
+            "The Spanner for looking up LOAS project is unavailable.",
+            "Cloud Resource Manager backend server is unavailable.",
+            "Backend server for evaluating security policy is unavailable."
           ],
           "type": "string"
         },
@@ -160,6 +350,20 @@
       },
       "id": "Status"
     },
+    "StartReconciliationRequest": {
+      "type": "object",
+      "properties": {
+        "reconciliationOperation": {
+          "description": "Operation that describes the quota reconciliation.",
+          "$ref": "QuotaOperation"
+        },
+        "serviceConfigId": {
+          "description": "Specifies which version of service configuration should be used to process\nthe request. If unspecified or no matching version can be found, the latest\none will be used.",
+          "type": "string"
+        }
+      },
+      "id": "StartReconciliationRequest"
+    },
     "ReportError": {
       "description": "Represents the processing error of one `Operation` in the request.",
       "type": "object",
@@ -205,6 +409,13 @@
           "description": "Fully qualified name of the operation. Reserved for future use.",
           "type": "string"
         },
+        "userLabels": {
+          "description": "User defined labels for the resource that this operation is associated\nwith.",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "type": "object"
+        },
         "operationId": {
           "description": "Identity of the operation. This must be unique within the scope of the\nservice that generated the operation. If the service calls\nCheck() and Report() on the same operation, the two calls should carry\nthe same id.\n\nUUID version 4 is recommended, though not required.\nIn scenarios where an operation is computed from existing information\nand an idempotent id is desirable for deduplication purpose, UUID version 5\nis recommended. See RFC 4122 for details.",
           "type": "string"
@@ -225,11 +436,13 @@
           "description": "DO NOT USE. This is an experimental field.",
           "enum": [
             "LOW",
-            "HIGH"
+            "HIGH",
+            "DEBUG"
           ],
           "enumDescriptions": [
             "The API implementation may cache and aggregate the data.\nThe data may be lost when rare and unexpected system failures occur.",
-            "The API implementation doesn't cache and aggregate the data.\nIf the method returns successfully, it's guaranteed that the data has\nbeen persisted in durable storage."
+            "The API implementation doesn't cache and aggregate the data.\nIf the method returns successfully, it's guaranteed that the data has\nbeen persisted in durable storage.",
+            "In addition to the behavior described in HIGH, DEBUG enables\nadditional validation logic that is only useful during the onboarding\nprocess. This is only available to Google internal services and\nthe service must be whitelisted by chemist-dev@google.com in order\nto use this level."
           ],
           "type": "string"
         },
@@ -237,6 +450,10 @@
           "description": "Identity of the consumer who is using the service.\nThis field should be filled in for the operations initiated by a\nconsumer, but not for service-initiated operations that are\nnot related to a specific consumer.\n\nThis can be in one of the following formats:\n  project:\u003cproject_id\u003e,\n  project_number:\u003cproject_number\u003e,\n  api_key:\u003capi_key\u003e.",
           "type": "string"
         },
+        "quotaProperties": {
+          "description": "Represents the properties needed for quota check. Applicable only if this\noperation is for a quota check request.",
+          "$ref": "QuotaProperties"
+        },
         "startTime": {
           "description": "Required. Start time of the operation.",
           "type": "string",
@@ -255,18 +472,59 @@
           "items": {
             "$ref": "MetricValueSet"
           }
+        },
+        "resourceContainer": {
+          "description": "The resource name of the parent of a resource in the resource hierarchy.\n\nThis can be in one of the following formats:\n    - “projects/\u003cproject-id or project-number\u003e”\n    - “folders/\u003cfolder-id\u003e”\n    - “organizations/\u003corganization-id\u003e”",
+          "type": "string"
         }
       },
       "id": "Operation"
     },
+    "AllocateQuotaResponse": {
+      "description": "Response message for the AllocateQuota method.",
+      "type": "object",
+      "properties": {
+        "allocateErrors": {
+          "description": "Indicates the decision of the allocate.",
+          "type": "array",
+          "items": {
+            "$ref": "QuotaError"
+          }
+        },
+        "operationId": {
+          "description": "The same operation_id value used in the AllocateQuotaRequest. Used for\nlogging and diagnostics purposes.",
+          "type": "string"
+        },
+        "quotaMetrics": {
+          "description": "Quota metrics to indicate the result of allocation. Depending on the\nrequest, one or more of the following metrics will be included:\n\n1. For rate quota, per quota group or per quota metric incremental usage\nwill be specified using the following delta metric:\n  \"serviceruntime.googleapis.com/api/consumer/quota_used_count\"\n\n2. For allocation quota, per quota metric total usage will be specified\nusing the following gauge metric:\n  \"serviceruntime.googleapis.com/allocation/consumer/quota_used_count\"\n\n3. For both rate quota and allocation quota, the quota limit reached\ncondition will be specified using the following boolean metric:\n  \"serviceruntime.googleapis.com/quota/exceeded\"",
+          "type": "array",
+          "items": {
+            "$ref": "MetricValueSet"
+          }
+        },
+        "serviceConfigId": {
+          "description": "ID of the actual config used to process the request.",
+          "type": "string"
+        }
+      },
+      "id": "AllocateQuotaResponse"
+    },
     "CheckRequest": {
       "description": "Request message for the Check method.",
       "type": "object",
       "properties": {
+        "requestProjectSettings": {
+          "description": "Requests the project settings to be returned as part of the check response.",
+          "type": "boolean"
+        },
         "operation": {
           "description": "The operation to be checked.",
           "$ref": "Operation"
         },
+        "skipActivationCheck": {
+          "description": "Indicates if service activation check should be skipped for this request.\nDefault behavior is to perform the check and apply relevant quota.",
+          "type": "boolean"
+        },
         "serviceConfigId": {
           "description": "Specifies which version of service configuration should be used to process\nthe request.\n\nIf unspecified or no matching version can be found, the\nlatest one will be used.",
           "type": "string"
@@ -274,6 +532,79 @@
       },
       "id": "CheckRequest"
     },
+    "QuotaProperties": {
+      "description": "Represents the properties needed for quota operations.\n\nUse the metric_value_sets field in Operation message to provide cost\noverride with metric_name in \u003cservice_name\u003e/quota/\u003cquota_group_name\u003e/cost\nformat. Overrides for unmatched quota groups will be ignored.\nCosts are expected to be \u003e= 0. Cost 0 will cause no quota check,\nbut still traffic restrictions will be enforced.",
+      "type": "object",
+      "properties": {
+        "quotaMode": {
+          "description": "Quota mode for this operation.",
+          "enum": [
+            "ACQUIRE",
+            "ACQUIRE_BEST_EFFORT",
+            "CHECK",
+            "RELEASE"
+          ],
+          "enumDescriptions": [
+            "Decreases available quota by the cost specified for the operation.\nIf cost is higher than available quota, operation fails and returns\nerror.",
+            "Decreases available quota by the cost specified for the operation.\nIf cost is higher than available quota, operation does not fail and\navailable quota goes down to zero but it returns error.",
+            "Does not change any available quota. Only checks if there is enough\nquota.\nNo lock is placed on the checked tokens neither.",
+            "Increases available quota by the operation cost specified for the\noperation."
+          ],
+          "type": "string"
+        },
+        "limitByIds": {
+          "description": "LimitType IDs that should be used for checking quota. Key in this map\nshould be a valid LimitType string, and the value is the ID to be used. For\nexample, an entry \u003cUSER, 123\u003e will cause all user quota limits to use 123\nas the user ID. See google/api/quota.proto for the definition of LimitType.\nCLIENT_PROJECT: Not supported.\nUSER: Value of this entry will be used for enforcing user-level quota\n      limits. If none specified, caller IP passed in the\n      servicecontrol.googleapis.com/caller_ip label will be used instead.\n      If the server cannot resolve a value for this LimitType, an error\n      will be thrown. No validation will be performed on this ID.\nDeprecated: use servicecontrol.googleapis.com/user label to send user ID.",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "type": "object"
+        }
+      },
+      "id": "QuotaProperties"
+    },
+    "ReportInfo": {
+      "type": "object",
+      "properties": {
+        "operationId": {
+          "description": "The Operation.operation_id value from the request.",
+          "type": "string"
+        },
+        "quotaInfo": {
+          "description": "Quota usage info when processing the `Operation`.",
+          "$ref": "QuotaInfo"
+        }
+      },
+      "id": "ReportInfo"
+    },
+    "ReleaseQuotaResponse": {
+      "description": "Response message for the ReleaseQuota method.",
+      "type": "object",
+      "properties": {
+        "releaseErrors": {
+          "description": "Indicates the decision of the release.",
+          "type": "array",
+          "items": {
+            "$ref": "QuotaError"
+          }
+        },
+        "operationId": {
+          "description": "The same operation_id value used in the ReleaseQuotaRequest. Used for\nlogging and diagnostics purposes.",
+          "type": "string"
+        },
+        "quotaMetrics": {
+          "description": "Quota metrics to indicate the result of release. Depending on the\nrequest, one or more of the following metrics will be included:\n\n1. For rate quota, per quota group or per quota metric released amount\nwill be specified using the following delta metric:\n  \"serviceruntime.googleapis.com/api/consumer/quota_refund_count\"\n\n2. For allocation quota, per quota metric total usage will be specified\nusing the following gauge metric:\n  \"serviceruntime.googleapis.com/allocation/consumer/quota_used_count\"",
+          "type": "array",
+          "items": {
+            "$ref": "MetricValueSet"
+          }
+        },
+        "serviceConfigId": {
+          "description": "ID of the actual config used to process the request.",
+          "type": "string"
+        }
+      },
+      "id": "ReleaseQuotaResponse"
+    },
     "LogEntry": {
       "description": "An individual log entry.",
       "type": "object",
@@ -409,6 +740,10 @@
       "description": "Response message for the Check method.",
       "type": "object",
       "properties": {
+        "checkInfo": {
+          "description": "Feedback data returned from the server during processing a Check request.",
+          "$ref": "CheckInfo"
+        },
         "checkErrors": {
           "description": "Indicate the decision of the check.\n\nIf no check errors are present, the service should process the operation.\nOtherwise the service should use the list of errors to determine the\nappropriate action.",
           "type": "array",
@@ -420,6 +755,10 @@
           "description": "The same operation_id value used in the CheckRequest.\nUsed for logging and diagnostics purposes.",
           "type": "string"
         },
+        "quotaInfo": {
+          "description": "Quota information for the check request associated with this response.\n",
+          "$ref": "QuotaInfo"
+        },
         "serviceConfigId": {
           "description": "The actual config id used to process the request.",
           "type": "string"
@@ -427,6 +766,33 @@
       },
       "id": "CheckResponse"
     },
+    "CheckInfo": {
+      "type": "object",
+      "properties": {
+        "unusedArguments": {
+          "description": "A list of fields and label keys that are ignored by the server.\nThe client doesn't need to send them for following requests to improve\nperformance and allow better aggregation.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "CheckInfo"
+    },
+    "EndReconciliationRequest": {
+      "type": "object",
+      "properties": {
+        "reconciliationOperation": {
+          "description": "Operation that describes the quota reconciliation.",
+          "$ref": "QuotaOperation"
+        },
+        "serviceConfigId": {
+          "description": "Specifies which version of service configuration should be used to process\nthe request. If unspecified or no matching version can be found, the latest\none will be used.",
+          "type": "string"
+        }
+      },
+      "id": "EndReconciliationRequest"
+    },
     "RequestMetadata": {
       "description": "Metadata about the request.",
       "type": "object",
@@ -442,6 +808,55 @@
       },
       "id": "RequestMetadata"
     },
+    "QuotaOperation": {
+      "description": "Represents information regarding a quota operation.",
+      "type": "object",
+      "properties": {
+        "methodName": {
+          "description": "Fully qualified name of the API method for which this quota operation is\nrequested. This name is used for matching quota rules or metric rules and\nbilling status rules defined in service configuration. This field is not\nrequired if the quota operation is performed on non-API resources.\n\nExample of an RPC method name:\n    google.example.library.v1.LibraryService.CreateShelf",
+          "type": "string"
+        },
+        "operationId": {
+          "description": "Identity of the operation. This must be unique within the scope of the\nservice that generated the operation. If the service calls AllocateQuota\nand ReleaseQuota on the same operation, the two calls should carry the\nsame ID.\n\nUUID version 4 is recommended, though not required. In scenarios where an\noperation is computed from existing information and an idempotent id is\ndesirable for deduplication purpose, UUID version 5 is recommended. See\nRFC 4122 for details.",
+          "type": "string"
+        },
+        "labels": {
+          "description": "Labels describing the operation.",
+          "additionalProperties": {
+            "type": "string"
+          },
+          "type": "object"
+        },
+        "consumerId": {
+          "description": "Identity of the consumer for whom this quota operation is being performed.\n\nThis can be in one of the following formats:\n  project:\u003cproject_id\u003e,\n  project_number:\u003cproject_number\u003e,\n  api_key:\u003capi_key\u003e.",
+          "type": "string"
+        },
+        "quotaMetrics": {
+          "description": "Represents information about this operation. Each MetricValueSet\ncorresponds to a metric defined in the service configuration.\nThe data type used in the MetricValueSet must agree with\nthe data type specified in the metric definition.\n\nWithin a single operation, it is not allowed to have more than one\nMetricValue instances that have the same metric names and identical\nlabel value combinations. If a request has such duplicated MetricValue\ninstances, the entire request is rejected with\nan invalid argument error.",
+          "type": "array",
+          "items": {
+            "$ref": "MetricValueSet"
+          }
+        },
+        "quotaMode": {
+          "description": "Quota mode for this operation.",
+          "enum": [
+            "UNSPECIFIED",
+            "NORMAL",
+            "BEST_EFFORT",
+            "CHECK_ONLY"
+          ],
+          "enumDescriptions": [
+            "",
+            "For AllocateQuota request, allocates quota for the amount specified in\nthe service configuration or specified using the quota metrics. If the\namount is higher than the available quota, allocation error will be\nreturned and no quota will be allocated.\nFor ReleaseQuota request, this mode is supported only for precise quota\nlimits. In this case, this operation releases quota for the amount\nspecified in the service configuration or specified using the quota\nmetrics. If the release can make available quota negative, release error\nwill be returned and no quota will be released.",
+            "For AllocateQuota request, this mode is supported only for imprecise\nquota limits. In this case, the operation allocates quota for the amount\nspecified in the service configuration or specified using the quota\nmetrics. If the amount is higher than the available quota, request does\nnot fail but all available quota will be allocated.\nFor ReleaseQuota request, this mode is supported for both precise quota\nlimits and imprecise quota limits. In this case, this operation releases\nquota for the amount specified in the service configuration or specified\nusing the quota metrics. If the release can make available quota\nnegative, request does not fail but only the available quota will be\nreleased. After the ReleaseQuota request completes, the available quota\nwill be 0, and never goes to negative.",
+            "For AllocateQuota request, only checks if there is enough quota\navailable and does not change the available quota. No lock is placed on\nthe available quota either. Not supported for ReleaseQuota request."
+          ],
+          "type": "string"
+        }
+      },
+      "id": "QuotaOperation"
+    },
     "ReportResponse": {
       "description": "Response message for the Report method.",
       "type": "object",
@@ -453,6 +868,13 @@
             "$ref": "ReportError"
           }
         },
+        "reportInfos": {
+          "description": "Quota usage for each quota release `Operation` request.\n\nFully or partially failed quota release request may or may not be present\nin `report_quota_info`. For example, a failed quota release request will\nhave the current quota usage info when precise quota library returns the\ninfo. A deadline exceeded quota request will not have quota usage info.\n\nIf there is no quota release request, report_quota_info will be empty.\n",
+          "type": "array",
+          "items": {
+            "$ref": "ReportInfo"
+          }
+        },
         "serviceConfigId": {
           "description": "The actual config id used to process the request.",
           "type": "string"
@@ -512,6 +934,94 @@
       },
       "id": "Distribution"
     },
+    "StartReconciliationResponse": {
+      "type": "object",
+      "properties": {
+        "operationId": {
+          "description": "The same operation_id value used in the StartReconciliationRequest. Used\nfor logging and diagnostics purposes.",
+          "type": "string"
+        },
+        "reconciliationErrors": {
+          "description": "Indicates the decision of the reconciliation start.",
+          "type": "array",
+          "items": {
+            "$ref": "QuotaError"
+          }
+        },
+        "quotaMetrics": {
+          "description": "Metric values as tracked by One Platform before the start of\nreconciliation.",
+          "type": "array",
+          "items": {
+            "$ref": "MetricValueSet"
+          }
+        },
+        "serviceConfigId": {
+          "description": "ID of the actual config used to process the request.",
+          "type": "string"
+        }
+      },
+      "id": "StartReconciliationResponse"
+    },
+    "QuotaError": {
+      "type": "object",
+      "properties": {
+        "description": {
+          "description": "Free-form text that provides details on the cause of the error.",
+          "type": "string"
+        },
+        "code": {
+          "description": "Error code.",
+          "enum": [
+            "UNSPECIFIED",
+            "RESOURCE_EXHAUSTED",
+            "PROJECT_SUSPENDED",
+            "SERVICE_NOT_ENABLED",
+            "BILLING_NOT_ACTIVE",
+            "PROJECT_DELETED",
+            "PROJECT_INVALID",
+            "IP_ADDRESS_BLOCKED",
+            "REFERER_BLOCKED",
+            "CLIENT_APP_BLOCKED",
+            "API_KEY_INVALID",
+            "API_KEY_EXPIRED",
+            "SPATULA_HEADER_INVALID",
+            "LOAS_ROLE_INVALID",
+            "NO_LOAS_PROJECT",
+            "PROJECT_STATUS_UNVAILABLE",
+            "SERVICE_STATUS_UNAVAILABLE",
+            "BILLING_STATUS_UNAVAILABLE",
+            "QUOTA_SYSTEM_UNAVAILABLE"
+          ],
+          "enumDescriptions": [
+            "This is never used.",
+            "Quota allocation failed.\nSame as google.rpc.Code.RESOURCE_EXHAUSTED.",
+            "Consumer project has been suspended.",
+            "Consumer has not enabled the service.",
+            "Consumer cannot access the service because billing is disabled.",
+            "Consumer's project has been marked as deleted (soft deletion).",
+            "Consumer's project number or ID does not represent a valid project.",
+            "IP address of the consumer is invalid for the specific consumer\nproject.",
+            "Referer address of the consumer request is invalid for the specific\nconsumer project.",
+            "Client application of the consumer request is invalid for the\nspecific consumer project.",
+            "Specified API key is invalid.",
+            "Specified API Key has expired.",
+            "Consumer's spatula header is invalid.",
+            "The consumer's LOAS role is invalid.",
+            "The consumer's LOAS role has no associated project.",
+            "The backend server for looking up project id/number is unavailable.",
+            "The backend server for checking service status is unavailable.",
+            "The backend server for checking billing status is unavailable.",
+            "The backend server for checking quota limits is unavailable."
+          ],
+          "type": "string"
+        },
+        "subject": {
+          "description": "Subject to whom this error applies. See the specific enum for more details\non this field. For example, \"clientip:\u003cip address of client\u003e\" or\n\"project:\u003cGoogle developer project id\u003e\".",
+          "type": "string"
+        }
+      },
+      "id": "QuotaError"
+    },
     "AuditLog": {
       "description": "Common audit log format for Google Cloud Platform API operations.\n\n",
       "type": "object",
@@ -628,6 +1138,65 @@
       },
       "id": "AuthorizationInfo"
     },
+    "EndReconciliationResponse": {
+      "type": "object",
+      "properties": {
+        "operationId": {
+          "description": "The same operation_id value used in the EndReconciliationRequest. Used for\nlogging and diagnostics purposes.",
+          "type": "string"
+        },
+        "reconciliationErrors": {
+          "description": "Indicates the decision of the reconciliation end.",
+          "type": "array",
+          "items": {
+            "$ref": "QuotaError"
+          }
+        },
+        "quotaMetrics": {
+          "description": "Metric values as tracked by One Platform before the adjustment was made.",
+          "type": "array",
+          "items": {
+            "$ref": "MetricValueSet"
+          }
+        },
+        "serviceConfigId": {
+          "description": "ID of the actual config used to process the request.",
+          "type": "string"
+        }
+      },
+      "id": "EndReconciliationResponse"
+    },
+    "AllocateQuotaRequest": {
+      "description": "Request message for the AllocateQuota method.",
+      "type": "object",
+      "properties": {
+        "allocationMode": {
+          "description": "Allocation mode for this operation.\nDeprecated: use QuotaMode inside the QuotaOperation.",
+          "enum": [
+            "UNSPECIFIED",
+            "NORMAL",
+            "BEST_EFFORT",
+            "CHECK_ONLY"
+          ],
+          "enumDescriptions": [
+            "",
+            "Allocates quota for the amount specified in the service configuration or\nspecified using the quota_metrics. If the amount is higher than the\navailable quota, allocation error will be returned and no quota will be\nallocated.",
+            "Allocates quota for the amount specified in the service configuration or\nspecified using the quota_metrics. If the amount is higher than the\navailable quota, request does not fail but all available quota will be\nallocated.",
+            "Only checks if there is enough quota available and does not change the\navailable quota. No lock is placed on the available quota either."
+          ],
+          "type": "string"
+        },
+        "allocateOperation": {
+          "description": "Operation that describes the quota allocation.",
+          "$ref": "QuotaOperation"
+        },
+        "serviceConfigId": {
+          "description": "Specifies which version of service configuration should be used to process\nthe request. If unspecified or no matching version can be found, the latest\none will be used.",
+          "type": "string"
+        }
+      },
+      "id": "AllocateQuotaRequest"
+    },
     "MetricValue": {
       "description": "Represents a single metric value.",
       "type": "object",
@@ -670,12 +1239,31 @@
           "description": "A signed 64-bit integer value.",
           "type": "string",
           "format": "int64"
+        },
+        "moneyValue": {
+          "description": "A money value.",
+          "$ref": "Money"
         }
       },
       "id": "MetricValue"
+    },
+    "ReleaseQuotaRequest": {
+      "description": "Request message for the ReleaseQuota method.",
+      "type": "object",
+      "properties": {
+        "releaseOperation": {
+          "description": "Operation that describes the quota release.",
+          "$ref": "QuotaOperation"
+        },
+        "serviceConfigId": {
+          "description": "Specifies which version of service configuration should be used to process\nthe request. If unspecified or no matching version can be found, the latest\none will be used.",
+          "type": "string"
+        }
+      },
+      "id": "ReleaseQuotaRequest"
     }
   },
-  "revision": "20170123",
+  "revision": "20170130",
   "basePath": "",
   "icons": {
     "x32": "http://www.google.com/images/icons/product/search-32.gif",
diff --git a/servicecontrol/v1/servicecontrol-gen.go b/servicecontrol/v1/servicecontrol-gen.go
index 12eac55..06c16aa 100644
--- a/servicecontrol/v1/servicecontrol-gen.go
+++ b/servicecontrol/v1/servicecontrol-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Services *ServicesService
 }
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewServicesService(s *Service) *ServicesService {
 	rs := &ServicesService{s: s}
 	return rs
@@ -87,6 +92,129 @@
 	s *Service
 }
 
+// AllocateQuotaRequest: Request message for the AllocateQuota method.
+type AllocateQuotaRequest struct {
+	// AllocateOperation: Operation that describes the quota allocation.
+	AllocateOperation *QuotaOperation `json:"allocateOperation,omitempty"`
+
+	// AllocationMode: Allocation mode for this operation.
+	// Deprecated: use QuotaMode inside the QuotaOperation.
+	//
+	// Possible values:
+	//   "UNSPECIFIED"
+	//   "NORMAL" - Allocates quota for the amount specified in the service
+	// configuration or
+	// specified using the quota_metrics. If the amount is higher than
+	// the
+	// available quota, allocation error will be returned and no quota will
+	// be
+	// allocated.
+	//   "BEST_EFFORT" - Allocates quota for the amount specified in the
+	// service configuration or
+	// specified using the quota_metrics. If the amount is higher than
+	// the
+	// available quota, request does not fail but all available quota will
+	// be
+	// allocated.
+	//   "CHECK_ONLY" - Only checks if there is enough quota available and
+	// does not change the
+	// available quota. No lock is placed on the available quota either.
+	AllocationMode string `json:"allocationMode,omitempty"`
+
+	// ServiceConfigId: Specifies which version of service configuration
+	// should be used to process
+	// the request. If unspecified or no matching version can be found, the
+	// latest
+	// one will be used.
+	ServiceConfigId string `json:"serviceConfigId,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "AllocateOperation")
+	// to unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "AllocateOperation") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AllocateQuotaRequest) MarshalJSON() ([]byte, error) {
+	type noMethod AllocateQuotaRequest
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// AllocateQuotaResponse: Response message for the AllocateQuota method.
+type AllocateQuotaResponse struct {
+	// AllocateErrors: Indicates the decision of the allocate.
+	AllocateErrors []*QuotaError `json:"allocateErrors,omitempty"`
+
+	// OperationId: The same operation_id value used in the
+	// AllocateQuotaRequest. Used for
+	// logging and diagnostics purposes.
+	OperationId string `json:"operationId,omitempty"`
+
+	// QuotaMetrics: Quota metrics to indicate the result of allocation.
+	// Depending on the
+	// request, one or more of the following metrics will be included:
+	//
+	// 1. For rate quota, per quota group or per quota metric incremental
+	// usage
+	// will be specified using the following delta metric:
+	//   "serviceruntime.googleapis.com/api/consumer/quota_used_count"
+	//
+	// 2. For allocation quota, per quota metric total usage will be
+	// specified
+	// using the following gauge metric:
+	//
+	// "serviceruntime.googleapis.com/allocation/consumer/quota_used_count"
+	//
+	//
+	// 3. For both rate quota and allocation quota, the quota limit
+	// reached
+	// condition will be specified using the following boolean metric:
+	//   "serviceruntime.googleapis.com/quota/exceeded"
+	QuotaMetrics []*MetricValueSet `json:"quotaMetrics,omitempty"`
+
+	// ServiceConfigId: ID of the actual config used to process the request.
+	ServiceConfigId string `json:"serviceConfigId,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "AllocateErrors") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "AllocateErrors") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *AllocateQuotaResponse) MarshalJSON() ([]byte, error) {
+	type noMethod AllocateQuotaResponse
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // AuditLog: Common audit log format for Google Cloud Platform API
 // operations.
 //
@@ -278,8 +406,17 @@
 	// Same as google.rpc.Code.PERMISSION_DENIED.
 	//   "RESOURCE_EXHAUSTED" - Quota check failed. Same as
 	// google.rpc.Code.RESOURCE_EXHAUSTED.
+	//   "BUDGET_EXCEEDED" - Budget check failed.
+	//   "DENIAL_OF_SERVICE_DETECTED" - The consumer's request has been
+	// flagged as a DoS attack.
+	//   "LOAD_SHEDDING" - The consumer's request should be rejected in
+	// order to protect the service
+	// from being overloaded.
+	//   "ABUSER_DETECTED" - The consumer has been flagged as an abuser.
 	//   "SERVICE_NOT_ACTIVATED" - The consumer hasn't activated the
 	// service.
+	//   "VISIBILITY_DENIED" - The consumer cannot access the service due to
+	// visibility configuration.
 	//   "BILLING_DISABLED" - The consumer cannot access the service because
 	// billing is disabled.
 	//   "PROJECT_DELETED" - The consumer's project has been marked as
@@ -302,12 +439,29 @@
 	//   "API_KEY_EXPIRED" - The consumer's API Key has expired.
 	//   "API_KEY_NOT_FOUND" - The consumer's API Key was not found in
 	// config record.
+	//   "SPATULA_HEADER_INVALID" - The consumer's spatula header is
+	// invalid.
+	//   "LOAS_ROLE_INVALID" - The consumer's LOAS role is invalid.
+	//   "NO_LOAS_PROJECT" - The consumer's LOAS role has no associated
+	// project.
+	//   "LOAS_PROJECT_DISABLED" - The consumer's LOAS project is not
+	// `ACTIVE` in LoquatV2.
+	//   "SECURITY_POLICY_VIOLATED" - Request is not allowed as per security
+	// policies defined in Org Policy.
 	//   "NAMESPACE_LOOKUP_UNAVAILABLE" - The backend server for looking up
 	// project id/number is unavailable.
 	//   "SERVICE_STATUS_UNAVAILABLE" - The backend server for checking
 	// service status is unavailable.
 	//   "BILLING_STATUS_UNAVAILABLE" - The backend server for checking
 	// billing status is unavailable.
+	//   "QUOTA_CHECK_UNAVAILABLE" - The backend server for checking quota
+	// limits is unavailable.
+	//   "LOAS_PROJECT_LOOKUP_UNAVAILABLE" - The Spanner for looking up LOAS
+	// project is unavailable.
+	//   "CLOUD_RESOURCE_MANAGER_BACKEND_UNAVAILABLE" - Cloud Resource
+	// Manager backend server is unavailable.
+	//   "SECURITY_POLICY_BACKEND_UNAVAILABLE" - Backend server for
+	// evaluating security policy is unavailable.
 	Code string `json:"code,omitempty"`
 
 	// Detail: Free-form text providing details on the error cause of the
@@ -337,11 +491,47 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type CheckInfo struct {
+	// UnusedArguments: A list of fields and label keys that are ignored by
+	// the server.
+	// The client doesn't need to send them for following requests to
+	// improve
+	// performance and allow better aggregation.
+	UnusedArguments []string `json:"unusedArguments,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "UnusedArguments") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "UnusedArguments") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *CheckInfo) MarshalJSON() ([]byte, error) {
+	type noMethod CheckInfo
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // CheckRequest: Request message for the Check method.
 type CheckRequest struct {
 	// Operation: The operation to be checked.
 	Operation *Operation `json:"operation,omitempty"`
 
+	// RequestProjectSettings: Requests the project settings to be returned
+	// as part of the check response.
+	RequestProjectSettings bool `json:"requestProjectSettings,omitempty"`
+
 	// ServiceConfigId: Specifies which version of service configuration
 	// should be used to process
 	// the request.
@@ -350,6 +540,11 @@
 	// latest one will be used.
 	ServiceConfigId string `json:"serviceConfigId,omitempty"`
 
+	// SkipActivationCheck: Indicates if service activation check should be
+	// skipped for this request.
+	// Default behavior is to perform the check and apply relevant quota.
+	SkipActivationCheck bool `json:"skipActivationCheck,omitempty"`
+
 	// ForceSendFields is a list of field names (e.g. "Operation") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -384,11 +579,20 @@
 	// appropriate action.
 	CheckErrors []*CheckError `json:"checkErrors,omitempty"`
 
+	// CheckInfo: Feedback data returned from the server during processing a
+	// Check request.
+	CheckInfo *CheckInfo `json:"checkInfo,omitempty"`
+
 	// OperationId: The same operation_id value used in the
 	// CheckRequest.
 	// Used for logging and diagnostics purposes.
 	OperationId string `json:"operationId,omitempty"`
 
+	// QuotaInfo: Quota information for the check request associated with
+	// this response.
+	//
+	QuotaInfo *QuotaInfo `json:"quotaInfo,omitempty"`
+
 	// ServiceConfigId: The actual config id used to process the request.
 	ServiceConfigId string `json:"serviceConfigId,omitempty"`
 
@@ -524,6 +728,87 @@
 	return nil
 }
 
+type EndReconciliationRequest struct {
+	// ReconciliationOperation: Operation that describes the quota
+	// reconciliation.
+	ReconciliationOperation *QuotaOperation `json:"reconciliationOperation,omitempty"`
+
+	// ServiceConfigId: Specifies which version of service configuration
+	// should be used to process
+	// the request. If unspecified or no matching version can be found, the
+	// latest
+	// one will be used.
+	ServiceConfigId string `json:"serviceConfigId,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g.
+	// "ReconciliationOperation") to unconditionally include in API
+	// requests. By default, fields with empty values are omitted from API
+	// requests. However, any non-pointer, non-interface field appearing in
+	// ForceSendFields will be sent to the server regardless of whether the
+	// field is empty or not. This may be used to include empty fields in
+	// Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ReconciliationOperation")
+	// to include in API requests with the JSON null value. By default,
+	// fields with empty values are omitted from API requests. However, any
+	// field with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *EndReconciliationRequest) MarshalJSON() ([]byte, error) {
+	type noMethod EndReconciliationRequest
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type EndReconciliationResponse struct {
+	// OperationId: The same operation_id value used in the
+	// EndReconciliationRequest. Used for
+	// logging and diagnostics purposes.
+	OperationId string `json:"operationId,omitempty"`
+
+	// QuotaMetrics: Metric values as tracked by One Platform before the
+	// adjustment was made.
+	QuotaMetrics []*MetricValueSet `json:"quotaMetrics,omitempty"`
+
+	// ReconciliationErrors: Indicates the decision of the reconciliation
+	// end.
+	ReconciliationErrors []*QuotaError `json:"reconciliationErrors,omitempty"`
+
+	// ServiceConfigId: ID of the actual config used to process the request.
+	ServiceConfigId string `json:"serviceConfigId,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "OperationId") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "OperationId") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *EndReconciliationResponse) MarshalJSON() ([]byte, error) {
+	type noMethod EndReconciliationResponse
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // ExplicitBuckets: Describing buckets with arbitrary user-provided
 // width.
 type ExplicitBuckets struct {
@@ -794,6 +1079,9 @@
 	// the overriding relationship.
 	Labels map[string]string `json:"labels,omitempty"`
 
+	// MoneyValue: A money value.
+	MoneyValue *Money `json:"moneyValue,omitempty"`
+
 	// StartTime: The start of the time period over which this metric
 	// value's measurement
 	// applies. The time period has different semantics for different
@@ -880,6 +1168,48 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// Money: Represents an amount of money with its currency type.
+type Money struct {
+	// CurrencyCode: The 3-letter currency code defined in ISO 4217.
+	CurrencyCode string `json:"currencyCode,omitempty"`
+
+	// Nanos: Number of nano (10^-9) units of the amount.
+	// The value must be between -999,999,999 and +999,999,999 inclusive.
+	// If `units` is positive, `nanos` must be positive or zero.
+	// If `units` is zero, `nanos` can be positive, zero, or negative.
+	// If `units` is negative, `nanos` must be negative or zero.
+	// For example $-1.75 is represented as `units`=-1 and
+	// `nanos`=-750,000,000.
+	Nanos int64 `json:"nanos,omitempty"`
+
+	// Units: The whole units of the amount.
+	// For example if `currencyCode` is "USD", then 1 unit is one US
+	// dollar.
+	Units int64 `json:"units,omitempty,string"`
+
+	// ForceSendFields is a list of field names (e.g. "CurrencyCode") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "CurrencyCode") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *Money) MarshalJSON() ([]byte, error) {
+	type noMethod Money
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // Operation: Represents information regarding an operation.
 type Operation struct {
 	// ConsumerId: Identity of the consumer who is using the service.
@@ -910,6 +1240,13 @@
 	// If the method returns successfully, it's guaranteed that the data
 	// has
 	// been persisted in durable storage.
+	//   "DEBUG" - In addition to the behavior described in HIGH, DEBUG
+	// enables
+	// additional validation logic that is only useful during the
+	// onboarding
+	// process. This is only available to Google internal services and
+	// the service must be whitelisted by chemist-dev@google.com in order
+	// to use this level.
 	Importance string `json:"importance,omitempty"`
 
 	// Labels: Labels describing the operation. Only the following labels
@@ -973,9 +1310,28 @@
 	// future use.
 	OperationName string `json:"operationName,omitempty"`
 
+	// QuotaProperties: Represents the properties needed for quota check.
+	// Applicable only if this
+	// operation is for a quota check request.
+	QuotaProperties *QuotaProperties `json:"quotaProperties,omitempty"`
+
+	// ResourceContainer: The resource name of the parent of a resource in
+	// the resource hierarchy.
+	//
+	// This can be in one of the following formats:
+	//     - “projects/<project-id or project-number>”
+	//     - “folders/<folder-id>”
+	//     - “organizations/<organization-id>”
+	ResourceContainer string `json:"resourceContainer,omitempty"`
+
 	// StartTime: Required. Start time of the operation.
 	StartTime string `json:"startTime,omitempty"`
 
+	// UserLabels: User defined labels for the resource that this operation
+	// is associated
+	// with.
+	UserLabels map[string]string `json:"userLabels,omitempty"`
+
 	// ForceSendFields is a list of field names (e.g. "ConsumerId") to
 	// unconditionally include in API requests. By default, fields with
 	// empty values are omitted from API requests. However, any non-pointer,
@@ -999,6 +1355,445 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type QuotaError struct {
+	// Code: Error code.
+	//
+	// Possible values:
+	//   "UNSPECIFIED" - This is never used.
+	//   "RESOURCE_EXHAUSTED" - Quota allocation failed.
+	// Same as google.rpc.Code.RESOURCE_EXHAUSTED.
+	//   "PROJECT_SUSPENDED" - Consumer project has been suspended.
+	//   "SERVICE_NOT_ENABLED" - Consumer has not enabled the service.
+	//   "BILLING_NOT_ACTIVE" - Consumer cannot access the service because
+	// billing is disabled.
+	//   "PROJECT_DELETED" - Consumer's project has been marked as deleted
+	// (soft deletion).
+	//   "PROJECT_INVALID" - Consumer's project number or ID does not
+	// represent a valid project.
+	//   "IP_ADDRESS_BLOCKED" - IP address of the consumer is invalid for
+	// the specific consumer
+	// project.
+	//   "REFERER_BLOCKED" - Referer address of the consumer request is
+	// invalid for the specific
+	// consumer project.
+	//   "CLIENT_APP_BLOCKED" - Client application of the consumer request
+	// is invalid for the
+	// specific consumer project.
+	//   "API_KEY_INVALID" - Specified API key is invalid.
+	//   "API_KEY_EXPIRED" - Specified API Key has expired.
+	//   "SPATULA_HEADER_INVALID" - Consumer's spatula header is invalid.
+	//   "LOAS_ROLE_INVALID" - The consumer's LOAS role is invalid.
+	//   "NO_LOAS_PROJECT" - The consumer's LOAS role has no associated
+	// project.
+	//   "PROJECT_STATUS_UNVAILABLE" - The backend server for looking up
+	// project id/number is unavailable.
+	//   "SERVICE_STATUS_UNAVAILABLE" - The backend server for checking
+	// service status is unavailable.
+	//   "BILLING_STATUS_UNAVAILABLE" - The backend server for checking
+	// billing status is unavailable.
+	//   "QUOTA_SYSTEM_UNAVAILABLE" - The backend server for checking quota
+	// limits is unavailable.
+	Code string `json:"code,omitempty"`
+
+	// Description: Free-form text that provides details on the cause of the
+	// error.
+	Description string `json:"description,omitempty"`
+
+	// Subject: Subject to whom this error applies. See the specific enum
+	// for more details
+	// on this field. For example, "clientip:<ip address of client>"
+	// or
+	// "project:<Google developer project id>".
+	Subject string `json:"subject,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "Code") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "Code") to include in API
+	// requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *QuotaError) MarshalJSON() ([]byte, error) {
+	type noMethod QuotaError
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// QuotaInfo: Contains the quota information for a quota check response.
+type QuotaInfo struct {
+	// LimitExceeded: Quota Metrics that have exceeded quota limits.
+	// For QuotaGroup-based quota, this is QuotaGroup.name
+	// For QuotaLimit-based quota, this is QuotaLimit.name
+	// See: google.api.Quota
+	// Deprecated: Use quota_metrics to get per quota group limit exceeded
+	// status.
+	LimitExceeded []string `json:"limitExceeded,omitempty"`
+
+	// QuotaConsumed: Map of quota group name to the actual number of tokens
+	// consumed. If the
+	// quota check was not successful, then this will not be populated due
+	// to no
+	// quota consumption.
+	// Deprecated: Use quota_metrics to get per quota group usage.
+	QuotaConsumed map[string]int64 `json:"quotaConsumed,omitempty"`
+
+	// QuotaMetrics: Quota metrics to indicate the usage. Depending on the
+	// check request, one or
+	// more of the following metrics will be included:
+	//
+	// 1. For rate quota, per quota group or per quota metric incremental
+	// usage
+	// will be specified using the following delta metric:
+	//   "serviceruntime.googleapis.com/api/consumer/quota_used_count"
+	//
+	// 2. For allocation quota, per quota metric total usage will be
+	// specified
+	// using the following gauge metric:
+	//
+	// "serviceruntime.googleapis.com/allocation/consumer/quota_used_count"
+	//
+	//
+	// 3. For both rate quota and allocation quota, the quota limit
+	// reached
+	// condition will be specified using the following boolean metric:
+	//   "serviceruntime.googleapis.com/quota/exceeded"
+	QuotaMetrics []*MetricValueSet `json:"quotaMetrics,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "LimitExceeded") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "LimitExceeded") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *QuotaInfo) MarshalJSON() ([]byte, error) {
+	type noMethod QuotaInfo
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// QuotaOperation: Represents information regarding a quota operation.
+type QuotaOperation struct {
+	// ConsumerId: Identity of the consumer for whom this quota operation is
+	// being performed.
+	//
+	// This can be in one of the following formats:
+	//   project:<project_id>,
+	//   project_number:<project_number>,
+	//   api_key:<api_key>.
+	ConsumerId string `json:"consumerId,omitempty"`
+
+	// Labels: Labels describing the operation.
+	Labels map[string]string `json:"labels,omitempty"`
+
+	// MethodName: Fully qualified name of the API method for which this
+	// quota operation is
+	// requested. This name is used for matching quota rules or metric rules
+	// and
+	// billing status rules defined in service configuration. This field is
+	// not
+	// required if the quota operation is performed on non-API
+	// resources.
+	//
+	// Example of an RPC method name:
+	//     google.example.library.v1.LibraryService.CreateShelf
+	MethodName string `json:"methodName,omitempty"`
+
+	// OperationId: Identity of the operation. This must be unique within
+	// the scope of the
+	// service that generated the operation. If the service calls
+	// AllocateQuota
+	// and ReleaseQuota on the same operation, the two calls should carry
+	// the
+	// same ID.
+	//
+	// UUID version 4 is recommended, though not required. In scenarios
+	// where an
+	// operation is computed from existing information and an idempotent id
+	// is
+	// desirable for deduplication purpose, UUID version 5 is recommended.
+	// See
+	// RFC 4122 for details.
+	OperationId string `json:"operationId,omitempty"`
+
+	// QuotaMetrics: Represents information about this operation. Each
+	// MetricValueSet
+	// corresponds to a metric defined in the service configuration.
+	// The data type used in the MetricValueSet must agree with
+	// the data type specified in the metric definition.
+	//
+	// Within a single operation, it is not allowed to have more than
+	// one
+	// MetricValue instances that have the same metric names and
+	// identical
+	// label value combinations. If a request has such duplicated
+	// MetricValue
+	// instances, the entire request is rejected with
+	// an invalid argument error.
+	QuotaMetrics []*MetricValueSet `json:"quotaMetrics,omitempty"`
+
+	// QuotaMode: Quota mode for this operation.
+	//
+	// Possible values:
+	//   "UNSPECIFIED"
+	//   "NORMAL" - For AllocateQuota request, allocates quota for the
+	// amount specified in
+	// the service configuration or specified using the quota metrics. If
+	// the
+	// amount is higher than the available quota, allocation error will
+	// be
+	// returned and no quota will be allocated.
+	// For ReleaseQuota request, this mode is supported only for precise
+	// quota
+	// limits. In this case, this operation releases quota for the
+	// amount
+	// specified in the service configuration or specified using the
+	// quota
+	// metrics. If the release can make available quota negative, release
+	// error
+	// will be returned and no quota will be released.
+	//   "BEST_EFFORT" - For AllocateQuota request, this mode is supported
+	// only for imprecise
+	// quota limits. In this case, the operation allocates quota for the
+	// amount
+	// specified in the service configuration or specified using the
+	// quota
+	// metrics. If the amount is higher than the available quota, request
+	// does
+	// not fail but all available quota will be allocated.
+	// For ReleaseQuota request, this mode is supported for both precise
+	// quota
+	// limits and imprecise quota limits. In this case, this operation
+	// releases
+	// quota for the amount specified in the service configuration or
+	// specified
+	// using the quota metrics. If the release can make available
+	// quota
+	// negative, request does not fail but only the available quota will
+	// be
+	// released. After the ReleaseQuota request completes, the available
+	// quota
+	// will be 0, and never goes to negative.
+	//   "CHECK_ONLY" - For AllocateQuota request, only checks if there is
+	// enough quota
+	// available and does not change the available quota. No lock is placed
+	// on
+	// the available quota either. Not supported for ReleaseQuota request.
+	QuotaMode string `json:"quotaMode,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "ConsumerId") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ConsumerId") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *QuotaOperation) MarshalJSON() ([]byte, error) {
+	type noMethod QuotaOperation
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// QuotaProperties: Represents the properties needed for quota
+// operations.
+//
+// Use the metric_value_sets field in Operation message to provide
+// cost
+// override with metric_name in
+// <service_name>/quota/<quota_group_name>/cost
+// format. Overrides for unmatched quota groups will be ignored.
+// Costs are expected to be >= 0. Cost 0 will cause no quota check,
+// but still traffic restrictions will be enforced.
+type QuotaProperties struct {
+	// LimitByIds: LimitType IDs that should be used for checking quota. Key
+	// in this map
+	// should be a valid LimitType string, and the value is the ID to be
+	// used. For
+	// example, an entry <USER, 123> will cause all user quota limits to use
+	// 123
+	// as the user ID. See google/api/quota.proto for the definition of
+	// LimitType.
+	// CLIENT_PROJECT: Not supported.
+	// USER: Value of this entry will be used for enforcing user-level
+	// quota
+	//       limits. If none specified, caller IP passed in the
+	//       servicecontrol.googleapis.com/caller_ip label will be used
+	// instead.
+	//       If the server cannot resolve a value for this LimitType, an
+	// error
+	//       will be thrown. No validation will be performed on this
+	// ID.
+	// Deprecated: use servicecontrol.googleapis.com/user label to send user
+	// ID.
+	LimitByIds map[string]string `json:"limitByIds,omitempty"`
+
+	// QuotaMode: Quota mode for this operation.
+	//
+	// Possible values:
+	//   "ACQUIRE" - Decreases available quota by the cost specified for the
+	// operation.
+	// If cost is higher than available quota, operation fails and
+	// returns
+	// error.
+	//   "ACQUIRE_BEST_EFFORT" - Decreases available quota by the cost
+	// specified for the operation.
+	// If cost is higher than available quota, operation does not fail
+	// and
+	// available quota goes down to zero but it returns error.
+	//   "CHECK" - Does not change any available quota. Only checks if there
+	// is enough
+	// quota.
+	// No lock is placed on the checked tokens neither.
+	//   "RELEASE" - Increases available quota by the operation cost
+	// specified for the
+	// operation.
+	QuotaMode string `json:"quotaMode,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "LimitByIds") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "LimitByIds") to include in
+	// API requests with the JSON null value. By default, fields with empty
+	// values are omitted from API requests. However, any field with an
+	// empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *QuotaProperties) MarshalJSON() ([]byte, error) {
+	type noMethod QuotaProperties
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// ReleaseQuotaRequest: Request message for the ReleaseQuota method.
+type ReleaseQuotaRequest struct {
+	// ReleaseOperation: Operation that describes the quota release.
+	ReleaseOperation *QuotaOperation `json:"releaseOperation,omitempty"`
+
+	// ServiceConfigId: Specifies which version of service configuration
+	// should be used to process
+	// the request. If unspecified or no matching version can be found, the
+	// latest
+	// one will be used.
+	ServiceConfigId string `json:"serviceConfigId,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "ReleaseOperation") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ReleaseOperation") to
+	// include in API requests with the JSON null value. By default, fields
+	// with empty values are omitted from API requests. However, any field
+	// with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ReleaseQuotaRequest) MarshalJSON() ([]byte, error) {
+	type noMethod ReleaseQuotaRequest
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+// ReleaseQuotaResponse: Response message for the ReleaseQuota method.
+type ReleaseQuotaResponse struct {
+	// OperationId: The same operation_id value used in the
+	// ReleaseQuotaRequest. Used for
+	// logging and diagnostics purposes.
+	OperationId string `json:"operationId,omitempty"`
+
+	// QuotaMetrics: Quota metrics to indicate the result of release.
+	// Depending on the
+	// request, one or more of the following metrics will be included:
+	//
+	// 1. For rate quota, per quota group or per quota metric released
+	// amount
+	// will be specified using the following delta metric:
+	//   "serviceruntime.googleapis.com/api/consumer/quota_refund_count"
+	//
+	// 2. For allocation quota, per quota metric total usage will be
+	// specified
+	// using the following gauge metric:
+	//
+	// "serviceruntime.googleapis.com/allocation/consumer/quota_used_count"
+	QuotaMetrics []*MetricValueSet `json:"quotaMetrics,omitempty"`
+
+	// ReleaseErrors: Indicates the decision of the release.
+	ReleaseErrors []*QuotaError `json:"releaseErrors,omitempty"`
+
+	// ServiceConfigId: ID of the actual config used to process the request.
+	ServiceConfigId string `json:"serviceConfigId,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "OperationId") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "OperationId") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ReleaseQuotaResponse) MarshalJSON() ([]byte, error) {
+	type noMethod ReleaseQuotaResponse
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // ReportError: Represents the processing error of one `Operation` in
 // the request.
 type ReportError struct {
@@ -1031,6 +1826,36 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type ReportInfo struct {
+	// OperationId: The Operation.operation_id value from the request.
+	OperationId string `json:"operationId,omitempty"`
+
+	// QuotaInfo: Quota usage info when processing the `Operation`.
+	QuotaInfo *QuotaInfo `json:"quotaInfo,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g. "OperationId") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "OperationId") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *ReportInfo) MarshalJSON() ([]byte, error) {
+	type noMethod ReportInfo
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // ReportRequest: Request message for the Report method.
 type ReportRequest struct {
 	// Operations: Operations to be reported.
@@ -1103,6 +1928,23 @@
 	//    'Operations' in the request succeeded or failed.
 	ReportErrors []*ReportError `json:"reportErrors,omitempty"`
 
+	// ReportInfos: Quota usage for each quota release `Operation`
+	// request.
+	//
+	// Fully or partially failed quota release request may or may not be
+	// present
+	// in `report_quota_info`. For example, a failed quota release request
+	// will
+	// have the current quota usage info when precise quota library returns
+	// the
+	// info. A deadline exceeded quota request will not have quota usage
+	// info.
+	//
+	// If there is no quota release request, report_quota_info will be
+	// empty.
+	//
+	ReportInfos []*ReportInfo `json:"reportInfos,omitempty"`
+
 	// ServiceConfigId: The actual config id used to process the request.
 	ServiceConfigId string `json:"serviceConfigId,omitempty"`
 
@@ -1175,6 +2017,88 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+type StartReconciliationRequest struct {
+	// ReconciliationOperation: Operation that describes the quota
+	// reconciliation.
+	ReconciliationOperation *QuotaOperation `json:"reconciliationOperation,omitempty"`
+
+	// ServiceConfigId: Specifies which version of service configuration
+	// should be used to process
+	// the request. If unspecified or no matching version can be found, the
+	// latest
+	// one will be used.
+	ServiceConfigId string `json:"serviceConfigId,omitempty"`
+
+	// ForceSendFields is a list of field names (e.g.
+	// "ReconciliationOperation") to unconditionally include in API
+	// requests. By default, fields with empty values are omitted from API
+	// requests. However, any non-pointer, non-interface field appearing in
+	// ForceSendFields will be sent to the server regardless of whether the
+	// field is empty or not. This may be used to include empty fields in
+	// Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "ReconciliationOperation")
+	// to include in API requests with the JSON null value. By default,
+	// fields with empty values are omitted from API requests. However, any
+	// field with an empty value appearing in NullFields will be sent to the
+	// server as null. It is an error if a field in this list has a
+	// non-empty value. This may be used to include null fields in Patch
+	// requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *StartReconciliationRequest) MarshalJSON() ([]byte, error) {
+	type noMethod StartReconciliationRequest
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
+type StartReconciliationResponse struct {
+	// OperationId: The same operation_id value used in the
+	// StartReconciliationRequest. Used
+	// for logging and diagnostics purposes.
+	OperationId string `json:"operationId,omitempty"`
+
+	// QuotaMetrics: Metric values as tracked by One Platform before the
+	// start of
+	// reconciliation.
+	QuotaMetrics []*MetricValueSet `json:"quotaMetrics,omitempty"`
+
+	// ReconciliationErrors: Indicates the decision of the reconciliation
+	// start.
+	ReconciliationErrors []*QuotaError `json:"reconciliationErrors,omitempty"`
+
+	// ServiceConfigId: ID of the actual config used to process the request.
+	ServiceConfigId string `json:"serviceConfigId,omitempty"`
+
+	// ServerResponse contains the HTTP response code and headers from the
+	// server.
+	googleapi.ServerResponse `json:"-"`
+
+	// ForceSendFields is a list of field names (e.g. "OperationId") to
+	// unconditionally include in API requests. By default, fields with
+	// empty values are omitted from API requests. However, any non-pointer,
+	// non-interface field appearing in ForceSendFields will be sent to the
+	// server regardless of whether the field is empty or not. This may be
+	// used to include empty fields in Patch requests.
+	ForceSendFields []string `json:"-"`
+
+	// NullFields is a list of field names (e.g. "OperationId") to include
+	// in API requests with the JSON null value. By default, fields with
+	// empty values are omitted from API requests. However, any field with
+	// an empty value appearing in NullFields will be sent to the server as
+	// null. It is an error if a field in this list has a non-empty value.
+	// This may be used to include null fields in Patch requests.
+	NullFields []string `json:"-"`
+}
+
+func (s *StartReconciliationResponse) MarshalJSON() ([]byte, error) {
+	type noMethod StartReconciliationResponse
+	raw := noMethod(*s)
+	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
+}
+
 // Status: The `Status` type defines a logical error model that is
 // suitable for different
 // programming environments, including REST APIs and RPC APIs. It is
@@ -1294,6 +2218,150 @@
 	return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
 }
 
+// method id "servicecontrol.services.allocateQuota":
+
+type ServicesAllocateQuotaCall struct {
+	s                    *Service
+	serviceName          string
+	allocatequotarequest *AllocateQuotaRequest
+	urlParams_           gensupport.URLParams
+	ctx_                 context.Context
+	header_              http.Header
+}
+
+// AllocateQuota: Attempts to allocate quota for the specified consumer.
+// It should be called
+// before the operation is executed.
+//
+// This method requires the
+// `servicemanagement.services.quota`
+// permission on the specified service. For more information,
+// see
+// [Google Cloud IAM](https://cloud.google.com/iam).
+func (r *ServicesService) AllocateQuota(serviceName string, allocatequotarequest *AllocateQuotaRequest) *ServicesAllocateQuotaCall {
+	c := &ServicesAllocateQuotaCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.serviceName = serviceName
+	c.allocatequotarequest = allocatequotarequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ServicesAllocateQuotaCall) Fields(s ...googleapi.Field) *ServicesAllocateQuotaCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ServicesAllocateQuotaCall) Context(ctx context.Context) *ServicesAllocateQuotaCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ServicesAllocateQuotaCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ServicesAllocateQuotaCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.allocatequotarequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/services/{serviceName}:allocateQuota")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"serviceName": c.serviceName,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "servicecontrol.services.allocateQuota" call.
+// Exactly one of *AllocateQuotaResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *AllocateQuotaResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *ServicesAllocateQuotaCall) Do(opts ...googleapi.CallOption) (*AllocateQuotaResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &AllocateQuotaResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Attempts to allocate quota for the specified consumer. It should be called\nbefore the operation is executed.\n\nThis method requires the `servicemanagement.services.quota`\npermission on the specified service. For more information, see\n[Google Cloud IAM](https://cloud.google.com/iam).",
+	//   "flatPath": "v1/services/{serviceName}:allocateQuota",
+	//   "httpMethod": "POST",
+	//   "id": "servicecontrol.services.allocateQuota",
+	//   "parameterOrder": [
+	//     "serviceName"
+	//   ],
+	//   "parameters": {
+	//     "serviceName": {
+	//       "description": "Name of the service as specified in the service configuration. For example,\n`\"pubsub.googleapis.com\"`.\n\nSee google.api.Service for the definition of a service name.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1/services/{serviceName}:allocateQuota",
+	//   "request": {
+	//     "$ref": "AllocateQuotaRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "AllocateQuotaResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/servicecontrol"
+	//   ]
+	// }
+
+}
+
 // method id "servicecontrol.services.check":
 
 type ServicesCheckCall struct {
@@ -1361,6 +2429,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.checkrequest)
 	if err != nil {
@@ -1446,6 +2515,293 @@
 
 }
 
+// method id "servicecontrol.services.endReconciliation":
+
+type ServicesEndReconciliationCall struct {
+	s                        *Service
+	serviceName              string
+	endreconciliationrequest *EndReconciliationRequest
+	urlParams_               gensupport.URLParams
+	ctx_                     context.Context
+	header_                  http.Header
+}
+
+// EndReconciliation: Signals the quota controller that service ends the
+// ongoing usage
+// reconciliation.
+//
+// This method requires the
+// `servicemanagement.services.quota`
+// permission on the specified service. For more information,
+// see
+// [Google Cloud IAM](https://cloud.google.com/iam).
+func (r *ServicesService) EndReconciliation(serviceName string, endreconciliationrequest *EndReconciliationRequest) *ServicesEndReconciliationCall {
+	c := &ServicesEndReconciliationCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.serviceName = serviceName
+	c.endreconciliationrequest = endreconciliationrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ServicesEndReconciliationCall) Fields(s ...googleapi.Field) *ServicesEndReconciliationCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ServicesEndReconciliationCall) Context(ctx context.Context) *ServicesEndReconciliationCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ServicesEndReconciliationCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ServicesEndReconciliationCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.endreconciliationrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/services/{serviceName}:endReconciliation")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"serviceName": c.serviceName,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "servicecontrol.services.endReconciliation" call.
+// Exactly one of *EndReconciliationResponse or error will be non-nil.
+// Any non-2xx status code is an error. Response headers are in either
+// *EndReconciliationResponse.ServerResponse.Header or (if a response
+// was returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *ServicesEndReconciliationCall) Do(opts ...googleapi.CallOption) (*EndReconciliationResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &EndReconciliationResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Signals the quota controller that service ends the ongoing usage\nreconciliation.\n\nThis method requires the `servicemanagement.services.quota`\npermission on the specified service. For more information, see\n[Google Cloud IAM](https://cloud.google.com/iam).",
+	//   "flatPath": "v1/services/{serviceName}:endReconciliation",
+	//   "httpMethod": "POST",
+	//   "id": "servicecontrol.services.endReconciliation",
+	//   "parameterOrder": [
+	//     "serviceName"
+	//   ],
+	//   "parameters": {
+	//     "serviceName": {
+	//       "description": "Name of the service as specified in the service configuration. For example,\n`\"pubsub.googleapis.com\"`.\n\nSee google.api.Service for the definition of a service name.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1/services/{serviceName}:endReconciliation",
+	//   "request": {
+	//     "$ref": "EndReconciliationRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "EndReconciliationResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/servicecontrol"
+	//   ]
+	// }
+
+}
+
+// method id "servicecontrol.services.releaseQuota":
+
+type ServicesReleaseQuotaCall struct {
+	s                   *Service
+	serviceName         string
+	releasequotarequest *ReleaseQuotaRequest
+	urlParams_          gensupport.URLParams
+	ctx_                context.Context
+	header_             http.Header
+}
+
+// ReleaseQuota: Releases previously allocated quota done through
+// AllocateQuota method.
+//
+// This method requires the
+// `servicemanagement.services.quota`
+// permission on the specified service. For more information,
+// see
+// [Google Cloud IAM](https://cloud.google.com/iam).
+func (r *ServicesService) ReleaseQuota(serviceName string, releasequotarequest *ReleaseQuotaRequest) *ServicesReleaseQuotaCall {
+	c := &ServicesReleaseQuotaCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.serviceName = serviceName
+	c.releasequotarequest = releasequotarequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ServicesReleaseQuotaCall) Fields(s ...googleapi.Field) *ServicesReleaseQuotaCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ServicesReleaseQuotaCall) Context(ctx context.Context) *ServicesReleaseQuotaCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ServicesReleaseQuotaCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ServicesReleaseQuotaCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.releasequotarequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/services/{serviceName}:releaseQuota")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"serviceName": c.serviceName,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "servicecontrol.services.releaseQuota" call.
+// Exactly one of *ReleaseQuotaResponse or error will be non-nil. Any
+// non-2xx status code is an error. Response headers are in either
+// *ReleaseQuotaResponse.ServerResponse.Header or (if a response was
+// returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *ServicesReleaseQuotaCall) Do(opts ...googleapi.CallOption) (*ReleaseQuotaResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &ReleaseQuotaResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Releases previously allocated quota done through AllocateQuota method.\n\nThis method requires the `servicemanagement.services.quota`\npermission on the specified service. For more information, see\n[Google Cloud IAM](https://cloud.google.com/iam).",
+	//   "flatPath": "v1/services/{serviceName}:releaseQuota",
+	//   "httpMethod": "POST",
+	//   "id": "servicecontrol.services.releaseQuota",
+	//   "parameterOrder": [
+	//     "serviceName"
+	//   ],
+	//   "parameters": {
+	//     "serviceName": {
+	//       "description": "Name of the service as specified in the service configuration. For example,\n`\"pubsub.googleapis.com\"`.\n\nSee google.api.Service for the definition of a service name.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1/services/{serviceName}:releaseQuota",
+	//   "request": {
+	//     "$ref": "ReleaseQuotaRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "ReleaseQuotaResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/servicecontrol"
+	//   ]
+	// }
+
+}
+
 // method id "servicecontrol.services.report":
 
 type ServicesReportCall struct {
@@ -1515,6 +2871,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.reportrequest)
 	if err != nil {
@@ -1599,3 +2956,180 @@
 	// }
 
 }
+
+// method id "servicecontrol.services.startReconciliation":
+
+type ServicesStartReconciliationCall struct {
+	s                          *Service
+	serviceName                string
+	startreconciliationrequest *StartReconciliationRequest
+	urlParams_                 gensupport.URLParams
+	ctx_                       context.Context
+	header_                    http.Header
+}
+
+// StartReconciliation: Unlike rate quota, allocation quota does not get
+// refilled periodically.
+// So, it is possible that the quota usage as seen by the service
+// differs from
+// what the One Platform considers the usage is. This is expected to
+// happen
+// only rarely, but over time this can accumulate. Services can
+// invoke
+// StartReconciliation and EndReconciliation to correct this usage
+// drift, as
+// described below:
+// 1. Service sends StartReconciliation with a timestamp in future for
+// each
+//    metric that needs to be reconciled. The timestamp being in future
+// allows
+//    to account for in-flight AllocateQuota and ReleaseQuota requests
+// for the
+//    same metric.
+// 2. One Platform records this timestamp and starts tracking
+// subsequent
+//    AllocateQuota and ReleaseQuota requests until EndReconciliation
+// is
+//    called.
+// 3. At or after the time specified in the StartReconciliation,
+// service
+//    sends EndReconciliation with the usage that needs to be reconciled
+// to.
+// 4. One Platform adjusts its own record of usage for that metric to
+// the
+//    value specified in EndReconciliation by taking in to account any
+//    allocation or release between StartReconciliation and
+// EndReconciliation.
+//
+// Signals the quota controller that the service wants to perform a
+// usage
+// reconciliation as specified in the request.
+//
+// This method requires the
+// `servicemanagement.services.quota`
+// permission on the specified service. For more information,
+// see
+// [Google Cloud IAM](https://cloud.google.com/iam).
+func (r *ServicesService) StartReconciliation(serviceName string, startreconciliationrequest *StartReconciliationRequest) *ServicesStartReconciliationCall {
+	c := &ServicesStartReconciliationCall{s: r.s, urlParams_: make(gensupport.URLParams)}
+	c.serviceName = serviceName
+	c.startreconciliationrequest = startreconciliationrequest
+	return c
+}
+
+// Fields allows partial responses to be retrieved. See
+// https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+// for more information.
+func (c *ServicesStartReconciliationCall) Fields(s ...googleapi.Field) *ServicesStartReconciliationCall {
+	c.urlParams_.Set("fields", googleapi.CombineFields(s))
+	return c
+}
+
+// Context sets the context to be used in this call's Do method. Any
+// pending HTTP request will be aborted if the provided context is
+// canceled.
+func (c *ServicesStartReconciliationCall) Context(ctx context.Context) *ServicesStartReconciliationCall {
+	c.ctx_ = ctx
+	return c
+}
+
+// Header returns an http.Header that can be modified by the caller to
+// add HTTP headers to the request.
+func (c *ServicesStartReconciliationCall) Header() http.Header {
+	if c.header_ == nil {
+		c.header_ = make(http.Header)
+	}
+	return c.header_
+}
+
+func (c *ServicesStartReconciliationCall) doRequest(alt string) (*http.Response, error) {
+	reqHeaders := make(http.Header)
+	for k, v := range c.header_ {
+		reqHeaders[k] = v
+	}
+	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
+	var body io.Reader = nil
+	body, err := googleapi.WithoutDataWrapper.JSONReader(c.startreconciliationrequest)
+	if err != nil {
+		return nil, err
+	}
+	reqHeaders.Set("Content-Type", "application/json")
+	c.urlParams_.Set("alt", alt)
+	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/services/{serviceName}:startReconciliation")
+	urls += "?" + c.urlParams_.Encode()
+	req, _ := http.NewRequest("POST", urls, body)
+	req.Header = reqHeaders
+	googleapi.Expand(req.URL, map[string]string{
+		"serviceName": c.serviceName,
+	})
+	return gensupport.SendRequest(c.ctx_, c.s.client, req)
+}
+
+// Do executes the "servicecontrol.services.startReconciliation" call.
+// Exactly one of *StartReconciliationResponse or error will be non-nil.
+// Any non-2xx status code is an error. Response headers are in either
+// *StartReconciliationResponse.ServerResponse.Header or (if a response
+// was returned at all) in error.(*googleapi.Error).Header. Use
+// googleapi.IsNotModified to check whether the returned error was
+// because http.StatusNotModified was returned.
+func (c *ServicesStartReconciliationCall) Do(opts ...googleapi.CallOption) (*StartReconciliationResponse, error) {
+	gensupport.SetOptions(c.urlParams_, opts...)
+	res, err := c.doRequest("json")
+	if res != nil && res.StatusCode == http.StatusNotModified {
+		if res.Body != nil {
+			res.Body.Close()
+		}
+		return nil, &googleapi.Error{
+			Code:   res.StatusCode,
+			Header: res.Header,
+		}
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer googleapi.CloseBody(res)
+	if err := googleapi.CheckResponse(res); err != nil {
+		return nil, err
+	}
+	ret := &StartReconciliationResponse{
+		ServerResponse: googleapi.ServerResponse{
+			Header:         res.Header,
+			HTTPStatusCode: res.StatusCode,
+		},
+	}
+	target := &ret
+	if err := json.NewDecoder(res.Body).Decode(target); err != nil {
+		return nil, err
+	}
+	return ret, nil
+	// {
+	//   "description": "Unlike rate quota, allocation quota does not get refilled periodically.\nSo, it is possible that the quota usage as seen by the service differs from\nwhat the One Platform considers the usage is. This is expected to happen\nonly rarely, but over time this can accumulate. Services can invoke\nStartReconciliation and EndReconciliation to correct this usage drift, as\ndescribed below:\n1. Service sends StartReconciliation with a timestamp in future for each\n   metric that needs to be reconciled. The timestamp being in future allows\n   to account for in-flight AllocateQuota and ReleaseQuota requests for the\n   same metric.\n2. One Platform records this timestamp and starts tracking subsequent\n   AllocateQuota and ReleaseQuota requests until EndReconciliation is\n   called.\n3. At or after the time specified in the StartReconciliation, service\n   sends EndReconciliation with the usage that needs to be reconciled to.\n4. One Platform adjusts its own record of usage for that metric to the\n   value specified in EndReconciliation by taking in to account any\n   allocation or release between StartReconciliation and EndReconciliation.\n\nSignals the quota controller that the service wants to perform a usage\nreconciliation as specified in the request.\n\nThis method requires the `servicemanagement.services.quota`\npermission on the specified service. For more information, see\n[Google Cloud IAM](https://cloud.google.com/iam).",
+	//   "flatPath": "v1/services/{serviceName}:startReconciliation",
+	//   "httpMethod": "POST",
+	//   "id": "servicecontrol.services.startReconciliation",
+	//   "parameterOrder": [
+	//     "serviceName"
+	//   ],
+	//   "parameters": {
+	//     "serviceName": {
+	//       "description": "Name of the service as specified in the service configuration. For example,\n`\"pubsub.googleapis.com\"`.\n\nSee google.api.Service for the definition of a service name.",
+	//       "location": "path",
+	//       "required": true,
+	//       "type": "string"
+	//     }
+	//   },
+	//   "path": "v1/services/{serviceName}:startReconciliation",
+	//   "request": {
+	//     "$ref": "StartReconciliationRequest"
+	//   },
+	//   "response": {
+	//     "$ref": "StartReconciliationResponse"
+	//   },
+	//   "scopes": [
+	//     "https://www.googleapis.com/auth/cloud-platform",
+	//     "https://www.googleapis.com/auth/servicecontrol"
+	//   ]
+	// }
+
+}
diff --git a/servicemanagement/v1/servicemanagement-api.json b/servicemanagement/v1/servicemanagement-api.json
index 5d3778c..8071550 100644
--- a/servicemanagement/v1/servicemanagement-api.json
+++ b/servicemanagement/v1/servicemanagement-api.json
@@ -1,1289 +1,739 @@
 {
-  "id": "servicemanagement:v1",
-  "auth": {
-    "oauth2": {
-      "scopes": {
-        "https://www.googleapis.com/auth/cloud-platform": {
-          "description": "View and manage your data across Google Cloud Platform services"
-        },
-        "https://www.googleapis.com/auth/cloud-platform.read-only": {
-          "description": "View your data across Google Cloud Platform services"
-        },
-        "https://www.googleapis.com/auth/service.management": {
-          "description": "Manage your Google API service configuration"
-        },
-        "https://www.googleapis.com/auth/service.management.readonly": {
-          "description": "View your Google API service configuration"
-        }
-      }
-    }
-  },
-  "description": "Google Service Management allows service producers to publish their services on Google Cloud Platform so that they can be discovered and used by service consumers.",
-  "protocol": "rest",
   "title": "Google Service Management API",
+  "ownerName": "Google",
+  "discoveryVersion": "v1",
   "resources": {
-    "operations": {
-      "methods": {
-        "get": {
-          "id": "servicemanagement.operations.get",
-          "response": {
-            "$ref": "Operation"
-          },
-          "parameterOrder": [
-            "name"
-          ],
-          "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice.",
-          "flatPath": "v1/operations/{operationsId}",
-          "httpMethod": "GET",
-          "parameters": {
-            "name": {
-              "description": "The name of the operation resource.",
-              "required": true,
-              "pattern": "^operations/.+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/{+name}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/service.management"
-          ]
-        }
-      }
-    },
     "services": {
-      "resources": {
-        "rollouts": {
-          "methods": {
-            "get": {
-              "id": "servicemanagement.services.rollouts.get",
-              "response": {
-                "$ref": "Rollout"
-              },
-              "parameterOrder": [
-                "serviceName",
-                "rolloutId"
-              ],
-              "description": "Gets a service configuration rollout.",
-              "flatPath": "v1/services/{serviceName}/rollouts/{rolloutId}",
-              "httpMethod": "GET",
-              "parameters": {
-                "rolloutId": {
-                  "description": "The id of the rollout resource.",
-                  "required": true,
-                  "location": "path",
-                  "type": "string"
-                },
-                "serviceName": {
-                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
-                  "required": true,
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/services/{serviceName}/rollouts/{rolloutId}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/service.management",
-                "https://www.googleapis.com/auth/service.management.readonly"
-              ]
-            },
-            "create": {
-              "id": "servicemanagement.services.rollouts.create",
-              "response": {
-                "$ref": "Operation"
-              },
-              "parameterOrder": [
-                "serviceName"
-              ],
-              "description": "Creates a new service configuration rollout. Based on rollout, the\nGoogle Service Management will roll out the service configurations to\ndifferent backend services. For example, the logging configuration will be\npushed to Google Cloud Logging.\n\nPlease note that any previous pending and running Rollouts and associated\nOperations will be automatically cancelled so that the latest Rollout will\nnot be blocked by previous Rollouts.\n\nOperation\u003cresponse: Rollout\u003e",
-              "request": {
-                "$ref": "Rollout"
-              },
-              "flatPath": "v1/services/{serviceName}/rollouts",
-              "httpMethod": "POST",
-              "parameters": {
-                "serviceName": {
-                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
-                  "required": true,
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/services/{serviceName}/rollouts",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/service.management"
-              ]
-            },
-            "list": {
-              "id": "servicemanagement.services.rollouts.list",
-              "response": {
-                "$ref": "ListServiceRolloutsResponse"
-              },
-              "parameterOrder": [
-                "serviceName"
-              ],
-              "description": "Lists the history of the service configuration rollouts for a managed\nservice, from the newest to the oldest.",
-              "flatPath": "v1/services/{serviceName}/rollouts",
-              "httpMethod": "GET",
-              "parameters": {
-                "pageSize": {
-                  "description": "The max number of items to include in the response list.",
-                  "location": "query",
-                  "type": "integer",
-                  "format": "int32"
-                },
-                "serviceName": {
-                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
-                  "required": true,
-                  "location": "path",
-                  "type": "string"
-                },
-                "pageToken": {
-                  "description": "The token of the page to retrieve.",
-                  "location": "query",
-                  "type": "string"
-                }
-              },
-              "path": "v1/services/{serviceName}/rollouts",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/service.management",
-                "https://www.googleapis.com/auth/service.management.readonly"
-              ]
-            }
-          }
-        },
-        "configs": {
-          "methods": {
-            "submit": {
-              "id": "servicemanagement.services.configs.submit",
-              "response": {
-                "$ref": "Operation"
-              },
-              "parameterOrder": [
-                "serviceName"
-              ],
-              "description": "Creates a new service configuration (version) for a managed service based\non\nuser-supplied configuration source files (for example: OpenAPI\nSpecification). This method stores the source configurations as well as the\ngenerated service configuration. To rollout the service configuration to\nother services,\nplease call CreateServiceRollout.\n\nOperation\u003cresponse: SubmitConfigSourceResponse\u003e",
-              "request": {
-                "$ref": "SubmitConfigSourceRequest"
-              },
-              "flatPath": "v1/services/{serviceName}/configs:submit",
-              "httpMethod": "POST",
-              "parameters": {
-                "serviceName": {
-                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
-                  "required": true,
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/services/{serviceName}/configs:submit",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/service.management"
-              ]
-            },
-            "get": {
-              "id": "servicemanagement.services.configs.get",
-              "response": {
-                "$ref": "Service"
-              },
-              "parameterOrder": [
-                "serviceName",
-                "configId"
-              ],
-              "description": "Gets a service configuration (version) for a managed service.",
-              "flatPath": "v1/services/{serviceName}/configs/{configId}",
-              "httpMethod": "GET",
-              "parameters": {
-                "configId": {
-                  "description": "The id of the service configuration resource.",
-                  "required": true,
-                  "location": "path",
-                  "type": "string"
-                },
-                "serviceName": {
-                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
-                  "required": true,
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/services/{serviceName}/configs/{configId}",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/service.management",
-                "https://www.googleapis.com/auth/service.management.readonly"
-              ]
-            },
-            "create": {
-              "id": "servicemanagement.services.configs.create",
-              "response": {
-                "$ref": "Service"
-              },
-              "parameterOrder": [
-                "serviceName"
-              ],
-              "description": "Creates a new service configuration (version) for a managed service.\nThis method only stores the service configuration. To roll out the service\nconfiguration to backend systems please call\nCreateServiceRollout.",
-              "request": {
-                "$ref": "Service"
-              },
-              "flatPath": "v1/services/{serviceName}/configs",
-              "httpMethod": "POST",
-              "parameters": {
-                "serviceName": {
-                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
-                  "required": true,
-                  "location": "path",
-                  "type": "string"
-                }
-              },
-              "path": "v1/services/{serviceName}/configs",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/service.management"
-              ]
-            },
-            "list": {
-              "id": "servicemanagement.services.configs.list",
-              "response": {
-                "$ref": "ListServiceConfigsResponse"
-              },
-              "parameterOrder": [
-                "serviceName"
-              ],
-              "description": "Lists the history of the service configuration for a managed service,\nfrom the newest to the oldest.",
-              "flatPath": "v1/services/{serviceName}/configs",
-              "httpMethod": "GET",
-              "parameters": {
-                "pageSize": {
-                  "description": "The max number of items to include in the response list.",
-                  "location": "query",
-                  "type": "integer",
-                  "format": "int32"
-                },
-                "serviceName": {
-                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
-                  "required": true,
-                  "location": "path",
-                  "type": "string"
-                },
-                "pageToken": {
-                  "description": "The token of the page to retrieve.",
-                  "location": "query",
-                  "type": "string"
-                }
-              },
-              "path": "v1/services/{serviceName}/configs",
-              "scopes": [
-                "https://www.googleapis.com/auth/cloud-platform",
-                "https://www.googleapis.com/auth/cloud-platform.read-only",
-                "https://www.googleapis.com/auth/service.management",
-                "https://www.googleapis.com/auth/service.management.readonly"
-              ]
-            }
-          }
-        }
-      },
       "methods": {
         "getIamPolicy": {
-          "id": "servicemanagement.services.getIamPolicy",
-          "response": {
-            "$ref": "Policy"
-          },
-          "parameterOrder": [
-            "resource"
-          ],
           "description": "Gets the access control policy for a resource.\nReturns an empty policy if the resource exists and does not have a policy\nset.",
           "request": {
             "$ref": "GetIamPolicyRequest"
           },
-          "flatPath": "v1/services/{servicesId}:getIamPolicy",
           "httpMethod": "POST",
+          "parameterOrder": [
+            "resource"
+          ],
+          "response": {
+            "$ref": "Policy"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/service.management"
+          ],
           "parameters": {
             "resource": {
-              "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
               "pattern": "^services/[^/]+$",
               "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/{+resource}:getIamPolicy",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/service.management"
-          ]
-        },
-        "disable": {
-          "id": "servicemanagement.services.disable",
-          "response": {
-            "$ref": "Operation"
-          },
-          "parameterOrder": [
-            "serviceName"
-          ],
-          "description": "Disable a managed service for a project.\n\nOperation\u003cresponse: DisableServiceResponse\u003e",
-          "request": {
-            "$ref": "DisableServiceRequest"
-          },
-          "flatPath": "v1/services/{serviceName}:disable",
-          "httpMethod": "POST",
-          "parameters": {
-            "serviceName": {
-              "description": "Name of the service to disable. Specifying an unknown service name\nwill cause the request to fail.",
+              "description": "REQUIRED: The resource for which the policy is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
               "required": true,
-              "location": "path",
               "type": "string"
             }
           },
-          "path": "v1/services/{serviceName}:disable",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/service.management"
-          ]
-        },
-        "generateConfigReport": {
-          "id": "servicemanagement.services.generateConfigReport",
-          "response": {
-            "$ref": "GenerateConfigReportResponse"
-          },
-          "parameterOrder": [],
-          "description": "Generates and returns a report (errors, warnings and changes from\nexisting configurations) associated with\nGenerateConfigReportRequest.new_value\n\nIf GenerateConfigReportRequest.old_value is specified,\nGenerateConfigReportRequest will contain a single ChangeReport based on the\ncomparison between GenerateConfigReportRequest.new_value and\nGenerateConfigReportRequest.old_value.\nIf GenerateConfigReportRequest.old_value is not specified, this method\nwill compare GenerateConfigReportRequest.new_value with the last pushed\nservice configuration.",
-          "request": {
-            "$ref": "GenerateConfigReportRequest"
-          },
-          "flatPath": "v1/services:generateConfigReport",
-          "httpMethod": "POST",
-          "parameters": {},
-          "path": "v1/services:generateConfigReport",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/service.management"
-          ]
-        },
-        "getConfig": {
-          "id": "servicemanagement.services.getConfig",
-          "response": {
-            "$ref": "Service"
-          },
-          "parameterOrder": [
-            "serviceName"
-          ],
-          "description": "Gets a service configuration (version) for a managed service.",
-          "flatPath": "v1/services/{serviceName}/config",
-          "httpMethod": "GET",
-          "parameters": {
-            "configId": {
-              "description": "The id of the service configuration resource.",
-              "location": "query",
-              "type": "string"
-            },
-            "serviceName": {
-              "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/services/{serviceName}/config",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only",
-            "https://www.googleapis.com/auth/service.management",
-            "https://www.googleapis.com/auth/service.management.readonly"
-          ]
+          "flatPath": "v1/services/{servicesId}:getIamPolicy",
+          "id": "servicemanagement.services.getIamPolicy",
+          "path": "v1/{+resource}:getIamPolicy"
         },
         "undelete": {
-          "id": "servicemanagement.services.undelete",
-          "response": {
-            "$ref": "Operation"
-          },
-          "parameterOrder": [
-            "serviceName"
-          ],
-          "description": "Revives a previously deleted managed service. The method restores the\nservice using the configuration at the time the service was deleted.\nThe target service must exist and must have been deleted within the\nlast 30 days.\n\nOperation\u003cresponse: UndeleteServiceResponse\u003e",
-          "flatPath": "v1/services/{serviceName}:undelete",
-          "httpMethod": "POST",
-          "parameters": {
-            "serviceName": {
-              "description": "The name of the service. See the [overview](/service-management/overview)\nfor naming requirements. For example: `example.googleapis.com`.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/services/{serviceName}:undelete",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/service.management"
-          ]
-        },
-        "get": {
-          "id": "servicemanagement.services.get",
-          "response": {
-            "$ref": "ManagedService"
+          ],
+          "parameters": {
+            "serviceName": {
+              "required": true,
+              "type": "string",
+              "location": "path",
+              "description": "The name of the service. See the [overview](/service-management/overview)\nfor naming requirements. For example: `example.googleapis.com`."
+            }
           },
+          "flatPath": "v1/services/{serviceName}:undelete",
+          "id": "servicemanagement.services.undelete",
+          "path": "v1/services/{serviceName}:undelete",
+          "description": "Revives a previously deleted managed service. The method restores the\nservice using the configuration at the time the service was deleted.\nThe target service must exist and must have been deleted within the\nlast 30 days.\n\nOperation\u003cresponse: UndeleteServiceResponse\u003e",
+          "httpMethod": "POST",
           "parameterOrder": [
             "serviceName"
           ],
-          "description": "Gets a managed service. Authentication is required unless the service is\npublic.",
-          "flatPath": "v1/services/{serviceName}",
-          "httpMethod": "GET",
-          "parameters": {
-            "serviceName": {
-              "description": "The name of the service.  See the `ServiceManager` overview for naming\nrequirements.  For example: `example.googleapis.com`.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/services/{serviceName}",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/cloud-platform.read-only",
-            "https://www.googleapis.com/auth/service.management",
-            "https://www.googleapis.com/auth/service.management.readonly"
-          ]
+          "response": {
+            "$ref": "Operation"
+          }
         },
         "list": {
+          "path": "v1/services",
           "id": "servicemanagement.services.list",
+          "description": "Lists managed services.\n\nIf called without any authentication, it returns only the public services.\nIf called with authentication, it returns all services that the caller has\n\"servicemanagement.services.get\" permission for.\n\n**BETA:** If the caller specifies the `consumer_id`, it returns only the\nservices enabled on the consumer. The `consumer_id` must have the format\nof \"project:{PROJECT-ID}\".",
           "response": {
             "$ref": "ListServicesResponse"
           },
           "parameterOrder": [],
-          "description": "Lists managed services.\n\nIf called without any authentication, it returns only the public services.\nIf called with authentication, it returns all services that the caller has\n\"servicemanagement.services.get\" permission for.\n\n**BETA:** If the caller specifies the `consumer_id`, it returns only the\nservices enabled on the consumer. The `consumer_id` must have the format\nof \"project:{PROJECT-ID}\".",
-          "flatPath": "v1/services",
           "httpMethod": "GET",
           "parameters": {
-            "pageSize": {
-              "description": "Requested size of the next page of data.",
+            "consumerId": {
               "location": "query",
-              "type": "integer",
-              "format": "int32"
-            },
-            "producerProjectId": {
-              "description": "Include services produced by the specified project.",
-              "location": "query",
+              "description": "Include services consumed by the specified consumer.\n\nThe Google Service Management implementation accepts the following\nforms:\n- project:\u003cproject_id\u003e",
               "type": "string"
             },
             "pageToken": {
-              "description": "Token identifying which result to start with; returned by a previous list\ncall.",
+              "type": "string",
               "location": "query",
-              "type": "string"
+              "description": "Token identifying which result to start with; returned by a previous list\ncall."
             },
-            "consumerId": {
-              "description": "Include services consumed by the specified consumer.\n\nThe Google Service Management implementation accepts the following\nforms:\n- project:\u003cproject_id\u003e",
+            "pageSize": {
+              "description": "Requested size of the next page of data.",
+              "format": "int32",
+              "type": "integer",
+              "location": "query"
+            },
+            "producerProjectId": {
               "location": "query",
+              "description": "Include services produced by the specified project.",
               "type": "string"
             }
           },
-          "path": "v1/services",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/cloud-platform.read-only",
             "https://www.googleapis.com/auth/service.management",
             "https://www.googleapis.com/auth/service.management.readonly"
-          ]
+          ],
+          "flatPath": "v1/services"
         },
         "create": {
-          "id": "servicemanagement.services.create",
+          "request": {
+            "$ref": "ManagedService"
+          },
+          "description": "Creates a new managed service.\nPlease note one producer project can own no more than 20 services.\n\nOperation\u003cresponse: ManagedService\u003e",
           "response": {
             "$ref": "Operation"
           },
           "parameterOrder": [],
-          "description": "Creates a new managed service.\nPlease note one producer project can own no more than 20 services.\n\nOperation\u003cresponse: ManagedService\u003e",
-          "request": {
-            "$ref": "ManagedService"
-          },
-          "flatPath": "v1/services",
           "httpMethod": "POST",
           "parameters": {},
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/service.management"
+          ],
+          "flatPath": "v1/services",
           "path": "v1/services",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/service.management"
-          ]
+          "id": "servicemanagement.services.create"
         },
-        "enable": {
-          "id": "servicemanagement.services.enable",
-          "response": {
-            "$ref": "Operation"
-          },
-          "parameterOrder": [
-            "serviceName"
-          ],
-          "description": "Enable a managed service for a project with default setting.\n\nOperation\u003cresponse: EnableServiceResponse\u003e\n\ngoogle.rpc.Status errors may contain a\ngoogle.rpc.PreconditionFailure error detail.",
+        "generateConfigReport": {
+          "description": "Generates and returns a report (errors, warnings and changes from\nexisting configurations) associated with\nGenerateConfigReportRequest.new_value\n\nIf GenerateConfigReportRequest.old_value is specified,\nGenerateConfigReportRequest will contain a single ChangeReport based on the\ncomparison between GenerateConfigReportRequest.new_value and\nGenerateConfigReportRequest.old_value.\nIf GenerateConfigReportRequest.old_value is not specified, this method\nwill compare GenerateConfigReportRequest.new_value with the last pushed\nservice configuration.",
           "request": {
-            "$ref": "EnableServiceRequest"
+            "$ref": "GenerateConfigReportRequest"
           },
-          "flatPath": "v1/services/{serviceName}:enable",
+          "response": {
+            "$ref": "GenerateConfigReportResponse"
+          },
+          "parameterOrder": [],
           "httpMethod": "POST",
-          "parameters": {
-            "serviceName": {
-              "description": "Name of the service to enable. Specifying an unknown service name will\ncause the request to fail.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/services/{serviceName}:enable",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/service.management"
-          ]
-        },
-        "setIamPolicy": {
-          "id": "servicemanagement.services.setIamPolicy",
-          "response": {
-            "$ref": "Policy"
-          },
-          "parameterOrder": [
-            "resource"
           ],
-          "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy.",
-          "request": {
-            "$ref": "SetIamPolicyRequest"
-          },
-          "flatPath": "v1/services/{servicesId}:setIamPolicy",
-          "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "pattern": "^services/[^/]+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/{+resource}:setIamPolicy",
-          "scopes": [
-            "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/service.management"
-          ]
+          "parameters": {},
+          "flatPath": "v1/services:generateConfigReport",
+          "path": "v1/services:generateConfigReport",
+          "id": "servicemanagement.services.generateConfigReport"
         },
-        "delete": {
-          "id": "servicemanagement.services.delete",
-          "response": {
-            "$ref": "Operation"
-          },
-          "parameterOrder": [
-            "serviceName"
-          ],
-          "description": "Deletes a managed service. This method will change the service to the\n`Soft-Delete` state for 30 days. Within this period, service producers may\ncall UndeleteService to restore the service.\nAfter 30 days, the service will be permanently deleted.\n\nOperation\u003cresponse: google.protobuf.Empty\u003e",
-          "flatPath": "v1/services/{serviceName}",
-          "httpMethod": "DELETE",
-          "parameters": {
-            "serviceName": {
-              "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
-              "required": true,
-              "location": "path",
-              "type": "string"
-            }
-          },
+        "get": {
+          "id": "servicemanagement.services.get",
           "path": "v1/services/{serviceName}",
+          "description": "Gets a managed service. Authentication is required unless the service is\npublic.",
+          "httpMethod": "GET",
+          "parameterOrder": [
+            "serviceName"
+          ],
+          "response": {
+            "$ref": "ManagedService"
+          },
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
-            "https://www.googleapis.com/auth/service.management"
-          ]
+            "https://www.googleapis.com/auth/cloud-platform.read-only",
+            "https://www.googleapis.com/auth/service.management",
+            "https://www.googleapis.com/auth/service.management.readonly"
+          ],
+          "parameters": {
+            "serviceName": {
+              "description": "The name of the service.  See the `ServiceManager` overview for naming\nrequirements.  For example: `example.googleapis.com`.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            }
+          },
+          "flatPath": "v1/services/{serviceName}"
         },
         "testIamPermissions": {
-          "id": "servicemanagement.services.testIamPermissions",
           "response": {
             "$ref": "TestIamPermissionsResponse"
           },
           "parameterOrder": [
             "resource"
           ],
-          "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
-          "request": {
-            "$ref": "TestIamPermissionsRequest"
-          },
-          "flatPath": "v1/services/{servicesId}:testIamPermissions",
           "httpMethod": "POST",
-          "parameters": {
-            "resource": {
-              "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
-              "required": true,
-              "pattern": "^services/[^/]+$",
-              "location": "path",
-              "type": "string"
-            }
-          },
-          "path": "v1/{+resource}:testIamPermissions",
           "scopes": [
             "https://www.googleapis.com/auth/cloud-platform",
             "https://www.googleapis.com/auth/service.management"
+          ],
+          "parameters": {
+            "resource": {
+              "location": "path",
+              "description": "REQUIRED: The resource for which the policy detail is being requested.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+              "required": true,
+              "type": "string",
+              "pattern": "^services/[^/]+$"
+            }
+          },
+          "flatPath": "v1/services/{servicesId}:testIamPermissions",
+          "path": "v1/{+resource}:testIamPermissions",
+          "id": "servicemanagement.services.testIamPermissions",
+          "description": "Returns permissions that a caller has on the specified resource.\nIf the resource does not exist, this will return an empty set of\npermissions, not a NOT_FOUND error.",
+          "request": {
+            "$ref": "TestIamPermissionsRequest"
+          }
+        },
+        "getConfig": {
+          "parameters": {
+            "serviceName": {
+              "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
+              "required": true,
+              "type": "string",
+              "location": "path"
+            },
+            "configId": {
+              "description": "The id of the service configuration resource.",
+              "type": "string",
+              "location": "query"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/cloud-platform.read-only",
+            "https://www.googleapis.com/auth/service.management",
+            "https://www.googleapis.com/auth/service.management.readonly"
+          ],
+          "flatPath": "v1/services/{serviceName}/config",
+          "id": "servicemanagement.services.getConfig",
+          "path": "v1/services/{serviceName}/config",
+          "description": "Gets a service configuration (version) for a managed service.",
+          "httpMethod": "GET",
+          "response": {
+            "$ref": "Service"
+          },
+          "parameterOrder": [
+            "serviceName"
           ]
+        },
+        "delete": {
+          "parameterOrder": [
+            "serviceName"
+          ],
+          "httpMethod": "DELETE",
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/service.management"
+          ],
+          "parameters": {
+            "serviceName": {
+              "location": "path",
+              "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1/services/{serviceName}",
+          "path": "v1/services/{serviceName}",
+          "id": "servicemanagement.services.delete",
+          "description": "Deletes a managed service. This method will change the service to the\n`Soft-Delete` state for 30 days. Within this period, service producers may\ncall UndeleteService to restore the service.\nAfter 30 days, the service will be permanently deleted.\n\nOperation\u003cresponse: google.protobuf.Empty\u003e"
+        },
+        "enable": {
+          "description": "Enable a managed service for a project with default setting.\n\nOperation\u003cresponse: EnableServiceResponse\u003e\n\ngoogle.rpc.Status errors may contain a\ngoogle.rpc.PreconditionFailure error detail.",
+          "request": {
+            "$ref": "EnableServiceRequest"
+          },
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "serviceName"
+          ],
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/service.management"
+          ],
+          "parameters": {
+            "serviceName": {
+              "required": true,
+              "type": "string",
+              "location": "path",
+              "description": "Name of the service to enable. Specifying an unknown service name will\ncause the request to fail."
+            }
+          },
+          "flatPath": "v1/services/{serviceName}:enable",
+          "id": "servicemanagement.services.enable",
+          "path": "v1/services/{serviceName}:enable"
+        },
+        "setIamPolicy": {
+          "response": {
+            "$ref": "Policy"
+          },
+          "parameterOrder": [
+            "resource"
+          ],
+          "httpMethod": "POST",
+          "parameters": {
+            "resource": {
+              "pattern": "^services/[^/]+$",
+              "location": "path",
+              "description": "REQUIRED: The resource for which the policy is being specified.\n`resource` is usually specified as a path. For example, a Project\nresource is specified as `projects/{project}`.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/service.management"
+          ],
+          "flatPath": "v1/services/{servicesId}:setIamPolicy",
+          "path": "v1/{+resource}:setIamPolicy",
+          "id": "servicemanagement.services.setIamPolicy",
+          "request": {
+            "$ref": "SetIamPolicyRequest"
+          },
+          "description": "Sets the access control policy on the specified resource. Replaces any\nexisting policy."
+        },
+        "disable": {
+          "id": "servicemanagement.services.disable",
+          "path": "v1/services/{serviceName}:disable",
+          "request": {
+            "$ref": "DisableServiceRequest"
+          },
+          "description": "Disable a managed service for a project.\n\nOperation\u003cresponse: DisableServiceResponse\u003e",
+          "httpMethod": "POST",
+          "parameterOrder": [
+            "serviceName"
+          ],
+          "response": {
+            "$ref": "Operation"
+          },
+          "parameters": {
+            "serviceName": {
+              "location": "path",
+              "description": "Name of the service to disable. Specifying an unknown service name\nwill cause the request to fail.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/service.management"
+          ],
+          "flatPath": "v1/services/{serviceName}:disable"
+        }
+      },
+      "resources": {
+        "configs": {
+          "methods": {
+            "list": {
+              "path": "v1/services/{serviceName}/configs",
+              "id": "servicemanagement.services.configs.list",
+              "description": "Lists the history of the service configuration for a managed service,\nfrom the newest to the oldest.",
+              "response": {
+                "$ref": "ListServiceConfigsResponse"
+              },
+              "parameterOrder": [
+                "serviceName"
+              ],
+              "httpMethod": "GET",
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/service.management",
+                "https://www.googleapis.com/auth/service.management.readonly"
+              ],
+              "parameters": {
+                "pageToken": {
+                  "location": "query",
+                  "description": "The token of the page to retrieve.",
+                  "type": "string"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "The max number of items to include in the response list.",
+                  "format": "int32",
+                  "type": "integer"
+                },
+                "serviceName": {
+                  "location": "path",
+                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1/services/{serviceName}/configs"
+            },
+            "get": {
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/service.management",
+                "https://www.googleapis.com/auth/service.management.readonly"
+              ],
+              "parameters": {
+                "serviceName": {
+                  "required": true,
+                  "type": "string",
+                  "location": "path",
+                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`."
+                },
+                "configId": {
+                  "location": "path",
+                  "description": "The id of the service configuration resource.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1/services/{serviceName}/configs/{configId}",
+              "id": "servicemanagement.services.configs.get",
+              "path": "v1/services/{serviceName}/configs/{configId}",
+              "description": "Gets a service configuration (version) for a managed service.",
+              "parameterOrder": [
+                "serviceName",
+                "configId"
+              ],
+              "httpMethod": "GET",
+              "response": {
+                "$ref": "Service"
+              }
+            },
+            "create": {
+              "response": {
+                "$ref": "Service"
+              },
+              "parameterOrder": [
+                "serviceName"
+              ],
+              "httpMethod": "POST",
+              "parameters": {
+                "serviceName": {
+                  "location": "path",
+                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/service.management"
+              ],
+              "flatPath": "v1/services/{serviceName}/configs",
+              "path": "v1/services/{serviceName}/configs",
+              "id": "servicemanagement.services.configs.create",
+              "request": {
+                "$ref": "Service"
+              },
+              "description": "Creates a new service configuration (version) for a managed service.\nThis method only stores the service configuration. To roll out the service\nconfiguration to backend systems please call\nCreateServiceRollout."
+            },
+            "submit": {
+              "parameters": {
+                "serviceName": {
+                  "location": "path",
+                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/service.management"
+              ],
+              "flatPath": "v1/services/{serviceName}/configs:submit",
+              "path": "v1/services/{serviceName}/configs:submit",
+              "id": "servicemanagement.services.configs.submit",
+              "request": {
+                "$ref": "SubmitConfigSourceRequest"
+              },
+              "description": "Creates a new service configuration (version) for a managed service based\non\nuser-supplied configuration source files (for example: OpenAPI\nSpecification). This method stores the source configurations as well as the\ngenerated service configuration. To rollout the service configuration to\nother services,\nplease call CreateServiceRollout.\n\nOperation\u003cresponse: SubmitConfigSourceResponse\u003e",
+              "response": {
+                "$ref": "Operation"
+              },
+              "parameterOrder": [
+                "serviceName"
+              ],
+              "httpMethod": "POST"
+            }
+          }
+        },
+        "rollouts": {
+          "methods": {
+            "list": {
+              "flatPath": "v1/services/{serviceName}/rollouts",
+              "id": "servicemanagement.services.rollouts.list",
+              "path": "v1/services/{serviceName}/rollouts",
+              "description": "Lists the history of the service configuration rollouts for a managed\nservice, from the newest to the oldest.",
+              "httpMethod": "GET",
+              "response": {
+                "$ref": "ListServiceRolloutsResponse"
+              },
+              "parameterOrder": [
+                "serviceName"
+              ],
+              "parameters": {
+                "serviceName": {
+                  "location": "path",
+                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
+                  "required": true,
+                  "type": "string"
+                },
+                "pageToken": {
+                  "location": "query",
+                  "description": "The token of the page to retrieve.",
+                  "type": "string"
+                },
+                "pageSize": {
+                  "location": "query",
+                  "description": "The max number of items to include in the response list.",
+                  "format": "int32",
+                  "type": "integer"
+                }
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/service.management",
+                "https://www.googleapis.com/auth/service.management.readonly"
+              ]
+            },
+            "get": {
+              "description": "Gets a service configuration rollout.",
+              "httpMethod": "GET",
+              "parameterOrder": [
+                "serviceName",
+                "rolloutId"
+              ],
+              "response": {
+                "$ref": "Rollout"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/cloud-platform.read-only",
+                "https://www.googleapis.com/auth/service.management",
+                "https://www.googleapis.com/auth/service.management.readonly"
+              ],
+              "parameters": {
+                "serviceName": {
+                  "required": true,
+                  "type": "string",
+                  "location": "path",
+                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`."
+                },
+                "rolloutId": {
+                  "location": "path",
+                  "description": "The id of the rollout resource.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1/services/{serviceName}/rollouts/{rolloutId}",
+              "id": "servicemanagement.services.rollouts.get",
+              "path": "v1/services/{serviceName}/rollouts/{rolloutId}"
+            },
+            "create": {
+              "httpMethod": "POST",
+              "parameterOrder": [
+                "serviceName"
+              ],
+              "response": {
+                "$ref": "Operation"
+              },
+              "scopes": [
+                "https://www.googleapis.com/auth/cloud-platform",
+                "https://www.googleapis.com/auth/service.management"
+              ],
+              "parameters": {
+                "serviceName": {
+                  "location": "path",
+                  "description": "The name of the service.  See the [overview](/service-management/overview)\nfor naming requirements.  For example: `example.googleapis.com`.",
+                  "required": true,
+                  "type": "string"
+                }
+              },
+              "flatPath": "v1/services/{serviceName}/rollouts",
+              "id": "servicemanagement.services.rollouts.create",
+              "path": "v1/services/{serviceName}/rollouts",
+              "description": "Creates a new service configuration rollout. Based on rollout, the\nGoogle Service Management will roll out the service configurations to\ndifferent backend services. For example, the logging configuration will be\npushed to Google Cloud Logging.\n\nPlease note that any previous pending and running Rollouts and associated\nOperations will be automatically cancelled so that the latest Rollout will\nnot be blocked by previous Rollouts.\n\nOperation\u003cresponse: Rollout\u003e",
+              "request": {
+                "$ref": "Rollout"
+              }
+            }
+          }
+        }
+      }
+    },
+    "operations": {
+      "methods": {
+        "get": {
+          "httpMethod": "GET",
+          "parameterOrder": [
+            "name"
+          ],
+          "response": {
+            "$ref": "Operation"
+          },
+          "scopes": [
+            "https://www.googleapis.com/auth/cloud-platform",
+            "https://www.googleapis.com/auth/service.management"
+          ],
+          "parameters": {
+            "name": {
+              "pattern": "^operations/.+$",
+              "location": "path",
+              "description": "The name of the operation resource.",
+              "required": true,
+              "type": "string"
+            }
+          },
+          "flatPath": "v1/operations/{operationsId}",
+          "id": "servicemanagement.operations.get",
+          "path": "v1/{+name}",
+          "description": "Gets the latest state of a long-running operation.  Clients can use this\nmethod to poll the operation result at intervals as recommended by the API\nservice."
         }
       }
     }
   },
+  "parameters": {
+    "key": {
+      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+      "type": "string",
+      "location": "query"
+    },
+    "access_token": {
+      "location": "query",
+      "description": "OAuth access token.",
+      "type": "string"
+    },
+    "quotaUser": {
+      "location": "query",
+      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
+      "type": "string"
+    },
+    "pp": {
+      "type": "boolean",
+      "default": "true",
+      "location": "query",
+      "description": "Pretty-print response."
+    },
+    "bearer_token": {
+      "location": "query",
+      "description": "OAuth bearer token.",
+      "type": "string"
+    },
+    "oauth_token": {
+      "description": "OAuth 2.0 token for the current user.",
+      "type": "string",
+      "location": "query"
+    },
+    "upload_protocol": {
+      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
+      "type": "string",
+      "location": "query"
+    },
+    "prettyPrint": {
+      "description": "Returns response with indentations and line breaks.",
+      "type": "boolean",
+      "default": "true",
+      "location": "query"
+    },
+    "uploadType": {
+      "location": "query",
+      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
+      "type": "string"
+    },
+    "fields": {
+      "location": "query",
+      "description": "Selector specifying which fields to include in a partial response.",
+      "type": "string"
+    },
+    "$.xgafv": {
+      "enumDescriptions": [
+        "v1 error format",
+        "v2 error format"
+      ],
+      "location": "query",
+      "enum": [
+        "1",
+        "2"
+      ],
+      "description": "V1 error format.",
+      "type": "string"
+    },
+    "callback": {
+      "description": "JSONP",
+      "type": "string",
+      "location": "query"
+    },
+    "alt": {
+      "enum": [
+        "json",
+        "media",
+        "proto"
+      ],
+      "type": "string",
+      "enumDescriptions": [
+        "Responses with Content-Type of application/json",
+        "Media download with context-dependent Content-Type",
+        "Responses with Content-Type of application/x-protobuf"
+      ],
+      "location": "query",
+      "description": "Data format for response.",
+      "default": "json"
+    }
+  },
   "schemas": {
-    "Api": {
-      "description": "Api is a light-weight descriptor for a protocol buffer service.",
-      "type": "object",
-      "properties": {
-        "methods": {
-          "description": "The methods of this api, in unspecified order.",
-          "type": "array",
-          "items": {
-            "$ref": "Method"
-          }
-        },
-        "options": {
-          "description": "Any metadata attached to the API.",
-          "type": "array",
-          "items": {
-            "$ref": "Option"
-          }
-        },
-        "sourceContext": {
-          "description": "Source context for the protocol buffer service represented by this\nmessage.",
-          "$ref": "SourceContext"
-        },
-        "name": {
-          "description": "The fully qualified name of this api, including package name\nfollowed by the api's simple name.",
-          "type": "string"
-        },
-        "syntax": {
-          "description": "The source syntax of the service.",
-          "enum": [
-            "SYNTAX_PROTO2",
-            "SYNTAX_PROTO3"
-          ],
-          "enumDescriptions": [
-            "Syntax `proto2`.",
-            "Syntax `proto3`."
-          ],
-          "type": "string"
-        },
-        "version": {
-          "description": "A version string for this api. If specified, must have the form\n`major-version.minor-version`, as in `1.10`. If the minor version\nis omitted, it defaults to zero. If the entire version field is\nempty, the major version is derived from the package name, as\noutlined below. If the field is not empty, the version in the\npackage name will be verified to be consistent with what is\nprovided here.\n\nThe versioning schema uses [semantic\nversioning](http://semver.org) where the major version number\nindicates a breaking change and the minor version an additive,\nnon-breaking change. Both version numbers are signals to users\nwhat to expect from different versions, and should be carefully\nchosen based on the product plan.\n\nThe major version is also reflected in the package name of the\nAPI, which must end in `v\u003cmajor-version\u003e`, as in\n`google.feature.v1`. For major versions 0 and 1, the suffix can\nbe omitted. Zero major versions must only be used for\nexperimental, none-GA apis.\n",
-          "type": "string"
-        },
-        "mixins": {
-          "description": "Included APIs. See Mixin.",
-          "type": "array",
-          "items": {
-            "$ref": "Mixin"
-          }
-        }
-      },
-      "id": "Api"
-    },
-    "SystemParameterRule": {
-      "description": "Define a system parameter rule mapping system parameter definitions to\nmethods.",
-      "type": "object",
-      "properties": {
-        "parameters": {
-          "description": "Define parameters. Multiple names may be defined for a parameter.\nFor a given method call, only one of them should be used. If multiple\nnames are used the behavior is implementation-dependent.\nIf none of the specified names are present the behavior is\nparameter-dependent.",
-          "type": "array",
-          "items": {
-            "$ref": "SystemParameter"
-          }
-        },
-        "selector": {
-          "description": "Selects the methods to which this rule applies. Use '*' to indicate all\nmethods in all APIs.\n\nRefer to selector for syntax details.",
-          "type": "string"
-        }
-      },
-      "id": "SystemParameterRule"
-    },
-    "Diagnostic": {
-      "description": "Represents a diagnostic message (error or warning)",
-      "type": "object",
-      "properties": {
-        "location": {
-          "description": "File name and line number of the error or warning.",
-          "type": "string"
-        },
-        "kind": {
-          "description": "The kind of diagnostic information provided.",
-          "enum": [
-            "WARNING",
-            "ERROR"
-          ],
-          "enumDescriptions": [
-            "Warnings and errors",
-            "Only errors"
-          ],
-          "type": "string"
-        },
-        "message": {
-          "description": "Message describing the error or warning.",
-          "type": "string"
-        }
-      },
-      "id": "Diagnostic"
-    },
-    "ChangeReport": {
-      "description": "Change report associated with a particular service configuration.\n\nIt contains a list of ConfigChanges based on the comparison between\ntwo service configurations.",
-      "type": "object",
-      "properties": {
-        "configChanges": {
-          "description": "List of changes between two service configurations.\nThe changes will be alphabetically sorted based on the identifier\nof each change.\nA ConfigChange identifier is a dot separated path to the configuration.\nExample: visibility.rules[selector='LibraryService.CreateBook'].restriction",
-          "type": "array",
-          "items": {
-            "$ref": "ConfigChange"
-          }
-        }
-      },
-      "id": "ChangeReport"
-    },
-    "MonitoredResourceDescriptor": {
-      "description": "An object that describes the schema of a MonitoredResource object using a\ntype name and a set of labels.  For example, the monitored resource\ndescriptor for Google Compute Engine VM instances has a type of\n`\"gce_instance\"` and specifies the use of the labels `\"instance_id\"` and\n`\"zone\"` to identify particular VM instances.\n\nDifferent APIs can support different monitored resource types. APIs generally\nprovide a `list` method that returns the monitored resource descriptors used\nby the API.",
-      "type": "object",
-      "properties": {
-        "displayName": {
-          "description": "Optional. A concise name for the monitored resource type that might be\ndisplayed in user interfaces. It should be a Title Cased Noun Phrase,\nwithout any article or other determiners. For example,\n`\"Google Cloud SQL Database\"`.",
-          "type": "string"
-        },
-        "description": {
-          "description": "Optional. A detailed description of the monitored resource type that might\nbe used in documentation.",
-          "type": "string"
-        },
-        "labels": {
-          "description": "Required. A set of labels used to describe instances of this monitored\nresource type. For example, an individual Google Cloud SQL database is\nidentified by values for the labels `\"database_id\"` and `\"zone\"`.",
-          "type": "array",
-          "items": {
-            "$ref": "LabelDescriptor"
-          }
-        },
-        "type": {
-          "description": "Required. The monitored resource type. For example, the type\n`\"cloudsql_database\"` represents databases in Google Cloud SQL.\nThe maximum length of this value is 256 characters.",
-          "type": "string"
-        },
-        "name": {
-          "description": "Optional. The resource name of the monitored resource descriptor:\n`\"projects/{project_id}/monitoredResourceDescriptors/{type}\"` where\n{type} is the value of the `type` field in this object and\n{project_id} is a project ID that provides API-specific context for\naccessing the type.  APIs that do not use project information can use the\nresource name format `\"monitoredResourceDescriptors/{type}\"`.",
-          "type": "string"
-        }
-      },
-      "id": "MonitoredResourceDescriptor"
-    },
-    "LogConfig": {
-      "description": "Specifies what kind of log the caller must write\nIncrement a streamz counter with the specified metric and field names.\n\nMetric names should start with a '/', generally be lowercase-only,\nand end in \"_count\". Field names should not contain an initial slash.\nThe actual exported metric names will have \"/iam/policy\" prepended.\n\nField names correspond to IAM request parameters and field values are\ntheir respective values.\n\nAt present the only supported field names are\n   - \"iam_principal\", corresponding to IAMContext.principal;\n   - \"\" (empty string), resulting in one aggretated counter with no field.\n\nExamples:\n  counter { metric: \"/debug_access_count\"  field: \"iam_principal\" }\n  ==\u003e increment counter /iam/policy/backend_debug_access_count\n                        {iam_principal=[value of IAMContext.principal]}\n\nAt this time we do not support:\n* multiple field names (though this may be supported in the future)\n* decrementing the counter\n* incrementing it by anything other than 1",
-      "type": "object",
-      "properties": {
-        "dataAccess": {
-          "description": "Data access options.",
-          "$ref": "DataAccessOptions"
-        },
-        "counter": {
-          "description": "Counter options.",
-          "$ref": "CounterOptions"
-        },
-        "cloudAudit": {
-          "description": "Cloud audit options.",
-          "$ref": "CloudAuditOptions"
-        }
-      },
-      "id": "LogConfig"
-    },
-    "Mixin": {
-      "description": "Declares an API to be included in this API. The including API must\nredeclare all the methods from the included API, but documentation\nand options are inherited as follows:\n\n- If after comment and whitespace stripping, the documentation\n  string of the redeclared method is empty, it will be inherited\n  from the original method.\n\n- Each annotation belonging to the service config (http,\n  visibility) which is not set in the redeclared method will be\n  inherited.\n\n- If an http annotation is inherited, the path pattern will be\n  modified as follows. Any version prefix will be replaced by the\n  version of the including API plus the root path if specified.\n\nExample of a simple mixin:\n\n    package google.acl.v1;\n    service AccessControl {\n      // Get the underlying ACL object.\n      rpc GetAcl(GetAclRequest) returns (Acl) {\n        option (google.api.http).get = \"/v1/{resource=**}:getAcl\";\n      }\n    }\n\n    package google.storage.v2;\n    service Storage {\n      //       rpc GetAcl(GetAclRequest) returns (Acl);\n\n      // Get a data record.\n      rpc GetData(GetDataRequest) returns (Data) {\n        option (google.api.http).get = \"/v2/{resource=**}\";\n      }\n    }\n\nExample of a mixin configuration:\n\n    apis:\n    - name: google.storage.v2.Storage\n      mixins:\n      - name: google.acl.v1.AccessControl\n\nThe mixin construct implies that all methods in `AccessControl` are\nalso declared with same name and request/response types in\n`Storage`. A documentation generator or annotation processor will\nsee the effective `Storage.GetAcl` method after inherting\ndocumentation and annotations as follows:\n\n    service Storage {\n      // Get the underlying ACL object.\n      rpc GetAcl(GetAclRequest) returns (Acl) {\n        option (google.api.http).get = \"/v2/{resource=**}:getAcl\";\n      }\n      ...\n    }\n\nNote how the version in the path pattern changed from `v1` to `v2`.\n\nIf the `root` field in the mixin is specified, it should be a\nrelative path under which inherited HTTP paths are placed. Example:\n\n    apis:\n    - name: google.storage.v2.Storage\n      mixins:\n      - name: google.acl.v1.AccessControl\n        root: acls\n\nThis implies the following inherited HTTP annotation:\n\n    service Storage {\n      // Get the underlying ACL object.\n      rpc GetAcl(GetAclRequest) returns (Acl) {\n        option (google.api.http).get = \"/v2/acls/{resource=**}:getAcl\";\n      }\n      ...\n    }",
-      "type": "object",
-      "properties": {
-        "root": {
-          "description": "If non-empty specifies a path under which inherited HTTP paths\nare rooted.",
-          "type": "string"
-        },
-        "name": {
-          "description": "The fully qualified name of the API which is included.",
-          "type": "string"
-        }
-      },
-      "id": "Mixin"
-    },
-    "Service": {
-      "description": "`Service` is the root object of Google service configuration schema. It\ndescribes basic information about a service, such as the name and the\ntitle, and delegates other aspects to sub-sections. Each sub-section is\neither a proto message or a repeated proto message that configures a\nspecific aspect, such as auth. See each proto message definition for details.\n\nExample:\n\n    type: google.api.Service\n    config_version: 3\n    name: calendar.googleapis.com\n    title: Google Calendar API\n    apis:\n    - name: google.calendar.v3.Calendar\n    authentication:\n      providers:\n      - id: google_calendar_auth\n        jwks_uri: https://www.googleapis.com/oauth2/v1/certs\n        issuer: https://securetoken.google.com\n      rules:\n      - selector: \"*\"\n        requirements:\n          provider_id: google_calendar_auth",
+    "GenerateConfigReportResponse": {
+      "description": "Response message for GenerateConfigReport method.",
       "type": "object",
       "properties": {
         "id": {
-          "description": "A unique ID for a specific instance of this message, typically assigned\nby the client for tracking purpose. If empty, the server may choose to\ngenerate one instead.",
-          "type": "string"
-        },
-        "enums": {
-          "description": "A list of all enum types included in this API service.  Enums\nreferenced directly or indirectly by the `apis` are automatically\nincluded.  Enums which are not referenced but shall be included\nshould be listed here by name. Example:\n\n    enums:\n    - name: google.someapi.v1.SomeEnum",
-          "type": "array",
-          "items": {
-            "$ref": "Enum"
-          }
-        },
-        "usage": {
-          "description": "Configuration controlling usage of this service.",
-          "$ref": "Usage"
-        },
-        "control": {
-          "description": "Configuration for the service control plane.",
-          "$ref": "Control"
-        },
-        "title": {
-          "description": "The product title associated with this service.",
-          "type": "string"
-        },
-        "http": {
-          "description": "HTTP configuration.",
-          "$ref": "Http"
-        },
-        "systemTypes": {
-          "description": "A list of all proto message types included in this API service.\nIt serves similar purpose as [google.api.Service.types], except that\nthese types are not needed by user-defined APIs. Therefore, they will not\nshow up in the generated discovery doc. This field should only be used\nto define system APIs in ESF.",
-          "type": "array",
-          "items": {
-            "$ref": "Type"
-          }
-        },
-        "configVersion": {
-          "description": "The version of the service configuration. The config version may\ninfluence interpretation of the configuration, for example, to\ndetermine defaults. This is documented together with applicable\noptions. The current default for the config version itself is `3`.",
-          "type": "integer",
-          "format": "uint32"
-        },
-        "backend": {
-          "description": "API backend configuration.",
-          "$ref": "Backend"
-        },
-        "monitoring": {
-          "description": "Monitoring configuration.",
-          "$ref": "Monitoring"
-        },
-        "visibility": {
-          "description": "API visibility configuration.",
-          "$ref": "Visibility"
-        },
-        "logging": {
-          "description": "Logging configuration.",
-          "$ref": "Logging"
-        },
-        "customError": {
-          "description": "Custom error configuration.",
-          "$ref": "CustomError"
-        },
-        "context": {
-          "description": "Context configuration.",
-          "$ref": "Context"
-        },
-        "apis": {
-          "description": "A list of API interfaces exported by this service. Only the `name` field\nof the google.protobuf.Api needs to be provided by the configuration\nauthor, as the remaining fields will be derived from the IDL during the\nnormalization process. It is an error to specify an API interface here\nwhich cannot be resolved against the associated IDL files.",
-          "type": "array",
-          "items": {
-            "$ref": "Api"
-          }
-        },
-        "metrics": {
-          "description": "Defines the metrics used by this service.",
-          "type": "array",
-          "items": {
-            "$ref": "MetricDescriptor"
-          }
-        },
-        "systemParameters": {
-          "description": "System parameter configuration.",
-          "$ref": "SystemParameters"
-        },
-        "endpoints": {
-          "description": "Configuration for network endpoints.  If this is empty, then an endpoint\nwith the same name as the service is automatically generated to service all\ndefined APIs.",
-          "type": "array",
-          "items": {
-            "$ref": "Endpoint"
-          }
-        },
-        "name": {
-          "description": "The DNS address at which this service is available,\ne.g. `calendar.googleapis.com`.",
-          "type": "string"
-        },
-        "producerProjectId": {
-          "description": "The id of the Google developer project that owns the service.\nMembers of this project can manage the service configuration,\nmanage consumption of the service, etc.",
-          "type": "string"
-        },
-        "documentation": {
-          "description": "Additional API documentation.",
-          "$ref": "Documentation"
-        },
-        "monitoredResources": {
-          "description": "Defines the monitored resources used by this service. This is required\nby the Service.monitoring and Service.logging configurations.",
-          "type": "array",
-          "items": {
-            "$ref": "MonitoredResourceDescriptor"
-          }
-        },
-        "types": {
-          "description": "A list of all proto message types included in this API service.\nTypes referenced directly or indirectly by the `apis` are\nautomatically included.  Messages which are not referenced but\nshall be included, such as types used by the `google.protobuf.Any` type,\nshould be listed here by name. Example:\n\n    types:\n    - name: google.protobuf.Int32",
-          "type": "array",
-          "items": {
-            "$ref": "Type"
-          }
-        },
-        "logs": {
-          "description": "Defines the logs used by this service.",
-          "type": "array",
-          "items": {
-            "$ref": "LogDescriptor"
-          }
-        },
-        "authentication": {
-          "description": "Auth configuration.",
-          "$ref": "Authentication"
-        }
-      },
-      "id": "Service"
-    },
-    "SubmitConfigSourceResponse": {
-      "description": "Response message for SubmitConfigSource method.",
-      "type": "object",
-      "properties": {
-        "serviceConfig": {
-          "description": "The generated service configuration.",
-          "$ref": "Service"
-        }
-      },
-      "id": "SubmitConfigSourceResponse"
-    },
-    "Documentation": {
-      "description": "`Documentation` provides the information for describing a service.\n\nExample:\n\u003cpre\u003e\u003ccode\u003edocumentation:\n  summary: \u003e\n    The Google Calendar API gives access\n    to most calendar features.\n  pages:\n  - name: Overview\n    content: &#40;== include google/foo/overview.md ==&#41;\n  - name: Tutorial\n    content: &#40;== include google/foo/tutorial.md ==&#41;\n    subpages;\n    - name: Java\n      content: &#40;== include google/foo/tutorial_java.md ==&#41;\n  rules:\n  - selector: google.calendar.Calendar.Get\n    description: \u003e\n      ...\n  - selector: google.calendar.Calendar.Put\n    description: \u003e\n      ...\n\u003c/code\u003e\u003c/pre\u003e\nDocumentation is provided in markdown syntax. In addition to\nstandard markdown features, definition lists, tables and fenced\ncode blocks are supported. Section headers can be provided and are\ninterpreted relative to the section nesting of the context where\na documentation fragment is embedded.\n\nDocumentation from the IDL is merged with documentation defined\nvia the config at normalization time, where documentation provided\nby config rules overrides IDL provided.\n\nA number of constructs specific to the API platform are supported\nin documentation text.\n\nIn order to reference a proto element, the following\nnotation can be used:\n\u003cpre\u003e\u003ccode\u003e&#91;fully.qualified.proto.name]&#91;]\u003c/code\u003e\u003c/pre\u003e\nTo override the display text used for the link, this can be used:\n\u003cpre\u003e\u003ccode\u003e&#91;display text]&#91;fully.qualified.proto.name]\u003c/code\u003e\u003c/pre\u003e\nText can be excluded from doc using the following notation:\n\u003cpre\u003e\u003ccode\u003e&#40;-- internal comment --&#41;\u003c/code\u003e\u003c/pre\u003e\nComments can be made conditional using a visibility label. The below\ntext will be only rendered if the `BETA` label is available:\n\u003cpre\u003e\u003ccode\u003e&#40;--BETA: comment for BETA users --&#41;\u003c/code\u003e\u003c/pre\u003e\nA few directives are available in documentation. Note that\ndirectives must appear on a single line to be properly\nidentified. The `include` directive includes a markdown file from\nan external source:\n\u003cpre\u003e\u003ccode\u003e&#40;== include path/to/file ==&#41;\u003c/code\u003e\u003c/pre\u003e\nThe `resource_for` directive marks a message to be the resource of\na collection in REST view. If it is not specified, tools attempt\nto infer the resource from the operations in a collection:\n\u003cpre\u003e\u003ccode\u003e&#40;== resource_for v1.shelves.books ==&#41;\u003c/code\u003e\u003c/pre\u003e\nThe directive `suppress_warning` does not directly affect documentation\nand is documented together with service config validation.",
-      "type": "object",
-      "properties": {
-        "overview": {
-          "description": "Declares a single overview page. For example:\n\u003cpre\u003e\u003ccode\u003edocumentation:\n  summary: ...\n  overview: &#40;== include overview.md ==&#41;\n\u003c/code\u003e\u003c/pre\u003e\nThis is a shortcut for the following declaration (using pages style):\n\u003cpre\u003e\u003ccode\u003edocumentation:\n  summary: ...\n  pages:\n  - name: Overview\n    content: &#40;== include overview.md ==&#41;\n\u003c/code\u003e\u003c/pre\u003e\nNote: you cannot specify both `overview` field and `pages` field.",
-          "type": "string"
-        },
-        "documentationRootUrl": {
-          "description": "The URL to the root of documentation.",
-          "type": "string"
-        },
-        "pages": {
-          "description": "The top level pages for the documentation set.",
-          "type": "array",
-          "items": {
-            "$ref": "Page"
-          }
-        },
-        "summary": {
-          "description": "A short summary of what the service does. Can only be provided by\nplain text.",
-          "type": "string"
-        },
-        "rules": {
-          "description": "A list of documentation rules that apply to individual API elements.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
-          "type": "array",
-          "items": {
-            "$ref": "DocumentationRule"
-          }
-        }
-      },
-      "id": "Documentation"
-    },
-    "Policy": {
-      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
-      "type": "object",
-      "properties": {
-        "auditConfigs": {
-          "description": "Specifies cloud audit logging configuration for this policy.",
-          "type": "array",
-          "items": {
-            "$ref": "AuditConfig"
-          }
-        },
-        "rules": {
-          "description": "If more than one rule is specified, the rules are applied in the following\nmanner:\n- All matching LOG rules are always applied.\n- If any DENY/DENY_WITH_LOG rule matches, permission is denied.\n  Logging will be applied if one or more matching rule requires logging.\n- Otherwise, if any ALLOW/ALLOW_WITH_LOG rule matches, permission is\n  granted.\n  Logging will be applied if one or more matching rule requires logging.\n- Otherwise, if no rule applies, permission is denied.",
-          "type": "array",
-          "items": {
-            "$ref": "Rule"
-          }
-        },
-        "bindings": {
-          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
-          "type": "array",
-          "items": {
-            "$ref": "Binding"
-          }
-        },
-        "etag": {
-          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
           "type": "string",
-          "format": "byte"
+          "description": "ID of the service configuration this report belongs to."
         },
-        "iamOwned": {
-          "type": "boolean"
-        },
-        "version": {
-          "description": "Version of the `Policy`. The default version is 0.",
-          "type": "integer",
-          "format": "int32"
-        }
-      },
-      "id": "Policy"
-    },
-    "OAuthRequirements": {
-      "description": "OAuth scopes are a way to define data and permissions on data. For example,\nthere are scopes defined for \"Read-only access to Google Calendar\" and\n\"Access to Cloud Platform\". Users can consent to a scope for an application,\ngiving it permission to access that data on their behalf.\n\nOAuth scope specifications should be fairly coarse grained; a user will need\nto see and understand the text description of what your scope means.\n\nIn most cases: use one or at most two OAuth scopes for an entire family of\nproducts. If your product has multiple APIs, you should probably be sharing\nthe OAuth scope across all of those APIs.\n\nWhen you need finer grained OAuth consent screens: talk with your product\nmanagement about how developers will use them in practice.\n\nPlease note that even though each of the canonical scopes is enough for a\nrequest to be accepted and passed to the backend, a request can still fail\ndue to the backend requiring additional scopes or permissions.",
-      "type": "object",
-      "properties": {
-        "canonicalScopes": {
-          "description": "The list of publicly documented OAuth scopes that are allowed access. An\nOAuth token containing any of these scopes will be accepted.\n\nExample:\n\n     canonical_scopes: https://www.googleapis.com/auth/calendar,\n                       https://www.googleapis.com/auth/calendar.read",
-          "type": "string"
-        }
-      },
-      "id": "OAuthRequirements"
-    },
-    "ListServicesResponse": {
-      "description": "Response message for `ListServices` method.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "Token that can be passed to `ListServices` to resume a paginated query.",
-          "type": "string"
-        },
-        "services": {
-          "description": "The returned services will only have the name field set.",
+        "diagnostics": {
+          "description": "Errors / Linter warnings associated with the service definition this\nreport\nbelongs to.",
           "type": "array",
           "items": {
-            "$ref": "ManagedService"
+            "$ref": "Diagnostic"
           }
-        }
-      },
-      "id": "ListServicesResponse"
-    },
-    "Step": {
-      "description": "Represents the status of one operation step.",
-      "type": "object",
-      "properties": {
-        "description": {
-          "description": "The short description of the step.",
-          "type": "string"
-        },
-        "status": {
-          "description": "The status code.",
-          "enum": [
-            "STATUS_UNSPECIFIED",
-            "DONE",
-            "NOT_STARTED",
-            "IN_PROGRESS",
-            "FAILED",
-            "CANCELLED"
-          ],
-          "enumDescriptions": [
-            "Unspecifed code.",
-            "The step has completed without errors.",
-            "The step has not started yet.",
-            "The step is in progress.",
-            "The step has completed with errors.",
-            "The step has completed with cancellation."
-          ],
-          "type": "string"
-        }
-      },
-      "id": "Step"
-    },
-    "Context": {
-      "description": "`Context` defines which contexts an API requests.\n\nExample:\n\n    context:\n      rules:\n      - selector: \"*\"\n        requested:\n        - google.rpc.context.ProjectContext\n        - google.rpc.context.OriginContext\n\nThe above specifies that all methods in the API request\n`google.rpc.context.ProjectContext` and\n`google.rpc.context.OriginContext`.\n\nAvailable context types are defined in package\n`google.rpc.context`.",
-      "type": "object",
-      "properties": {
-        "rules": {
-          "description": "A list of RPC context rules that apply to individual API methods.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
-          "type": "array",
-          "items": {
-            "$ref": "ContextRule"
-          }
-        }
-      },
-      "id": "Context"
-    },
-    "Monitoring": {
-      "description": "Monitoring configuration of the service.\n\nThe example below shows how to configure monitored resources and metrics\nfor monitoring. In the example, a monitored resource and two metrics are\ndefined. The `library.googleapis.com/book/returned_count` metric is sent\nto both producer and consumer projects, whereas the\n`library.googleapis.com/book/overdue_count` metric is only sent to the\nconsumer project.\n\n    monitored_resources:\n    - type: library.googleapis.com/branch\n      labels:\n      - key: /city\n        description: The city where the library branch is located in.\n      - key: /name\n        description: The name of the branch.\n    metrics:\n    - name: library.googleapis.com/book/returned_count\n      metric_kind: DELTA\n      value_type: INT64\n      labels:\n      - key: /customer_id\n    - name: library.googleapis.com/book/overdue_count\n      metric_kind: GAUGE\n      value_type: INT64\n      labels:\n      - key: /customer_id\n    monitoring:\n      producer_destinations:\n      - monitored_resource: library.googleapis.com/branch\n        metrics:\n        - library.googleapis.com/book/returned_count\n      consumer_destinations:\n      - monitored_resource: library.googleapis.com/branch\n        metrics:\n        - library.googleapis.com/book/returned_count\n        - library.googleapis.com/book/overdue_count",
-      "type": "object",
-      "properties": {
-        "producerDestinations": {
-          "description": "Monitoring configurations for sending metrics to the producer project.\nThere can be multiple producer destinations, each one must have a\ndifferent monitored resource type. A metric can be used in at most\none producer destination.",
-          "type": "array",
-          "items": {
-            "$ref": "MonitoringDestination"
-          }
-        },
-        "consumerDestinations": {
-          "description": "Monitoring configurations for sending metrics to the consumer project.\nThere can be multiple consumer destinations, each one must have a\ndifferent monitored resource type. A metric can be used in at most\none consumer destination.",
-          "type": "array",
-          "items": {
-            "$ref": "MonitoringDestination"
-          }
-        }
-      },
-      "id": "Monitoring"
-    },
-    "ManagedService": {
-      "description": "The full representation of a Service that is managed by\nGoogle Service Management.",
-      "type": "object",
-      "properties": {
-        "producerProjectId": {
-          "description": "ID of the project that produces and owns this service.",
-          "type": "string"
         },
         "serviceName": {
-          "description": "The name of the service. See the [overview](/service-management/overview)\nfor naming requirements.",
-          "type": "string"
-        }
-      },
-      "id": "ManagedService"
-    },
-    "ConfigFile": {
-      "description": "Generic specification of a source configuration file",
-      "type": "object",
-      "properties": {
-        "filePath": {
-          "description": "The file name of the configuration file (full or relative path).",
+          "description": "Name of the service this report belongs to.",
           "type": "string"
         },
-        "fileType": {
-          "description": "The type of configuration file this represents.",
-          "enum": [
-            "FILE_TYPE_UNSPECIFIED",
-            "SERVICE_CONFIG_YAML",
-            "OPEN_API_JSON",
-            "OPEN_API_YAML",
-            "FILE_DESCRIPTOR_SET_PROTO"
-          ],
-          "enumDescriptions": [
-            "Unknown file type.",
-            "YAML-specification of service.",
-            "OpenAPI specification, serialized in JSON.",
-            "OpenAPI specification, serialized in YAML.",
-            "FileDescriptorSet, generated by protoc.\n\nTo generate, use protoc with imports and source info included.\nFor an example test.proto file, the following command would put the value\nin a new file named out.pb.\n\n$protoc --include_imports --include_source_info test.proto -o out.pb"
-          ],
-          "type": "string"
-        },
-        "fileContents": {
-          "description": "The bytes that constitute the file.",
-          "type": "string",
-          "format": "byte"
-        }
-      },
-      "id": "ConfigFile"
-    },
-    "ListServiceConfigsResponse": {
-      "description": "Response message for ListServiceConfigs method.",
-      "type": "object",
-      "properties": {
-        "nextPageToken": {
-          "description": "The token of the next page of results.",
-          "type": "string"
-        },
-        "serviceConfigs": {
-          "description": "The list of service configuration resources.",
+        "changeReports": {
+          "description": "list of ChangeReport, each corresponding to comparison between two\nservice configurations.",
           "type": "array",
           "items": {
-            "$ref": "Service"
+            "$ref": "ChangeReport"
           }
         }
       },
-      "id": "ListServiceConfigsResponse"
-    },
-    "TrafficPercentStrategy": {
-      "description": "Strategy that specifies how Google Service Control should select\ndifferent\nversions of service configurations based on traffic percentage.\n\nOne example of how to gradually rollout a new service configuration using\nthis\nstrategy:\nDay 1\n\n    Rollout {\n      id: \"example.googleapis.com/rollout_20160206\"\n      traffic_percent_strategy {\n        percentages: {\n          \"example.googleapis.com/20160201\": 70.00\n          \"example.googleapis.com/20160206\": 30.00\n        }\n      }\n    }\n\nDay 2\n\n    Rollout {\n      id: \"example.googleapis.com/rollout_20160207\"\n      traffic_percent_strategy: {\n        percentages: {\n          \"example.googleapis.com/20160206\": 100.00\n        }\n      }\n    }",
-      "type": "object",
-      "properties": {
-        "percentages": {
-          "description": "Maps service configuration IDs to their corresponding traffic percentage.\nKey is the service configuration ID, Value is the traffic percentage\nwhich must be greater than 0.0 and the sum must equal to 100.0.",
-          "additionalProperties": {
-            "type": "number",
-            "format": "double"
-          },
-          "type": "object"
-        }
-      },
-      "id": "TrafficPercentStrategy"
-    },
-    "GenerateConfigReportRequest": {
-      "description": "Request message for GenerateConfigReport method.",
-      "type": "object",
-      "properties": {
-        "oldConfig": {
-          "description": "Service configuration against which the comparison will be done.\nFor this version of API, the supported types are\ngoogle.api.servicemanagement.v1.ConfigRef,\ngoogle.api.servicemanagement.v1.ConfigSource,\nand google.api.Service",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        },
-        "newConfig": {
-          "description": "Service configuration for which we want to generate the report.\nFor this version of API, the supported types are\ngoogle.api.servicemanagement.v1.ConfigRef,\ngoogle.api.servicemanagement.v1.ConfigSource,\nand google.api.Service",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        }
-      },
-      "id": "GenerateConfigReportRequest"
-    },
-    "GetIamPolicyRequest": {
-      "description": "Request message for `GetIamPolicy` method.",
-      "type": "object",
-      "properties": {},
-      "id": "GetIamPolicyRequest"
-    },
-    "LoggingDestination": {
-      "description": "Configuration of a specific logging destination (the producer project\nor the consumer project).",
-      "type": "object",
-      "properties": {
-        "monitoredResource": {
-          "description": "The monitored resource type. The type must be defined in the\nService.monitored_resources section.",
-          "type": "string"
-        },
-        "logs": {
-          "description": "Names of the logs to be sent to this destination. Each name must\nbe defined in the Service.logs section. If the log name is\nnot a domain scoped name, it will be automatically prefixed with\nthe service name followed by \"/\".",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "LoggingDestination"
-    },
-    "Authentication": {
-      "description": "`Authentication` defines the authentication configuration for an API.\n\nExample for an API targeted for external use:\n\n    name: calendar.googleapis.com\n    authentication:\n      providers:\n      - id: google_calendar_auth\n        jwks_uri: https://www.googleapis.com/oauth2/v1/certs\n        issuer: https://securetoken.google.com\n      rules:\n      - selector: \"*\"\n        requirements:\n          provider_id: google_calendar_auth",
-      "type": "object",
-      "properties": {
-        "providers": {
-          "description": "Defines a set of authentication providers that a service supports.",
-          "type": "array",
-          "items": {
-            "$ref": "AuthProvider"
-          }
-        },
-        "rules": {
-          "description": "A list of authentication rules that apply to individual API methods.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
-          "type": "array",
-          "items": {
-            "$ref": "AuthenticationRule"
-          }
-        }
-      },
-      "id": "Authentication"
+      "id": "GenerateConfigReportResponse"
     },
     "Type": {
       "description": "A protocol buffer message type.",
       "type": "object",
       "properties": {
-        "oneofs": {
-          "description": "The list of types appearing in `oneof` definitions in this type.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
         "options": {
-          "description": "The protocol buffer options.",
           "type": "array",
           "items": {
             "$ref": "Option"
-          }
-        },
-        "sourceContext": {
-          "description": "The source context.",
-          "$ref": "SourceContext"
+          },
+          "description": "The protocol buffer options."
         },
         "fields": {
           "description": "The list of fields.",
@@ -1296,34 +746,49 @@
           "description": "The fully qualified message name.",
           "type": "string"
         },
+        "oneofs": {
+          "description": "The list of types appearing in `oneof` definitions in this type.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "sourceContext": {
+          "description": "The source context.",
+          "$ref": "SourceContext"
+        },
         "syntax": {
-          "description": "The source syntax.",
           "enum": [
             "SYNTAX_PROTO2",
             "SYNTAX_PROTO3"
           ],
+          "description": "The source syntax.",
+          "type": "string",
           "enumDescriptions": [
             "Syntax `proto2`.",
             "Syntax `proto3`."
-          ],
-          "type": "string"
+          ]
         }
       },
       "id": "Type"
     },
-    "Backend": {
-      "description": "`Backend` defines the backend configuration for a service.",
+    "ListServiceConfigsResponse": {
+      "description": "Response message for ListServiceConfigs method.",
       "type": "object",
       "properties": {
-        "rules": {
-          "description": "A list of API backend rules that apply to individual API methods.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
+        "serviceConfigs": {
           "type": "array",
           "items": {
-            "$ref": "BackendRule"
-          }
+            "$ref": "Service"
+          },
+          "description": "The list of service configuration resources."
+        },
+        "nextPageToken": {
+          "type": "string",
+          "description": "The token of the next page of results."
         }
       },
-      "id": "Backend"
+      "id": "ListServiceConfigsResponse"
     },
     "AuditConfig": {
       "description": "Specifies the audit configuration for a service.\nIt consists of which permission types are logged, and what identities, if\nany, are exempted from logging.\nAn AuditConifg must have one or more AuditLogConfigs.",
@@ -1350,287 +815,109 @@
       },
       "id": "AuditConfig"
     },
-    "ListServiceRolloutsResponse": {
-      "description": "Response message for ListServiceRollouts method.",
+    "Backend": {
       "type": "object",
       "properties": {
-        "rollouts": {
-          "description": "The list of rollout resources.",
+        "rules": {
+          "description": "A list of API backend rules that apply to individual API methods.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
           "type": "array",
           "items": {
-            "$ref": "Rollout"
+            "$ref": "BackendRule"
           }
-        },
-        "nextPageToken": {
-          "description": "The token of the next page of results.",
-          "type": "string"
         }
       },
-      "id": "ListServiceRolloutsResponse"
+      "id": "Backend",
+      "description": "`Backend` defines the backend configuration for a service."
     },
-    "Rollout": {
-      "description": "A rollout resource that defines how service configuration versions are pushed\nto control plane systems. Typically, you create a new version of the\nservice config, and then create a Rollout to push the service config.",
+    "SubmitConfigSourceRequest": {
+      "description": "Request message for SubmitConfigSource method.",
       "type": "object",
       "properties": {
-        "createdBy": {
-          "description": "The user who created the Rollout. Readonly.",
-          "type": "string"
+        "configSource": {
+          "$ref": "ConfigSource",
+          "description": "The source configuration for the service."
         },
-        "trafficPercentStrategy": {
-          "description": "Google Service Control selects service configurations based on\ntraffic percentage.",
-          "$ref": "TrafficPercentStrategy"
-        },
-        "status": {
-          "description": "The status of this rollout. Readonly. In case of a failed rollout,\nthe system will automatically rollback to the current Rollout\nversion. Readonly.",
-          "enum": [
-            "ROLLOUT_STATUS_UNSPECIFIED",
-            "IN_PROGRESS",
-            "SUCCESS",
-            "CANCELLED",
-            "FAILED",
-            "PENDING"
-          ],
-          "enumDescriptions": [
-            "No status specified.",
-            "The Rollout is in progress.",
-            "The Rollout has completed successfully.",
-            "The Rollout has been cancelled. This can happen if you have overlapping\nRollout pushes, and the previous ones will be cancelled.",
-            "The Rollout has failed. It is typically caused by configuration errors.",
-            "The Rollout has not started yet and is pending for execution."
-          ],
-          "type": "string"
-        },
-        "deleteServiceStrategy": {
-          "description": "The strategy associated with a rollout to delete a `ManagedService`.\nReadonly.",
-          "$ref": "DeleteServiceStrategy"
-        },
-        "createTime": {
-          "description": "Creation time of the rollout. Readonly.",
-          "type": "string",
-          "format": "google-datetime"
-        },
-        "serviceName": {
-          "description": "The name of the service associated with this Rollout.",
-          "type": "string"
-        },
-        "rolloutId": {
-          "description": "Optional unique identifier of this Rollout. Only lower case letters, digits\n and '-' are allowed.\n\nIf not specified by client, the server will generate one. The generated id\nwill have the form of \u003cdate\u003e\u003crevision number\u003e, where \"date\" is the create\ndate in ISO 8601 format.  \"revision number\" is a monotonically increasing\npositive number that is reset every day for each service.\nAn example of the generated rollout_id is '2016-02-16r1'",
-          "type": "string"
-        }
-      },
-      "id": "Rollout"
-    },
-    "ConfigSource": {
-      "description": "Represents a source file which is used to generate the service configuration\ndefined by `google.api.Service`.",
-      "type": "object",
-      "properties": {
-        "files": {
-          "description": "Set of source configuration files that are used to generate a service\nconfiguration (`google.api.Service`).",
-          "type": "array",
-          "items": {
-            "$ref": "ConfigFile"
-          }
-        },
-        "id": {
-          "description": "A unique ID for a specific instance of this message, typically assigned\nby the client for tracking purpose. If empty, the server may choose to\ngenerate one instead.",
-          "type": "string"
-        }
-      },
-      "id": "ConfigSource"
-    },
-    "Method": {
-      "description": "Method represents a method of an api.",
-      "type": "object",
-      "properties": {
-        "requestStreaming": {
-          "description": "If true, the request is streamed.",
-          "type": "boolean"
-        },
-        "options": {
-          "description": "Any metadata attached to the method.",
-          "type": "array",
-          "items": {
-            "$ref": "Option"
-          }
-        },
-        "requestTypeUrl": {
-          "description": "A URL of the input message type.",
-          "type": "string"
-        },
-        "name": {
-          "description": "The simple name of this method.",
-          "type": "string"
-        },
-        "syntax": {
-          "description": "The source syntax of this method.",
-          "enum": [
-            "SYNTAX_PROTO2",
-            "SYNTAX_PROTO3"
-          ],
-          "enumDescriptions": [
-            "Syntax `proto2`.",
-            "Syntax `proto3`."
-          ],
-          "type": "string"
-        },
-        "responseTypeUrl": {
-          "description": "The URL of the output message type.",
-          "type": "string"
-        },
-        "responseStreaming": {
-          "description": "If true, the response is streamed.",
+        "validateOnly": {
+          "description": "Optional. If set, this will result in the generation of a\n`google.api.Service` configuration based on the `ConfigSource` provided,\nbut the generated config and the sources will NOT be persisted.",
           "type": "boolean"
         }
       },
-      "id": "Method"
+      "id": "SubmitConfigSourceRequest"
     },
-    "Operation": {
-      "description": "This resource represents a long-running operation that is the result of a\nnetwork API call.",
+    "DocumentationRule": {
+      "description": "A documentation rule provides information about individual API elements.",
       "type": "object",
       "properties": {
-        "error": {
-          "description": "The error result of the operation in case of failure or cancellation.",
-          "$ref": "Status"
-        },
-        "done": {
-          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
-          "type": "boolean"
-        },
-        "metadata": {
-          "description": "Service-specific metadata associated with the operation.  It typically\ncontains progress information and common metadata such as create time.\nSome services might not provide such metadata.  Any method that returns a\nlong-running operation should document the metadata type, if any.",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        },
-        "response": {
-          "description": "The normal response of the operation in case of success.  If the original\nmethod returns no data on success, such as `Delete`, the response is\n`google.protobuf.Empty`.  If the original method is standard\n`Get`/`Create`/`Update`, the response should be the resource.  For other\nmethods, the response should have the type `XxxResponse`, where `Xxx`\nis the original method name.  For example, if the original method name\nis `TakeSnapshot()`, the inferred response type is\n`TakeSnapshotResponse`.",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        },
-        "name": {
-          "description": "The server-assigned name, which is only unique within the same service that\noriginally returns it. If you use the default HTTP mapping, the\n`name` should have the format of `operations/some/unique/name`.",
+        "selector": {
+          "description": "The selector is a comma-separated list of patterns. Each pattern is a\nqualified name of the element which may end in \"*\", indicating a wildcard.\nWildcards are only allowed at the end and for a whole component of the\nqualified name, i.e. \"foo.*\" is ok, but not \"foo.b*\" or \"foo.*.bar\". To\nspecify a default for all applicable elements, the whole pattern \"*\"\nis used.",
           "type": "string"
-        }
-      },
-      "id": "Operation"
-    },
-    "Rule": {
-      "description": "A rule to be applied in a Policy.",
-      "type": "object",
-      "properties": {
+        },
         "description": {
-          "description": "Human-readable description of the rule.",
+          "type": "string",
+          "description": "Description of the selected API(s)."
+        },
+        "deprecationDescription": {
+          "description": "Deprecation description of the selected element(s). It can be provided if an\nelement is marked as `deprecated`.",
+          "type": "string"
+        }
+      },
+      "id": "DocumentationRule"
+    },
+    "ContextRule": {
+      "description": "A context rule provides information about the context for an individual API\nelement.",
+      "type": "object",
+      "properties": {
+        "selector": {
+          "description": "Selects the methods to which this rule applies.\n\nRefer to selector for syntax details.",
           "type": "string"
         },
-        "in": {
-          "description": "If one or more 'in' clauses are specified, the rule matches if\nthe PRINCIPAL/AUTHORITY_SELECTOR is in at least one of these entries.",
+        "provided": {
+          "description": "A list of full type names of provided contexts.",
           "type": "array",
           "items": {
             "type": "string"
           }
         },
-        "action": {
-          "description": "Required",
-          "enum": [
-            "NO_ACTION",
-            "ALLOW",
-            "ALLOW_WITH_LOG",
-            "DENY",
-            "DENY_WITH_LOG",
-            "LOG"
-          ],
-          "enumDescriptions": [
-            "Default no action.",
-            "Matching 'Entries' grant access.",
-            "Matching 'Entries' grant access and the caller promises to log\nthe request per the returned log_configs.",
-            "Matching 'Entries' deny access.",
-            "Matching 'Entries' deny access and the caller promises to log\nthe request per the returned log_configs.",
-            "Matching 'Entries' tell IAM.Check callers to generate logs."
-          ],
-          "type": "string"
-        },
-        "conditions": {
-          "description": "Additional restrictions that must be met",
-          "type": "array",
-          "items": {
-            "$ref": "Condition"
-          }
-        },
-        "notIn": {
-          "description": "If one or more 'not_in' clauses are specified, the rule matches\nif the PRINCIPAL/AUTHORITY_SELECTOR is in none of the entries.\nThe format for in and not_in entries is the same as for members in a\nBinding (see google/iam/v1/policy.proto).",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "logConfig": {
-          "description": "The config returned to callers of tech.iam.IAM.CheckPolicy for any entries\nthat match the LOG action.",
-          "type": "array",
-          "items": {
-            "$ref": "LogConfig"
-          }
-        },
-        "permissions": {
-          "description": "A permission is a string of form '\u003cservice\u003e.\u003cresource type\u003e.\u003cverb\u003e'\n(e.g., 'storage.buckets.list'). A value of '*' matches all permissions,\nand a verb part of '*' (e.g., 'storage.buckets.*') matches all verbs.",
+        "requested": {
+          "description": "A list of full type names of requested contexts.",
           "type": "array",
           "items": {
             "type": "string"
           }
         }
       },
-      "id": "Rule"
+      "id": "ContextRule"
+    },
+    "CloudAuditOptions": {
+      "description": "Write a Cloud Audit log",
+      "type": "object",
+      "properties": {},
+      "id": "CloudAuditOptions"
     },
     "MetricDescriptor": {
       "description": "Defines a metric type and its schema. Once a metric descriptor is created,\ndeleting or altering it stops data collection and makes the metric type's\nexisting data unusable.",
       "type": "object",
       "properties": {
-        "description": {
-          "description": "A detailed description of the metric, which can be used in documentation.",
-          "type": "string"
-        },
         "unit": {
           "description": "The unit in which the metric value is reported. It is only applicable\nif the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The\nsupported units are a subset of [The Unified Code for Units of\nMeasure](http://unitsofmeasure.org/ucum.html) standard:\n\n**Basic units (UNIT)**\n\n* `bit`   bit\n* `By`    byte\n* `s`     second\n* `min`   minute\n* `h`     hour\n* `d`     day\n\n**Prefixes (PREFIX)**\n\n* `k`     kilo    (10**3)\n* `M`     mega    (10**6)\n* `G`     giga    (10**9)\n* `T`     tera    (10**12)\n* `P`     peta    (10**15)\n* `E`     exa     (10**18)\n* `Z`     zetta   (10**21)\n* `Y`     yotta   (10**24)\n* `m`     milli   (10**-3)\n* `u`     micro   (10**-6)\n* `n`     nano    (10**-9)\n* `p`     pico    (10**-12)\n* `f`     femto   (10**-15)\n* `a`     atto    (10**-18)\n* `z`     zepto   (10**-21)\n* `y`     yocto   (10**-24)\n* `Ki`    kibi    (2**10)\n* `Mi`    mebi    (2**20)\n* `Gi`    gibi    (2**30)\n* `Ti`    tebi    (2**40)\n\n**Grammar**\n\nThe grammar includes the dimensionless unit `1`, such as `1/s`.\n\nThe grammar also includes these connectors:\n\n* `/`    division (as an infix operator, e.g. `1/s`).\n* `.`    multiplication (as an infix operator, e.g. `GBy.d`)\n\nThe grammar for a unit is as follows:\n\n    Expression = Component { \".\" Component } { \"/\" Component } ;\n\n    Component = [ PREFIX ] UNIT [ Annotation ]\n              | Annotation\n              | \"1\"\n              ;\n\n    Annotation = \"{\" NAME \"}\" ;\n\nNotes:\n\n* `Annotation` is just a comment if it follows a `UNIT` and is\n   equivalent to `1` if it is used alone. For examples,\n   `{requests}/s == 1/s`, `By{transmitted}/s == By/s`.\n* `NAME` is a sequence of non-blank printable ASCII characters not\n   containing '{' or '}'.",
           "type": "string"
         },
         "labels": {
-          "description": "The set of labels that can be used to describe a specific\ninstance of this metric type. For example, the\n`appengine.googleapis.com/http/server/response_latencies` metric\ntype has a label for the HTTP response code, `response_code`, so\nyou can look at latencies for successful responses or just\nfor responses that failed.",
           "type": "array",
           "items": {
             "$ref": "LabelDescriptor"
-          }
+          },
+          "description": "The set of labels that can be used to describe a specific\ninstance of this metric type. For example, the\n`appengine.googleapis.com/http/server/response_latencies` metric\ntype has a label for the HTTP response code, `response_code`, so\nyou can look at latencies for successful responses or just\nfor responses that failed."
         },
-        "metricKind": {
-          "description": "Whether the metric records instantaneous values, changes to a value, etc.\nSome combinations of `metric_kind` and `value_type` might not be supported.",
-          "enum": [
-            "METRIC_KIND_UNSPECIFIED",
-            "GAUGE",
-            "DELTA",
-            "CUMULATIVE"
-          ],
-          "enumDescriptions": [
-            "Do not use this default value.",
-            "An instantaneous measurement of a value.",
-            "The change in a value during a time interval.",
-            "A value accumulated over a time interval.  Cumulative\nmeasurements in a time series should have the same start time\nand increasing end times, until an event resets the cumulative\nvalue to zero and sets a new start time for the following\npoints."
-          ],
+        "name": {
+          "description": "The resource name of the metric descriptor. Depending on the\nimplementation, the name typically includes: (1) the parent resource name\nthat defines the scope of the metric type or of its data; and (2) the\nmetric's URL-encoded type, which also appears in the `type` field of this\ndescriptor. For example, following is the resource name of a custom\nmetric within the GCP project `my-project-id`:\n\n    \"projects/my-project-id/metricDescriptors/custom.googleapis.com%2Finvoice%2Fpaid%2Famount\"",
+          "type": "string"
+        },
+        "type": {
+          "description": "The metric type, including its DNS name prefix. The type is not\nURL-encoded.  All user-defined custom metric types have the DNS name\n`custom.googleapis.com`.  Metric types should use a natural hierarchical\ngrouping. For example:\n\n    \"custom.googleapis.com/invoice/paid/amount\"\n    \"appengine.googleapis.com/http/server/response_latencies\"",
           "type": "string"
         },
         "valueType": {
-          "description": "Whether the measurement is an integer, a floating-point number, etc.\nSome combinations of `metric_kind` and `value_type` might not be supported.",
-          "enum": [
-            "VALUE_TYPE_UNSPECIFIED",
-            "BOOL",
-            "INT64",
-            "DOUBLE",
-            "STRING",
-            "DISTRIBUTION",
-            "MONEY"
-          ],
           "enumDescriptions": [
             "Do not use this default value.",
             "The value is a boolean.\nThis value type can be used only if the metric kind is `GAUGE`.",
@@ -1640,184 +927,73 @@
             "The value is a `Distribution`.",
             "The value is money."
           ],
+          "enum": [
+            "VALUE_TYPE_UNSPECIFIED",
+            "BOOL",
+            "INT64",
+            "DOUBLE",
+            "STRING",
+            "DISTRIBUTION",
+            "MONEY"
+          ],
+          "description": "Whether the measurement is an integer, a floating-point number, etc.\nSome combinations of `metric_kind` and `value_type` might not be supported.",
+          "type": "string"
+        },
+        "metricKind": {
+          "description": "Whether the metric records instantaneous values, changes to a value, etc.\nSome combinations of `metric_kind` and `value_type` might not be supported.",
+          "type": "string",
+          "enumDescriptions": [
+            "Do not use this default value.",
+            "An instantaneous measurement of a value.",
+            "The change in a value during a time interval.",
+            "A value accumulated over a time interval.  Cumulative\nmeasurements in a time series should have the same start time\nand increasing end times, until an event resets the cumulative\nvalue to zero and sets a new start time for the following\npoints."
+          ],
+          "enum": [
+            "METRIC_KIND_UNSPECIFIED",
+            "GAUGE",
+            "DELTA",
+            "CUMULATIVE"
+          ]
+        },
+        "description": {
+          "description": "A detailed description of the metric, which can be used in documentation.",
           "type": "string"
         },
         "displayName": {
-          "description": "A concise name for the metric, which can be displayed in user interfaces.\nUse sentence case without an ending period, for example \"Request count\".",
-          "type": "string"
-        },
-        "name": {
-          "description": "The resource name of the metric descriptor. Depending on the\nimplementation, the name typically includes: (1) the parent resource name\nthat defines the scope of the metric type or of its data; and (2) the\nmetric's URL-encoded type, which also appears in the `type` field of this\ndescriptor. For example, following is the resource name of a custom\nmetric within the GCP project `my-project-id`:\n\n    \"projects/my-project-id/metricDescriptors/custom.googleapis.com%2Finvoice%2Fpaid%2Famount\"",
-          "type": "string"
-        },
-        "type": {
-          "description": "The metric type, including its DNS name prefix. The type is not\nURL-encoded.  All user-defined custom metric types have the DNS name\n`custom.googleapis.com`.  Metric types should use a natural hierarchical\ngrouping. For example:\n\n    \"custom.googleapis.com/invoice/paid/amount\"\n    \"appengine.googleapis.com/http/server/response_latencies\"",
-          "type": "string"
+          "type": "string",
+          "description": "A concise name for the metric, which can be displayed in user interfaces.\nUse sentence case without an ending period, for example \"Request count\"."
         }
       },
       "id": "MetricDescriptor"
     },
-    "EnableServiceRequest": {
-      "description": "Request message for EnableService method.",
+    "SourceContext": {
+      "description": "`SourceContext` represents information about the source of a\nprotobuf element, like the file in which it is defined.",
       "type": "object",
       "properties": {
-        "consumerId": {
-          "description": "The identity of consumer resource which service enablement will be\napplied to.\n\nThe Google Service Management implementation accepts the following\nforms:\n- \"project:\u003cproject_id\u003e\"\n\nNote: this is made compatible with\ngoogle.api.servicecontrol.v1.Operation.consumer_id.",
+        "fileName": {
+          "description": "The path-qualified name of the .proto file that contained the associated\nprotobuf element.  For example: `\"google/protobuf/source_context.proto\"`.",
           "type": "string"
         }
       },
-      "id": "EnableServiceRequest"
+      "id": "SourceContext"
     },
-    "DocumentationRule": {
-      "description": "A documentation rule provides information about individual API elements.",
+    "ListServicesResponse": {
+      "description": "Response message for `ListServices` method.",
       "type": "object",
       "properties": {
-        "description": {
-          "description": "Description of the selected API(s).",
-          "type": "string"
+        "services": {
+          "description": "The returned services will only have the name field set.",
+          "type": "array",
+          "items": {
+            "$ref": "ManagedService"
+          }
         },
-        "deprecationDescription": {
-          "description": "Deprecation description of the selected element(s). It can be provided if an\nelement is marked as `deprecated`.",
-          "type": "string"
-        },
-        "selector": {
-          "description": "The selector is a comma-separated list of patterns. Each pattern is a\nqualified name of the element which may end in \"*\", indicating a wildcard.\nWildcards are only allowed at the end and for a whole component of the\nqualified name, i.e. \"foo.*\" is ok, but not \"foo.b*\" or \"foo.*.bar\". To\nspecify a default for all applicable elements, the whole pattern \"*\"\nis used.",
-          "type": "string"
-        }
-      },
-      "id": "DocumentationRule"
-    },
-    "SetIamPolicyRequest": {
-      "description": "Request message for `SetIamPolicy` method.",
-      "type": "object",
-      "properties": {
-        "updateMask": {
-          "description": "OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only\nthe fields in the mask will be modified. If no mask is provided, a default\nmask is used:\npaths: \"bindings, etag\"\nThis field is only used by Cloud IAM.",
+        "nextPageToken": {
           "type": "string",
-          "format": "google-fieldmask"
-        },
-        "policy": {
-          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them.",
-          "$ref": "Policy"
+          "description": "Token that can be passed to `ListServices` to resume a paginated query."
         }
       },
-      "id": "SetIamPolicyRequest"
-    },
-    "CounterOptions": {
-      "description": "Options for counters",
-      "type": "object",
-      "properties": {
-        "metric": {
-          "description": "The metric to update.",
-          "type": "string"
-        },
-        "field": {
-          "description": "The field value to attribute.",
-          "type": "string"
-        }
-      },
-      "id": "CounterOptions"
-    },
-    "Condition": {
-      "description": "A condition to be met.",
-      "type": "object",
-      "properties": {
-        "sys": {
-          "description": "Trusted attributes supplied by any service that owns resources and uses\nthe IAM system for access control.",
-          "enum": [
-            "NO_ATTR",
-            "REGION",
-            "SERVICE",
-            "NAME",
-            "IP"
-          ],
-          "enumDescriptions": [
-            "Default non-attribute type",
-            "Region of the resource",
-            "Service name",
-            "Resource name",
-            "IP address of the caller"
-          ],
-          "type": "string"
-        },
-        "values": {
-          "description": "The objects of the condition. This is mutually exclusive with 'value'.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "iam": {
-          "description": "Trusted attributes supplied by the IAM system.",
-          "enum": [
-            "NO_ATTR",
-            "AUTHORITY",
-            "ATTRIBUTION"
-          ],
-          "enumDescriptions": [
-            "Default non-attribute.",
-            "Either principal or (if present) authority selector.",
-            "The principal (even if an authority selector is present), which\nmust only be used for attribution, not authorization."
-          ],
-          "type": "string"
-        },
-        "op": {
-          "description": "An operator to apply the subject with.",
-          "enum": [
-            "NO_OP",
-            "EQUALS",
-            "NOT_EQUALS",
-            "IN",
-            "NOT_IN",
-            "DISCHARGED"
-          ],
-          "enumDescriptions": [
-            "Default no-op.",
-            "DEPRECATED. Use IN instead.",
-            "DEPRECATED. Use NOT_IN instead.",
-            "Set-inclusion check.",
-            "Set-exclusion check.",
-            "Subject is discharged"
-          ],
-          "type": "string"
-        },
-        "value": {
-          "description": "DEPRECATED. Use 'values' instead.",
-          "type": "string"
-        },
-        "svc": {
-          "description": "Trusted attributes discharged by the service.",
-          "type": "string"
-        }
-      },
-      "id": "Condition"
-    },
-    "Status": {
-      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
-      "type": "object",
-      "properties": {
-        "code": {
-          "description": "The status code, which should be an enum value of google.rpc.Code.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "details": {
-          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use.",
-          "type": "array",
-          "items": {
-            "additionalProperties": {
-              "description": "Properties of the object. Contains field @type with type URL.",
-              "type": "any"
-            },
-            "type": "object"
-          }
-        },
-        "message": {
-          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
-          "type": "string"
-        }
-      },
-      "id": "Status"
+      "id": "ListServicesResponse"
     },
     "Endpoint": {
       "description": "`Endpoint` describes a network endpoint that serves a set of APIs.\nA service may expose any number of endpoints, and all endpoints share the\nsame service configuration, such as quota configuration and monitoring\nconfiguration.\n\nExample service configuration:\n\n    name: library-example.googleapis.com\n    endpoints:\n      # Below entry makes 'google.example.library.v1.Library'\n      # API be served from endpoint address library-example.googleapis.com.\n      # It also allows HTTP OPTIONS calls to be passed to the backend, for\n      # it to decide whether the subsequent cross-origin request is\n      # allowed to proceed.\n    - name: library-example.googleapis.com\n      allow_cors: true",
@@ -1830,14 +1006,6 @@
             "type": "string"
           }
         },
-        "allowCors": {
-          "description": "Allowing\n[CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing), aka\ncross-domain traffic, would allow the backends served from this endpoint to\nreceive and respond to HTTP OPTIONS requests. The response will be used by\nthe browser to determine whether the subsequent cross-origin request is\nallowed to proceed.",
-          "type": "boolean"
-        },
-        "name": {
-          "description": "The canonical name of this endpoint.",
-          "type": "string"
-        },
         "aliases": {
           "description": "DEPRECATED: This field is no longer supported. Instead of using aliases,\nplease specify multiple google.api.Endpoint for each of the intented\nalias.\n\nAdditional names that this endpoint will be hosted on.",
           "type": "array",
@@ -1846,142 +1014,58 @@
           }
         },
         "features": {
-          "description": "The list of features enabled on this endpoint.",
           "type": "array",
           "items": {
             "type": "string"
-          }
+          },
+          "description": "The list of features enabled on this endpoint."
+        },
+        "allowCors": {
+          "description": "Allowing\n[CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing), aka\ncross-domain traffic, would allow the backends served from this endpoint to\nreceive and respond to HTTP OPTIONS requests. The response will be used by\nthe browser to determine whether the subsequent cross-origin request is\nallowed to proceed.",
+          "type": "boolean"
+        },
+        "name": {
+          "description": "The canonical name of this endpoint.",
+          "type": "string"
         }
       },
       "id": "Endpoint"
     },
-    "Page": {
-      "description": "Represents a documentation page. A page can contain subpages to represent\nnested documentation set structure.",
+    "OAuthRequirements": {
+      "description": "OAuth scopes are a way to define data and permissions on data. For example,\nthere are scopes defined for \"Read-only access to Google Calendar\" and\n\"Access to Cloud Platform\". Users can consent to a scope for an application,\ngiving it permission to access that data on their behalf.\n\nOAuth scope specifications should be fairly coarse grained; a user will need\nto see and understand the text description of what your scope means.\n\nIn most cases: use one or at most two OAuth scopes for an entire family of\nproducts. If your product has multiple APIs, you should probably be sharing\nthe OAuth scope across all of those APIs.\n\nWhen you need finer grained OAuth consent screens: talk with your product\nmanagement about how developers will use them in practice.\n\nPlease note that even though each of the canonical scopes is enough for a\nrequest to be accepted and passed to the backend, a request can still fail\ndue to the backend requiring additional scopes or permissions.",
       "type": "object",
       "properties": {
-        "subpages": {
-          "description": "Subpages of this page. The order of subpages specified here will be\nhonored in the generated docset.",
-          "type": "array",
-          "items": {
-            "$ref": "Page"
-          }
-        },
-        "content": {
-          "description": "The Markdown content of the page. You can use \u003ccode\u003e&#40;== include {path} ==&#41;\u003c/code\u003e\nto include content from a Markdown file.",
-          "type": "string"
-        },
-        "name": {
-          "description": "The name of the page. It will be used as an identity of the page to\ngenerate URI of the page, text of the link to this page in navigation,\netc. The full page name (start from the root page name to this page\nconcatenated with `.`) can be used as reference to the page in your\ndocumentation. For example:\n\u003cpre\u003e\u003ccode\u003epages:\n- name: Tutorial\n  content: &#40;== include tutorial.md ==&#41;\n  subpages:\n  - name: Java\n    content: &#40;== include tutorial_java.md ==&#41;\n\u003c/code\u003e\u003c/pre\u003e\nYou can reference `Java` page using Markdown reference link syntax:\n`Java`.",
+        "canonicalScopes": {
+          "description": "The list of publicly documented OAuth scopes that are allowed access. An\nOAuth token containing any of these scopes will be accepted.\n\nExample:\n\n     canonical_scopes: https://www.googleapis.com/auth/calendar,\n                       https://www.googleapis.com/auth/calendar.read",
           "type": "string"
         }
       },
-      "id": "Page"
+      "id": "OAuthRequirements"
     },
-    "CustomErrorRule": {
-      "description": "A custom error rule.",
+    "Usage": {
+      "description": "Configuration controlling usage of a service.",
       "type": "object",
       "properties": {
-        "isErrorType": {
-          "description": "Mark this message as possible payload in error response.  Otherwise,\nobjects of this type will be filtered when they appear in error payload.",
-          "type": "boolean"
-        },
-        "selector": {
-          "description": "Selects messages to which this rule applies.\n\nRefer to selector for syntax details.",
-          "type": "string"
-        }
-      },
-      "id": "CustomErrorRule"
-    },
-    "Option": {
-      "description": "A protocol buffer option, which can be attached to a message, field,\nenumeration, etc.",
-      "type": "object",
-      "properties": {
-        "value": {
-          "description": "The option's value packed in an Any message. If the value is a primitive,\nthe corresponding wrapper type defined in google/protobuf/wrappers.proto\nshould be used. If the value is an enum, it should be stored as an int32\nvalue using the google.protobuf.Int32Value type.",
-          "additionalProperties": {
-            "description": "Properties of the object. Contains field @type with type URL.",
-            "type": "any"
-          },
-          "type": "object"
-        },
-        "name": {
-          "description": "The option's name. For protobuf built-in options (options defined in\ndescriptor.proto), this is the short name. For example, `\"map_entry\"`.\nFor custom options, it should be the fully-qualified name. For example,\n`\"google.api.http\"`.",
-          "type": "string"
-        }
-      },
-      "id": "Option"
-    },
-    "HttpRule": {
-      "description": "`HttpRule` defines the mapping of an RPC method to one or more HTTP\nREST APIs.  The mapping determines what portions of the request\nmessage are populated from the path, query parameters, or body of\nthe HTTP request.  The mapping is typically specified as an\n`google.api.http` annotation, see \"google/api/annotations.proto\"\nfor details.\n\nThe mapping consists of a field specifying the path template and\nmethod kind.  The path template can refer to fields in the request\nmessage, as in the example below which describes a REST GET\noperation on a resource collection of messages:\n\n\n    service Messaging {\n      rpc GetMessage(GetMessageRequest) returns (Message) {\n        option (google.api.http).get = \"/v1/messages/{message_id}/{sub.subfield}\";\n      }\n    }\n    message GetMessageRequest {\n      message SubMessage {\n        string subfield = 1;\n      }\n      string message_id = 1; // mapped to the URL\n      SubMessage sub = 2;    // `sub.subfield` is url-mapped\n    }\n    message Message {\n      string text = 1; // content of the resource\n    }\n\nThe same http annotation can alternatively be expressed inside the\n`GRPC API Configuration` YAML file.\n\n    http:\n      rules:\n        - selector: \u003cproto_package_name\u003e.Messaging.GetMessage\n          get: /v1/messages/{message_id}/{sub.subfield}\n\nThis definition enables an automatic, bidrectional mapping of HTTP\nJSON to RPC. Example:\n\nHTTP | RPC\n-----|-----\n`GET /v1/messages/123456/foo`  | `GetMessage(message_id: \"123456\" sub: SubMessage(subfield: \"foo\"))`\n\nIn general, not only fields but also field paths can be referenced\nfrom a path pattern. Fields mapped to the path pattern cannot be\nrepeated and must have a primitive (non-message) type.\n\nAny fields in the request message which are not bound by the path\npattern automatically become (optional) HTTP query\nparameters. Assume the following definition of the request message:\n\n\n    message GetMessageRequest {\n      message SubMessage {\n        string subfield = 1;\n      }\n      string message_id = 1; // mapped to the URL\n      int64 revision = 2;    // becomes a parameter\n      SubMessage sub = 3;    // `sub.subfield` becomes a parameter\n    }\n\n\nThis enables a HTTP JSON to RPC mapping as below:\n\nHTTP | RPC\n-----|-----\n`GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: \"123456\" revision: 2 sub: SubMessage(subfield: \"foo\"))`\n\nNote that fields which are mapped to HTTP parameters must have a\nprimitive type or a repeated primitive type. Message types are not\nallowed. In the case of a repeated type, the parameter can be\nrepeated in the URL, as in `...?param=A&param=B`.\n\nFor HTTP method kinds which allow a request body, the `body` field\nspecifies the mapping. Consider a REST update method on the\nmessage resource collection:\n\n\n    service Messaging {\n      rpc UpdateMessage(UpdateMessageRequest) returns (Message) {\n        option (google.api.http) = {\n          put: \"/v1/messages/{message_id}\"\n          body: \"message\"\n        };\n      }\n    }\n    message UpdateMessageRequest {\n      string message_id = 1; // mapped to the URL\n      Message message = 2;   // mapped to the body\n    }\n\n\nThe following HTTP JSON to RPC mapping is enabled, where the\nrepresentation of the JSON in the request body is determined by\nprotos JSON encoding:\n\nHTTP | RPC\n-----|-----\n`PUT /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id: \"123456\" message { text: \"Hi!\" })`\n\nThe special name `*` can be used in the body mapping to define that\nevery field not bound by the path template should be mapped to the\nrequest body.  This enables the following alternative definition of\nthe update method:\n\n    service Messaging {\n      rpc UpdateMessage(Message) returns (Message) {\n        option (google.api.http) = {\n          put: \"/v1/messages/{message_id}\"\n          body: \"*\"\n        };\n      }\n    }\n    message Message {\n      string message_id = 1;\n      string text = 2;\n    }\n\n\nThe following HTTP JSON to RPC mapping is enabled:\n\nHTTP | RPC\n-----|-----\n`PUT /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id: \"123456\" text: \"Hi!\")`\n\nNote that when using `*` in the body mapping, it is not possible to\nhave HTTP parameters, as all fields not bound by the path end in\nthe body. This makes this option more rarely used in practice of\ndefining REST APIs. The common usage of `*` is in custom methods\nwhich don't use the URL at all for transferring data.\n\nIt is possible to define multiple HTTP methods for one RPC by using\nthe `additional_bindings` option. Example:\n\n    service Messaging {\n      rpc GetMessage(GetMessageRequest) returns (Message) {\n        option (google.api.http) = {\n          get: \"/v1/messages/{message_id}\"\n          additional_bindings {\n            get: \"/v1/users/{user_id}/messages/{message_id}\"\n          }\n        };\n      }\n    }\n    message GetMessageRequest {\n      string message_id = 1;\n      string user_id = 2;\n    }\n\n\nThis enables the following two alternative HTTP JSON to RPC\nmappings:\n\nHTTP | RPC\n-----|-----\n`GET /v1/messages/123456` | `GetMessage(message_id: \"123456\")`\n`GET /v1/users/me/messages/123456` | `GetMessage(user_id: \"me\" message_id: \"123456\")`\n\n# Rules for HTTP mapping\n\nThe rules for mapping HTTP path, query parameters, and body fields\nto the request message are as follows:\n\n1. The `body` field specifies either `*` or a field path, or is\n   omitted. If omitted, it assumes there is no HTTP body.\n2. Leaf fields (recursive expansion of nested messages in the\n   request) can be classified into three types:\n    (a) Matched in the URL template.\n    (b) Covered by body (if body is `*`, everything except (a) fields;\n        else everything under the body field)\n    (c) All other fields.\n3. URL query parameters found in the HTTP request are mapped to (c) fields.\n4. Any body sent with an HTTP request can contain only (b) fields.\n\nThe syntax of the path template is as follows:\n\n    Template = \"/\" Segments [ Verb ] ;\n    Segments = Segment { \"/\" Segment } ;\n    Segment  = \"*\" | \"**\" | LITERAL | Variable ;\n    Variable = \"{\" FieldPath [ \"=\" Segments ] \"}\" ;\n    FieldPath = IDENT { \".\" IDENT } ;\n    Verb     = \":\" LITERAL ;\n\nThe syntax `*` matches a single path segment. It follows the semantics of\n[RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String\nExpansion.\n\nThe syntax `**` matches zero or more path segments. It follows the semantics\nof [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.3 Reserved\nExpansion. NOTE: it must be the last segment in the path except the Verb.\n\nThe syntax `LITERAL` matches literal text in the URL path.\n\nThe syntax `Variable` matches the entire path as specified by its template;\nthis nested template must not contain further variables. If a variable\nmatches a single path segment, its template may be omitted, e.g. `{var}`\nis equivalent to `{var=*}`.\n\nNOTE: the field paths in variables and in the `body` must not refer to\nrepeated fields or map fields.\n\nUse CustomHttpPattern to specify any HTTP method that is not included in the\n`pattern` field, such as HEAD, or \"*\" to leave the HTTP method unspecified for\na given URL path rule. The wild-card rule is useful for services that provide\ncontent to Web (HTML) clients.",
-      "type": "object",
-      "properties": {
-        "custom": {
-          "description": "Custom pattern is used for defining custom verbs.",
-          "$ref": "CustomHttpPattern"
-        },
-        "responseBody": {
-          "description": "The name of the response field whose value is mapped to the HTTP body of\nresponse. Other response fields are ignored. This field is optional. When\nnot set, the response message will be used as HTTP body of response.\nNOTE: the referred field must be not a repeated field and must be present\nat the top-level of response message type.",
-          "type": "string"
-        },
-        "additionalBindings": {
-          "description": "Additional HTTP bindings for the selector. Nested bindings must\nnot contain an `additional_bindings` field themselves (that is,\nthe nesting may only be one level deep).",
-          "type": "array",
-          "items": {
-            "$ref": "HttpRule"
-          }
-        },
-        "mediaDownload": {
-          "description": "Do not use this. For media support, add instead\n[][google.bytestream.RestByteStream] as an API to your\nconfiguration.",
-          "$ref": "MediaDownload"
-        },
-        "body": {
-          "description": "The name of the request field whose value is mapped to the HTTP body, or\n`*` for mapping all fields not captured by the path pattern to the HTTP\nbody. NOTE: the referred field must not be a repeated field and must be\npresent at the top-level of request message type.",
-          "type": "string"
-        },
-        "put": {
-          "description": "Used for updating a resource.",
-          "type": "string"
-        },
-        "get": {
-          "description": "Used for listing and getting information about resources.",
-          "type": "string"
-        },
-        "selector": {
-          "description": "Selects methods to which this rule applies.\n\nRefer to selector for syntax details.",
-          "type": "string"
-        },
-        "post": {
-          "description": "Used for creating a resource.",
-          "type": "string"
-        },
-        "patch": {
-          "description": "Used for updating a resource.",
-          "type": "string"
-        },
-        "delete": {
-          "description": "Used for deleting a resource.",
-          "type": "string"
-        },
-        "mediaUpload": {
-          "description": "Do not use this. For media support, add instead\n[][google.bytestream.RestByteStream] as an API to your\nconfiguration.",
-          "$ref": "MediaUpload"
-        }
-      },
-      "id": "HttpRule"
-    },
-    "TestIamPermissionsRequest": {
-      "description": "Request message for `TestIamPermissions` method.",
-      "type": "object",
-      "properties": {
-        "permissions": {
-          "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
+        "requirements": {
+          "description": "Requirements that must be satisfied before a consumer project can use the\nservice. Each requirement is of the form \u003cservice.name\u003e/\u003crequirement-id\u003e;\nfor example 'serviceusage.googleapis.com/billing-enabled'.",
           "type": "array",
           "items": {
             "type": "string"
           }
+        },
+        "producerNotificationChannel": {
+          "description": "The full resource name of a channel used for sending notifications to the\nservice producer.\n\nGoogle Service Management currently only supports\n[Google Cloud Pub/Sub](https://cloud.google.com/pubsub) as a notification\nchannel. To use Google Cloud Pub/Sub as the channel, this must be the name\nof a Cloud Pub/Sub topic that uses the Cloud Pub/Sub topic name format\ndocumented in https://cloud.google.com/pubsub/docs/overview.",
+          "type": "string"
+        },
+        "rules": {
+          "description": "A list of usage rules that apply to individual API methods.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
+          "type": "array",
+          "items": {
+            "$ref": "UsageRule"
+          }
         }
       },
-      "id": "TestIamPermissionsRequest"
+      "id": "Usage"
     },
     "TestIamPermissionsResponse": {
       "description": "Response message for `TestIamPermissions` method.",
@@ -1997,251 +1081,110 @@
       },
       "id": "TestIamPermissionsResponse"
     },
-    "CustomError": {
-      "description": "Customize service error responses.  For example, list any service\nspecific protobuf types that can appear in error detail lists of\nerror responses.\n\nExample:\n\n    custom_error:\n      types:\n      - google.foo.v1.CustomError\n      - google.foo.v1.AnotherError",
-      "type": "object",
-      "properties": {
-        "types": {
-          "description": "The list of custom error detail types, e.g. 'google.foo.v1.CustomError'.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "rules": {
-          "description": "The list of custom error rules that apply to individual API messages.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
-          "type": "array",
-          "items": {
-            "$ref": "CustomErrorRule"
-          }
-        }
-      },
-      "id": "CustomError"
-    },
-    "MediaDownload": {
-      "description": "Do not use this. For media support, add instead\n[][google.bytestream.RestByteStream] as an API to your\nconfiguration.",
-      "type": "object",
-      "properties": {
-        "enabled": {
-          "description": "Whether download is enabled.",
-          "type": "boolean"
-        }
-      },
-      "id": "MediaDownload"
-    },
-    "SubmitConfigSourceRequest": {
-      "description": "Request message for SubmitConfigSource method.",
-      "type": "object",
-      "properties": {
-        "configSource": {
-          "description": "The source configuration for the service.",
-          "$ref": "ConfigSource"
-        },
-        "validateOnly": {
-          "description": "Optional. If set, this will result in the generation of a\n`google.api.Service` configuration based on the `ConfigSource` provided,\nbut the generated config and the sources will NOT be persisted.",
-          "type": "boolean"
-        }
-      },
-      "id": "SubmitConfigSourceRequest"
-    },
-    "AuthenticationRule": {
-      "description": "Authentication rules for the service.\n\nBy default, if a method has any authentication requirements, every request\nmust include a valid credential matching one of the requirements.\nIt's an error to include more than one kind of credential in a single\nrequest.\n\nIf a method doesn't have any auth requirements, request credentials will be\nignored.",
-      "type": "object",
-      "properties": {
-        "oauth": {
-          "description": "The requirements for OAuth credentials.",
-          "$ref": "OAuthRequirements"
-        },
-        "allowWithoutCredential": {
-          "description": "Whether to allow requests without a credential. The credential can be\nan OAuth token, Google cookies (first-party auth) or EndUserCreds.\n\nFor requests without credentials, if the service control environment is\nspecified, each incoming request **must** be associated with a service\nconsumer. This can be done by passing an API key that belongs to a consumer\nproject.",
-          "type": "boolean"
-        },
-        "requirements": {
-          "description": "Requirements for additional authentication providers.",
-          "type": "array",
-          "items": {
-            "$ref": "AuthRequirement"
-          }
-        },
-        "selector": {
-          "description": "Selects the methods to which this rule applies.\n\nRefer to selector for syntax details.",
-          "type": "string"
-        }
-      },
-      "id": "AuthenticationRule"
-    },
-    "Logging": {
-      "description": "Logging configuration of the service.\n\nThe following example shows how to configure logs to be sent to the\nproducer and consumer projects. In the example, the `activity_history`\nlog is sent to both the producer and consumer projects, whereas the\n`purchase_history` log is only sent to the producer project.\n\n    monitored_resources:\n    - type: library.googleapis.com/branch\n      labels:\n      - key: /city\n        description: The city where the library branch is located in.\n      - key: /name\n        description: The name of the branch.\n    logs:\n    - name: activity_history\n      labels:\n      - key: /customer_id\n    - name: purchase_history\n    logging:\n      producer_destinations:\n      - monitored_resource: library.googleapis.com/branch\n        logs:\n        - activity_history\n        - purchase_history\n      consumer_destinations:\n      - monitored_resource: library.googleapis.com/branch\n        logs:\n        - activity_history",
-      "type": "object",
-      "properties": {
-        "producerDestinations": {
-          "description": "Logging configurations for sending logs to the producer project.\nThere can be multiple producer destinations, each one must have a\ndifferent monitored resource type. A log can be used in at most\none producer destination.",
-          "type": "array",
-          "items": {
-            "$ref": "LoggingDestination"
-          }
-        },
-        "consumerDestinations": {
-          "description": "Logging configurations for sending logs to the consumer project.\nThere can be multiple consumer destinations, each one must have a\ndifferent monitored resource type. A log can be used in at most\none consumer destination.",
-          "type": "array",
-          "items": {
-            "$ref": "LoggingDestination"
-          }
-        }
-      },
-      "id": "Logging"
-    },
-    "SystemParameter": {
-      "description": "Define a parameter's name and location. The parameter may be passed as either\nan HTTP header or a URL query parameter, and if both are passed the behavior\nis implementation-dependent.",
-      "type": "object",
-      "properties": {
-        "urlQueryParameter": {
-          "description": "Define the URL query parameter name to use for the parameter. It is case\nsensitive.",
-          "type": "string"
-        },
-        "name": {
-          "description": "Define the name of the parameter, such as \"api_key\" . It is case sensitive.",
-          "type": "string"
-        },
-        "httpHeader": {
-          "description": "Define the HTTP header name to use for the parameter. It is case\ninsensitive.",
-          "type": "string"
-        }
-      },
-      "id": "SystemParameter"
-    },
-    "Enum": {
-      "description": "Enum type definition.",
-      "type": "object",
-      "properties": {
-        "syntax": {
-          "description": "The source syntax.",
-          "enum": [
-            "SYNTAX_PROTO2",
-            "SYNTAX_PROTO3"
-          ],
-          "enumDescriptions": [
-            "Syntax `proto2`.",
-            "Syntax `proto3`."
-          ],
-          "type": "string"
-        },
-        "enumvalue": {
-          "description": "Enum value definitions.",
-          "type": "array",
-          "items": {
-            "$ref": "EnumValue"
-          }
-        },
-        "options": {
-          "description": "Protocol buffer options.",
-          "type": "array",
-          "items": {
-            "$ref": "Option"
-          }
-        },
-        "sourceContext": {
-          "description": "The source context.",
-          "$ref": "SourceContext"
-        },
-        "name": {
-          "description": "Enum type name.",
-          "type": "string"
-        }
-      },
-      "id": "Enum"
-    },
-    "GenerateConfigReportResponse": {
-      "description": "Response message for GenerateConfigReport method.",
-      "type": "object",
-      "properties": {
-        "serviceName": {
-          "description": "Name of the service this report belongs to.",
-          "type": "string"
-        },
-        "id": {
-          "description": "ID of the service configuration this report belongs to.",
-          "type": "string"
-        },
-        "changeReports": {
-          "description": "list of ChangeReport, each corresponding to comparison between two\nservice configurations.",
-          "type": "array",
-          "items": {
-            "$ref": "ChangeReport"
-          }
-        },
-        "diagnostics": {
-          "description": "Errors / Linter warnings associated with the service definition this\nreport\nbelongs to.",
-          "type": "array",
-          "items": {
-            "$ref": "Diagnostic"
-          }
-        }
-      },
-      "id": "GenerateConfigReportResponse"
-    },
-    "DeleteServiceStrategy": {
-      "description": "Strategy used to delete a service. This strategy is a placeholder only\nused by the system generated rollout to delete a service.",
+    "GetIamPolicyRequest": {
+      "description": "Request message for `GetIamPolicy` method.",
       "type": "object",
       "properties": {},
-      "id": "DeleteServiceStrategy"
+      "id": "GetIamPolicyRequest"
     },
-    "OperationMetadata": {
-      "description": "The metadata associated with a long running operation resource.",
+    "Context": {
       "type": "object",
       "properties": {
-        "steps": {
-          "description": "Detailed status information for each step. The order is undetermined.",
+        "rules": {
+          "description": "A list of RPC context rules that apply to individual API methods.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
           "type": "array",
           "items": {
-            "$ref": "Step"
+            "$ref": "ContextRule"
+          }
+        }
+      },
+      "id": "Context",
+      "description": "`Context` defines which contexts an API requests.\n\nExample:\n\n    context:\n      rules:\n      - selector: \"*\"\n        requested:\n        - google.rpc.context.ProjectContext\n        - google.rpc.context.OriginContext\n\nThe above specifies that all methods in the API request\n`google.rpc.context.ProjectContext` and\n`google.rpc.context.OriginContext`.\n\nAvailable context types are defined in package\n`google.rpc.context`."
+    },
+    "Rule": {
+      "description": "A rule to be applied in a Policy.",
+      "type": "object",
+      "properties": {
+        "description": {
+          "description": "Human-readable description of the rule.",
+          "type": "string"
+        },
+        "conditions": {
+          "description": "Additional restrictions that must be met",
+          "type": "array",
+          "items": {
+            "$ref": "Condition"
           }
         },
-        "startTime": {
-          "description": "The start time of the operation.",
-          "type": "string",
-          "format": "google-datetime"
+        "logConfig": {
+          "description": "The config returned to callers of tech.iam.IAM.CheckPolicy for any entries\nthat match the LOG action.",
+          "type": "array",
+          "items": {
+            "$ref": "LogConfig"
+          }
         },
-        "resourceNames": {
-          "description": "The full name of the resources that this operation is directly\nassociated with.",
+        "in": {
+          "type": "array",
+          "items": {
+            "type": "string"
+          },
+          "description": "If one or more 'in' clauses are specified, the rule matches if\nthe PRINCIPAL/AUTHORITY_SELECTOR is in at least one of these entries."
+        },
+        "permissions": {
+          "description": "A permission is a string of form '\u003cservice\u003e.\u003cresource type\u003e.\u003cverb\u003e'\n(e.g., 'storage.buckets.list'). A value of '*' matches all permissions,\nand a verb part of '*' (e.g., 'storage.buckets.*') matches all verbs.",
           "type": "array",
           "items": {
             "type": "string"
           }
         },
-        "progressPercentage": {
-          "description": "Percentage of completion of this operation, ranging from 0 to 100.",
-          "type": "integer",
-          "format": "int32"
-        }
-      },
-      "id": "OperationMetadata"
-    },
-    "DisableServiceRequest": {
-      "description": "Request message for DisableService method.",
-      "type": "object",
-      "properties": {
-        "consumerId": {
-          "description": "The identity of consumer resource which service disablement will be\napplied to.\n\nThe Google Service Management implementation accepts the following\nforms:\n- \"project:\u003cproject_id\u003e\"\n\nNote: this is made compatible with\ngoogle.api.servicecontrol.v1.Operation.consumer_id.",
-          "type": "string"
-        }
-      },
-      "id": "DisableServiceRequest"
-    },
-    "CustomHttpPattern": {
-      "description": "A custom pattern is used for defining custom HTTP verb.",
-      "type": "object",
-      "properties": {
-        "path": {
-          "description": "The path matched by this custom verb.",
+        "action": {
+          "enumDescriptions": [
+            "Default no action.",
+            "Matching 'Entries' grant access.",
+            "Matching 'Entries' grant access and the caller promises to log\nthe request per the returned log_configs.",
+            "Matching 'Entries' deny access.",
+            "Matching 'Entries' deny access and the caller promises to log\nthe request per the returned log_configs.",
+            "Matching 'Entries' tell IAM.Check callers to generate logs."
+          ],
+          "enum": [
+            "NO_ACTION",
+            "ALLOW",
+            "ALLOW_WITH_LOG",
+            "DENY",
+            "DENY_WITH_LOG",
+            "LOG"
+          ],
+          "description": "Required",
           "type": "string"
         },
-        "kind": {
-          "description": "The name of this custom HTTP verb.",
-          "type": "string"
+        "notIn": {
+          "description": "If one or more 'not_in' clauses are specified, the rule matches\nif the PRINCIPAL/AUTHORITY_SELECTOR is in none of the entries.\nThe format for in and not_in entries is the same as for members in a\nBinding (see google/iam/v1/policy.proto).",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
         }
       },
-      "id": "CustomHttpPattern"
+      "id": "Rule"
+    },
+    "LogConfig": {
+      "description": "Specifies what kind of log the caller must write\nIncrement a streamz counter with the specified metric and field names.\n\nMetric names should start with a '/', generally be lowercase-only,\nand end in \"_count\". Field names should not contain an initial slash.\nThe actual exported metric names will have \"/iam/policy\" prepended.\n\nField names correspond to IAM request parameters and field values are\ntheir respective values.\n\nAt present the only supported field names are\n   - \"iam_principal\", corresponding to IAMContext.principal;\n   - \"\" (empty string), resulting in one aggretated counter with no field.\n\nExamples:\n  counter { metric: \"/debug_access_count\"  field: \"iam_principal\" }\n  ==\u003e increment counter /iam/policy/backend_debug_access_count\n                        {iam_principal=[value of IAMContext.principal]}\n\nAt this time we do not support:\n* multiple field names (though this may be supported in the future)\n* decrementing the counter\n* incrementing it by anything other than 1",
+      "type": "object",
+      "properties": {
+        "dataAccess": {
+          "description": "Data access options.",
+          "$ref": "DataAccessOptions"
+        },
+        "cloudAudit": {
+          "$ref": "CloudAuditOptions",
+          "description": "Cloud audit options."
+        },
+        "counter": {
+          "$ref": "CounterOptions",
+          "description": "Counter options."
+        }
+      },
+      "id": "LogConfig"
     },
     "LogDescriptor": {
       "description": "A description of a log type. Example in YAML format:\n\n    - name: library.googleapis.com/activity_history\n      description: The history of borrowing and returning library items.\n      display_name: Activity\n      labels:\n      - key: /customer_id\n        description: Identifier of a library customer",
@@ -2254,21 +1197,978 @@
             "$ref": "LabelDescriptor"
           }
         },
-        "description": {
-          "description": "A human-readable description of this log. This information appears in\nthe documentation and can contain details.",
+        "name": {
+          "description": "The name of the log. It must be less than 512 characters long and can\ninclude the following characters: upper- and lower-case alphanumeric\ncharacters [A-Za-z0-9], and punctuation characters including\nslash, underscore, hyphen, period [/_-.].",
           "type": "string"
         },
+        "description": {
+          "type": "string",
+          "description": "A human-readable description of this log. This information appears in\nthe documentation and can contain details."
+        },
         "displayName": {
           "description": "The human-readable name for this log. This information appears on\nthe user interface and should be concise.",
           "type": "string"
-        },
-        "name": {
-          "description": "The name of the log. It must be less than 512 characters long and can\ninclude the following characters: upper- and lower-case alphanumeric\ncharacters [A-Za-z0-9], and punctuation characters including\nslash, underscore, hyphen, period [/_-.].",
-          "type": "string"
         }
       },
       "id": "LogDescriptor"
     },
+    "ConfigFile": {
+      "description": "Generic specification of a source configuration file",
+      "type": "object",
+      "properties": {
+        "fileContents": {
+          "description": "The bytes that constitute the file.",
+          "format": "byte",
+          "type": "string"
+        },
+        "filePath": {
+          "description": "The file name of the configuration file (full or relative path).",
+          "type": "string"
+        },
+        "fileType": {
+          "description": "The type of configuration file this represents.",
+          "type": "string",
+          "enumDescriptions": [
+            "Unknown file type.",
+            "YAML-specification of service.",
+            "OpenAPI specification, serialized in JSON.",
+            "OpenAPI specification, serialized in YAML.",
+            "FileDescriptorSet, generated by protoc.\n\nTo generate, use protoc with imports and source info included.\nFor an example test.proto file, the following command would put the value\nin a new file named out.pb.\n\n$protoc --include_imports --include_source_info test.proto -o out.pb"
+          ],
+          "enum": [
+            "FILE_TYPE_UNSPECIFIED",
+            "SERVICE_CONFIG_YAML",
+            "OPEN_API_JSON",
+            "OPEN_API_YAML",
+            "FILE_DESCRIPTOR_SET_PROTO"
+          ]
+        }
+      },
+      "id": "ConfigFile"
+    },
+    "MonitoredResourceDescriptor": {
+      "type": "object",
+      "properties": {
+        "displayName": {
+          "description": "Optional. A concise name for the monitored resource type that might be\ndisplayed in user interfaces. It should be a Title Cased Noun Phrase,\nwithout any article or other determiners. For example,\n`\"Google Cloud SQL Database\"`.",
+          "type": "string"
+        },
+        "description": {
+          "description": "Optional. A detailed description of the monitored resource type that might\nbe used in documentation.",
+          "type": "string"
+        },
+        "type": {
+          "description": "Required. The monitored resource type. For example, the type\n`\"cloudsql_database\"` represents databases in Google Cloud SQL.\nThe maximum length of this value is 256 characters.",
+          "type": "string"
+        },
+        "labels": {
+          "type": "array",
+          "items": {
+            "$ref": "LabelDescriptor"
+          },
+          "description": "Required. A set of labels used to describe instances of this monitored\nresource type. For example, an individual Google Cloud SQL database is\nidentified by values for the labels `\"database_id\"` and `\"zone\"`."
+        },
+        "name": {
+          "type": "string",
+          "description": "Optional. The resource name of the monitored resource descriptor:\n`\"projects/{project_id}/monitoredResourceDescriptors/{type}\"` where\n{type} is the value of the `type` field in this object and\n{project_id} is a project ID that provides API-specific context for\naccessing the type.  APIs that do not use project information can use the\nresource name format `\"monitoredResourceDescriptors/{type}\"`."
+        }
+      },
+      "id": "MonitoredResourceDescriptor",
+      "description": "An object that describes the schema of a MonitoredResource object using a\ntype name and a set of labels.  For example, the monitored resource\ndescriptor for Google Compute Engine VM instances has a type of\n`\"gce_instance\"` and specifies the use of the labels `\"instance_id\"` and\n`\"zone\"` to identify particular VM instances.\n\nDifferent APIs can support different monitored resource types. APIs generally\nprovide a `list` method that returns the monitored resource descriptors used\nby the API."
+    },
+    "CustomErrorRule": {
+      "description": "A custom error rule.",
+      "type": "object",
+      "properties": {
+        "isErrorType": {
+          "type": "boolean",
+          "description": "Mark this message as possible payload in error response.  Otherwise,\nobjects of this type will be filtered when they appear in error payload."
+        },
+        "selector": {
+          "description": "Selects messages to which this rule applies.\n\nRefer to selector for syntax details.",
+          "type": "string"
+        }
+      },
+      "id": "CustomErrorRule"
+    },
+    "MediaDownload": {
+      "id": "MediaDownload",
+      "description": "Do not use this. For media support, add instead\n[][google.bytestream.RestByteStream] as an API to your\nconfiguration.",
+      "type": "object",
+      "properties": {
+        "enabled": {
+          "description": "Whether download is enabled.",
+          "type": "boolean"
+        }
+      }
+    },
+    "ChangeReport": {
+      "type": "object",
+      "properties": {
+        "configChanges": {
+          "description": "List of changes between two service configurations.\nThe changes will be alphabetically sorted based on the identifier\nof each change.\nA ConfigChange identifier is a dot separated path to the configuration.\nExample: visibility.rules[selector='LibraryService.CreateBook'].restriction",
+          "type": "array",
+          "items": {
+            "$ref": "ConfigChange"
+          }
+        }
+      },
+      "id": "ChangeReport",
+      "description": "Change report associated with a particular service configuration.\n\nIt contains a list of ConfigChanges based on the comparison between\ntwo service configurations."
+    },
+    "DisableServiceRequest": {
+      "id": "DisableServiceRequest",
+      "description": "Request message for DisableService method.",
+      "type": "object",
+      "properties": {
+        "consumerId": {
+          "description": "The identity of consumer resource which service disablement will be\napplied to.\n\nThe Google Service Management implementation accepts the following\nforms:\n- \"project:\u003cproject_id\u003e\"\n\nNote: this is made compatible with\ngoogle.api.servicecontrol.v1.Operation.consumer_id.",
+          "type": "string"
+        }
+      }
+    },
+    "SubmitConfigSourceResponse": {
+      "description": "Response message for SubmitConfigSource method.",
+      "type": "object",
+      "properties": {
+        "serviceConfig": {
+          "$ref": "Service",
+          "description": "The generated service configuration."
+        }
+      },
+      "id": "SubmitConfigSourceResponse"
+    },
+    "MediaUpload": {
+      "description": "Do not use this. For media support, add instead\n[][google.bytestream.RestByteStream] as an API to your\nconfiguration.",
+      "type": "object",
+      "properties": {
+        "enabled": {
+          "description": "Whether upload is enabled.",
+          "type": "boolean"
+        }
+      },
+      "id": "MediaUpload"
+    },
+    "Advice": {
+      "description": "Generated advice about this change, used for providing more\ninformation about how a change will affect the existing service.",
+      "type": "object",
+      "properties": {
+        "description": {
+          "description": "Useful description for why this advice was applied and what actions should\nbe taken to mitigate any implied risks.",
+          "type": "string"
+        }
+      },
+      "id": "Advice"
+    },
+    "ManagedService": {
+      "properties": {
+        "serviceName": {
+          "description": "The name of the service. See the [overview](/service-management/overview)\nfor naming requirements.",
+          "type": "string"
+        },
+        "producerProjectId": {
+          "description": "ID of the project that produces and owns this service.",
+          "type": "string"
+        }
+      },
+      "id": "ManagedService",
+      "description": "The full representation of a Service that is managed by\nGoogle Service Management.",
+      "type": "object"
+    },
+    "UsageRule": {
+      "id": "UsageRule",
+      "description": "Usage configuration rules for the service.\n\nNOTE: Under development.\n\n\nUse this rule to configure unregistered calls for the service. Unregistered\ncalls are calls that do not contain consumer project identity.\n(Example: calls that do not contain an API key).\nBy default, API methods do not allow unregistered calls, and each method call\nmust be identified by a consumer project identity. Use this rule to\nallow/disallow unregistered calls.\n\nExample of an API that wants to allow unregistered calls for entire service.\n\n    usage:\n      rules:\n      - selector: \"*\"\n        allow_unregistered_calls: true\n\nExample of a method that wants to allow unregistered calls.\n\n    usage:\n      rules:\n      - selector: \"google.example.library.v1.LibraryService.CreateBook\"\n        allow_unregistered_calls: true",
+      "type": "object",
+      "properties": {
+        "allowUnregisteredCalls": {
+          "type": "boolean",
+          "description": "True, if the method allows unregistered calls; false otherwise."
+        },
+        "selector": {
+          "description": "Selects the methods to which this rule applies. Use '*' to indicate all\nmethods in all APIs.\n\nRefer to selector for syntax details.",
+          "type": "string"
+        }
+      }
+    },
+    "TrafficPercentStrategy": {
+      "type": "object",
+      "properties": {
+        "percentages": {
+          "description": "Maps service configuration IDs to their corresponding traffic percentage.\nKey is the service configuration ID, Value is the traffic percentage\nwhich must be greater than 0.0 and the sum must equal to 100.0.",
+          "type": "object",
+          "additionalProperties": {
+            "type": "number",
+            "format": "double"
+          }
+        }
+      },
+      "id": "TrafficPercentStrategy",
+      "description": "Strategy that specifies how Google Service Control should select\ndifferent\nversions of service configurations based on traffic percentage.\n\nOne example of how to gradually rollout a new service configuration using\nthis\nstrategy:\nDay 1\n\n    Rollout {\n      id: \"example.googleapis.com/rollout_20160206\"\n      traffic_percent_strategy {\n        percentages: {\n          \"example.googleapis.com/20160201\": 70.00\n          \"example.googleapis.com/20160206\": 30.00\n        }\n      }\n    }\n\nDay 2\n\n    Rollout {\n      id: \"example.googleapis.com/rollout_20160207\"\n      traffic_percent_strategy: {\n        percentages: {\n          \"example.googleapis.com/20160206\": 100.00\n        }\n      }\n    }"
+    },
+    "AuthRequirement": {
+      "type": "object",
+      "properties": {
+        "audiences": {
+          "description": "NOTE: This will be deprecated soon, once AuthProvider.audiences is\nimplemented and accepted in all the runtime components.\n\nThe list of JWT\n[audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3).\nthat are allowed to access. A JWT containing any of these audiences will\nbe accepted. When this setting is absent, only JWTs with audience\n\"https://Service_name/API_name\"\nwill be accepted. For example, if no audiences are in the setting,\nLibraryService API will only accept JWTs with the following audience\n\"https://library-example.googleapis.com/google.example.library.v1.LibraryService\".\n\nExample:\n\n    audiences: bookstore_android.apps.googleusercontent.com,\n               bookstore_web.apps.googleusercontent.com",
+          "type": "string"
+        },
+        "providerId": {
+          "type": "string",
+          "description": "id from authentication provider.\n\nExample:\n\n    provider_id: bookstore_auth"
+        }
+      },
+      "id": "AuthRequirement",
+      "description": "User-defined authentication requirements, including support for\n[JSON Web Token (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32)."
+    },
+    "Condition": {
+      "type": "object",
+      "properties": {
+        "svc": {
+          "description": "Trusted attributes discharged by the service.",
+          "type": "string"
+        },
+        "sys": {
+          "type": "string",
+          "enumDescriptions": [
+            "Default non-attribute type",
+            "Region of the resource",
+            "Service name",
+            "Resource name",
+            "IP address of the caller"
+          ],
+          "enum": [
+            "NO_ATTR",
+            "REGION",
+            "SERVICE",
+            "NAME",
+            "IP"
+          ],
+          "description": "Trusted attributes supplied by any service that owns resources and uses\nthe IAM system for access control."
+        },
+        "value": {
+          "type": "string",
+          "description": "DEPRECATED. Use 'values' instead."
+        },
+        "values": {
+          "description": "The objects of the condition. This is mutually exclusive with 'value'.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "iam": {
+          "type": "string",
+          "enumDescriptions": [
+            "Default non-attribute.",
+            "Either principal or (if present) authority selector.",
+            "The principal (even if an authority selector is present), which\nmust only be used for attribution, not authorization."
+          ],
+          "enum": [
+            "NO_ATTR",
+            "AUTHORITY",
+            "ATTRIBUTION"
+          ],
+          "description": "Trusted attributes supplied by the IAM system."
+        },
+        "op": {
+          "enum": [
+            "NO_OP",
+            "EQUALS",
+            "NOT_EQUALS",
+            "IN",
+            "NOT_IN",
+            "DISCHARGED"
+          ],
+          "description": "An operator to apply the subject with.",
+          "type": "string",
+          "enumDescriptions": [
+            "Default no-op.",
+            "DEPRECATED. Use IN instead.",
+            "DEPRECATED. Use NOT_IN instead.",
+            "Set-inclusion check.",
+            "Set-exclusion check.",
+            "Subject is discharged"
+          ]
+        }
+      },
+      "id": "Condition",
+      "description": "A condition to be met."
+    },
+    "Documentation": {
+      "type": "object",
+      "properties": {
+        "summary": {
+          "description": "A short summary of what the service does. Can only be provided by\nplain text.",
+          "type": "string"
+        },
+        "documentationRootUrl": {
+          "type": "string",
+          "description": "The URL to the root of documentation."
+        },
+        "rules": {
+          "description": "A list of documentation rules that apply to individual API elements.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
+          "type": "array",
+          "items": {
+            "$ref": "DocumentationRule"
+          }
+        },
+        "overview": {
+          "type": "string",
+          "description": "Declares a single overview page. For example:\n\u003cpre\u003e\u003ccode\u003edocumentation:\n  summary: ...\n  overview: &#40;== include overview.md ==&#41;\n\u003c/code\u003e\u003c/pre\u003e\nThis is a shortcut for the following declaration (using pages style):\n\u003cpre\u003e\u003ccode\u003edocumentation:\n  summary: ...\n  pages:\n  - name: Overview\n    content: &#40;== include overview.md ==&#41;\n\u003c/code\u003e\u003c/pre\u003e\nNote: you cannot specify both `overview` field and `pages` field."
+        },
+        "pages": {
+          "description": "The top level pages for the documentation set.",
+          "type": "array",
+          "items": {
+            "$ref": "Page"
+          }
+        }
+      },
+      "id": "Documentation",
+      "description": "`Documentation` provides the information for describing a service.\n\nExample:\n\u003cpre\u003e\u003ccode\u003edocumentation:\n  summary: \u003e\n    The Google Calendar API gives access\n    to most calendar features.\n  pages:\n  - name: Overview\n    content: &#40;== include google/foo/overview.md ==&#41;\n  - name: Tutorial\n    content: &#40;== include google/foo/tutorial.md ==&#41;\n    subpages;\n    - name: Java\n      content: &#40;== include google/foo/tutorial_java.md ==&#41;\n  rules:\n  - selector: google.calendar.Calendar.Get\n    description: \u003e\n      ...\n  - selector: google.calendar.Calendar.Put\n    description: \u003e\n      ...\n\u003c/code\u003e\u003c/pre\u003e\nDocumentation is provided in markdown syntax. In addition to\nstandard markdown features, definition lists, tables and fenced\ncode blocks are supported. Section headers can be provided and are\ninterpreted relative to the section nesting of the context where\na documentation fragment is embedded.\n\nDocumentation from the IDL is merged with documentation defined\nvia the config at normalization time, where documentation provided\nby config rules overrides IDL provided.\n\nA number of constructs specific to the API platform are supported\nin documentation text.\n\nIn order to reference a proto element, the following\nnotation can be used:\n\u003cpre\u003e\u003ccode\u003e&#91;fully.qualified.proto.name]&#91;]\u003c/code\u003e\u003c/pre\u003e\nTo override the display text used for the link, this can be used:\n\u003cpre\u003e\u003ccode\u003e&#91;display text]&#91;fully.qualified.proto.name]\u003c/code\u003e\u003c/pre\u003e\nText can be excluded from doc using the following notation:\n\u003cpre\u003e\u003ccode\u003e&#40;-- internal comment --&#41;\u003c/code\u003e\u003c/pre\u003e\nComments can be made conditional using a visibility label. The below\ntext will be only rendered if the `BETA` label is available:\n\u003cpre\u003e\u003ccode\u003e&#40;--BETA: comment for BETA users --&#41;\u003c/code\u003e\u003c/pre\u003e\nA few directives are available in documentation. Note that\ndirectives must appear on a single line to be properly\nidentified. The `include` directive includes a markdown file from\nan external source:\n\u003cpre\u003e\u003ccode\u003e&#40;== include path/to/file ==&#41;\u003c/code\u003e\u003c/pre\u003e\nThe `resource_for` directive marks a message to be the resource of\na collection in REST view. If it is not specified, tools attempt\nto infer the resource from the operations in a collection:\n\u003cpre\u003e\u003ccode\u003e&#40;== resource_for v1.shelves.books ==&#41;\u003c/code\u003e\u003c/pre\u003e\nThe directive `suppress_warning` does not directly affect documentation\nand is documented together with service config validation."
+    },
+    "AuditLogConfig": {
+      "description": "Provides the configuration for logging a type of permissions.\nExample:\n\n    {\n      \"audit_log_configs\": [\n        {\n          \"log_type\": \"DATA_READ\",\n          \"exempted_members\": [\n            \"user:foo@gmail.com\"\n          ]\n        },\n        {\n          \"log_type\": \"DATA_WRITE\",\n        }\n      ]\n    }\n\nThis enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting\nfoo@gmail.com from DATA_READ logging.",
+      "type": "object",
+      "properties": {
+        "exemptedMembers": {
+          "description": "Specifies the identities that do not cause logging for this type of\npermission.\nFollows the same format of Binding.members.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "logType": {
+          "enum": [
+            "LOG_TYPE_UNSPECIFIED",
+            "ADMIN_READ",
+            "DATA_WRITE",
+            "DATA_READ"
+          ],
+          "description": "The log type that this config enables.",
+          "type": "string",
+          "enumDescriptions": [
+            "Default case. Should never be this.",
+            "Admin reads. Example: CloudIAM getIamPolicy",
+            "Data writes. Example: CloudSQL Users create",
+            "Data reads. Example: CloudSQL Users list"
+          ]
+        }
+      },
+      "id": "AuditLogConfig"
+    },
+    "ConfigSource": {
+      "description": "Represents a source file which is used to generate the service configuration\ndefined by `google.api.Service`.",
+      "type": "object",
+      "properties": {
+        "files": {
+          "description": "Set of source configuration files that are used to generate a service\nconfiguration (`google.api.Service`).",
+          "type": "array",
+          "items": {
+            "$ref": "ConfigFile"
+          }
+        },
+        "id": {
+          "type": "string",
+          "description": "A unique ID for a specific instance of this message, typically assigned\nby the client for tracking purpose. If empty, the server may choose to\ngenerate one instead."
+        }
+      },
+      "id": "ConfigSource"
+    },
+    "BackendRule": {
+      "id": "BackendRule",
+      "description": "A backend rule provides configuration for an individual API element.",
+      "type": "object",
+      "properties": {
+        "address": {
+          "description": "The address of the API backend.",
+          "type": "string"
+        },
+        "selector": {
+          "description": "Selects the methods to which this rule applies.\n\nRefer to selector for syntax details.",
+          "type": "string"
+        },
+        "deadline": {
+          "description": "The number of seconds to wait for a response from a request.  The\ndefault depends on the deployment context.",
+          "format": "double",
+          "type": "number"
+        }
+      }
+    },
+    "AuthenticationRule": {
+      "description": "Authentication rules for the service.\n\nBy default, if a method has any authentication requirements, every request\nmust include a valid credential matching one of the requirements.\nIt's an error to include more than one kind of credential in a single\nrequest.\n\nIf a method doesn't have any auth requirements, request credentials will be\nignored.",
+      "type": "object",
+      "properties": {
+        "oauth": {
+          "description": "The requirements for OAuth credentials.",
+          "$ref": "OAuthRequirements"
+        },
+        "requirements": {
+          "description": "Requirements for additional authentication providers.",
+          "type": "array",
+          "items": {
+            "$ref": "AuthRequirement"
+          }
+        },
+        "selector": {
+          "type": "string",
+          "description": "Selects the methods to which this rule applies.\n\nRefer to selector for syntax details."
+        },
+        "allowWithoutCredential": {
+          "description": "Whether to allow requests without a credential. The credential can be\nan OAuth token, Google cookies (first-party auth) or EndUserCreds.\n\nFor requests without credentials, if the service control environment is\nspecified, each incoming request **must** be associated with a service\nconsumer. This can be done by passing an API key that belongs to a consumer\nproject.",
+          "type": "boolean"
+        }
+      },
+      "id": "AuthenticationRule"
+    },
+    "UndeleteServiceResponse": {
+      "description": "Response message for UndeleteService method.",
+      "type": "object",
+      "properties": {
+        "service": {
+          "$ref": "ManagedService",
+          "description": "Revived service resource."
+        }
+      },
+      "id": "UndeleteServiceResponse"
+    },
+    "Policy": {
+      "description": "Defines an Identity and Access Management (IAM) policy. It is used to\nspecify access control policies for Cloud Platform resources.\n\n\nA `Policy` consists of a list of `bindings`. A `Binding` binds a list of\n`members` to a `role`, where the members can be user accounts, Google groups,\nGoogle domains, and service accounts. A `role` is a named list of permissions\ndefined by IAM.\n\n**Example**\n\n    {\n      \"bindings\": [\n        {\n          \"role\": \"roles/owner\",\n          \"members\": [\n            \"user:mike@example.com\",\n            \"group:admins@example.com\",\n            \"domain:google.com\",\n            \"serviceAccount:my-other-app@appspot.gserviceaccount.com\",\n          ]\n        },\n        {\n          \"role\": \"roles/viewer\",\n          \"members\": [\"user:sean@example.com\"]\n        }\n      ]\n    }\n\nFor a description of IAM and its features, see the\n[IAM developer's guide](https://cloud.google.com/iam).",
+      "type": "object",
+      "properties": {
+        "etag": {
+          "description": "`etag` is used for optimistic concurrency control as a way to help\nprevent simultaneous updates of a policy from overwriting each other.\nIt is strongly suggested that systems make use of the `etag` in the\nread-modify-write cycle to perform policy updates in order to avoid race\nconditions: An `etag` is returned in the response to `getIamPolicy`, and\nsystems are expected to put that etag in the request to `setIamPolicy` to\nensure that their change will be applied to the same version of the policy.\n\nIf no `etag` is provided in the call to `setIamPolicy`, then the existing\npolicy is overwritten blindly.",
+          "format": "byte",
+          "type": "string"
+        },
+        "iamOwned": {
+          "type": "boolean"
+        },
+        "rules": {
+          "description": "If more than one rule is specified, the rules are applied in the following\nmanner:\n- All matching LOG rules are always applied.\n- If any DENY/DENY_WITH_LOG rule matches, permission is denied.\n  Logging will be applied if one or more matching rule requires logging.\n- Otherwise, if any ALLOW/ALLOW_WITH_LOG rule matches, permission is\n  granted.\n  Logging will be applied if one or more matching rule requires logging.\n- Otherwise, if no rule applies, permission is denied.",
+          "type": "array",
+          "items": {
+            "$ref": "Rule"
+          }
+        },
+        "version": {
+          "type": "integer",
+          "description": "Version of the `Policy`. The default version is 0.",
+          "format": "int32"
+        },
+        "auditConfigs": {
+          "description": "Specifies cloud audit logging configuration for this policy.",
+          "type": "array",
+          "items": {
+            "$ref": "AuditConfig"
+          }
+        },
+        "bindings": {
+          "description": "Associates a list of `members` to a `role`.\nMultiple `bindings` must not be specified for the same `role`.\n`bindings` with no members will result in an error.",
+          "type": "array",
+          "items": {
+            "$ref": "Binding"
+          }
+        }
+      },
+      "id": "Policy"
+    },
+    "Api": {
+      "description": "Api is a light-weight descriptor for a protocol buffer service.",
+      "type": "object",
+      "properties": {
+        "sourceContext": {
+          "$ref": "SourceContext",
+          "description": "Source context for the protocol buffer service represented by this\nmessage."
+        },
+        "syntax": {
+          "enumDescriptions": [
+            "Syntax `proto2`.",
+            "Syntax `proto3`."
+          ],
+          "enum": [
+            "SYNTAX_PROTO2",
+            "SYNTAX_PROTO3"
+          ],
+          "description": "The source syntax of the service.",
+          "type": "string"
+        },
+        "version": {
+          "description": "A version string for this api. If specified, must have the form\n`major-version.minor-version`, as in `1.10`. If the minor version\nis omitted, it defaults to zero. If the entire version field is\nempty, the major version is derived from the package name, as\noutlined below. If the field is not empty, the version in the\npackage name will be verified to be consistent with what is\nprovided here.\n\nThe versioning schema uses [semantic\nversioning](http://semver.org) where the major version number\nindicates a breaking change and the minor version an additive,\nnon-breaking change. Both version numbers are signals to users\nwhat to expect from different versions, and should be carefully\nchosen based on the product plan.\n\nThe major version is also reflected in the package name of the\nAPI, which must end in `v\u003cmajor-version\u003e`, as in\n`google.feature.v1`. For major versions 0 and 1, the suffix can\nbe omitted. Zero major versions must only be used for\nexperimental, none-GA apis.\n",
+          "type": "string"
+        },
+        "mixins": {
+          "description": "Included APIs. See Mixin.",
+          "type": "array",
+          "items": {
+            "$ref": "Mixin"
+          }
+        },
+        "options": {
+          "description": "Any metadata attached to the API.",
+          "type": "array",
+          "items": {
+            "$ref": "Option"
+          }
+        },
+        "methods": {
+          "description": "The methods of this api, in unspecified order.",
+          "type": "array",
+          "items": {
+            "$ref": "Method"
+          }
+        },
+        "name": {
+          "description": "The fully qualified name of this api, including package name\nfollowed by the api's simple name.",
+          "type": "string"
+        }
+      },
+      "id": "Api"
+    },
+    "DataAccessOptions": {
+      "description": "Write a Data Access (Gin) log",
+      "type": "object",
+      "properties": {},
+      "id": "DataAccessOptions"
+    },
+    "Authentication": {
+      "properties": {
+        "rules": {
+          "type": "array",
+          "items": {
+            "$ref": "AuthenticationRule"
+          },
+          "description": "A list of authentication rules that apply to individual API methods.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order."
+        },
+        "providers": {
+          "description": "Defines a set of authentication providers that a service supports.",
+          "type": "array",
+          "items": {
+            "$ref": "AuthProvider"
+          }
+        }
+      },
+      "id": "Authentication",
+      "description": "`Authentication` defines the authentication configuration for an API.\n\nExample for an API targeted for external use:\n\n    name: calendar.googleapis.com\n    authentication:\n      providers:\n      - id: google_calendar_auth\n        jwks_uri: https://www.googleapis.com/oauth2/v1/certs\n        issuer: https://securetoken.google.com\n      rules:\n      - selector: \"*\"\n        requirements:\n          provider_id: google_calendar_auth",
+      "type": "object"
+    },
+    "Operation": {
+      "description": "This resource represents a long-running operation that is the result of a\nnetwork API call.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The server-assigned name, which is only unique within the same service that\noriginally returns it. If you use the default HTTP mapping, the\n`name` should have the format of `operations/some/unique/name`.",
+          "type": "string"
+        },
+        "error": {
+          "$ref": "Status",
+          "description": "The error result of the operation in case of failure or cancellation."
+        },
+        "metadata": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "Service-specific metadata associated with the operation.  It typically\ncontains progress information and common metadata such as create time.\nSome services might not provide such metadata.  Any method that returns a\nlong-running operation should document the metadata type, if any.",
+          "type": "object"
+        },
+        "done": {
+          "description": "If the value is `false`, it means the operation is still in progress.\nIf true, the operation is completed, and either `error` or `response` is\navailable.",
+          "type": "boolean"
+        },
+        "response": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "The normal response of the operation in case of success.  If the original\nmethod returns no data on success, such as `Delete`, the response is\n`google.protobuf.Empty`.  If the original method is standard\n`Get`/`Create`/`Update`, the response should be the resource.  For other\nmethods, the response should have the type `XxxResponse`, where `Xxx`\nis the original method name.  For example, if the original method name\nis `TakeSnapshot()`, the inferred response type is\n`TakeSnapshotResponse`.",
+          "type": "object"
+        }
+      },
+      "id": "Operation"
+    },
+    "Page": {
+      "description": "Represents a documentation page. A page can contain subpages to represent\nnested documentation set structure.",
+      "type": "object",
+      "properties": {
+        "subpages": {
+          "description": "Subpages of this page. The order of subpages specified here will be\nhonored in the generated docset.",
+          "type": "array",
+          "items": {
+            "$ref": "Page"
+          }
+        },
+        "name": {
+          "description": "The name of the page. It will be used as an identity of the page to\ngenerate URI of the page, text of the link to this page in navigation,\netc. The full page name (start from the root page name to this page\nconcatenated with `.`) can be used as reference to the page in your\ndocumentation. For example:\n\u003cpre\u003e\u003ccode\u003epages:\n- name: Tutorial\n  content: &#40;== include tutorial.md ==&#41;\n  subpages:\n  - name: Java\n    content: &#40;== include tutorial_java.md ==&#41;\n\u003c/code\u003e\u003c/pre\u003e\nYou can reference `Java` page using Markdown reference link syntax:\n`Java`.",
+          "type": "string"
+        },
+        "content": {
+          "description": "The Markdown content of the page. You can use \u003ccode\u003e&#40;== include {path} ==&#41;\u003c/code\u003e\nto include content from a Markdown file.",
+          "type": "string"
+        }
+      },
+      "id": "Page"
+    },
+    "Status": {
+      "description": "The `Status` type defines a logical error model that is suitable for different\nprogramming environments, including REST APIs and RPC APIs. It is used by\n[gRPC](https://github.com/grpc). The error model is designed to be:\n\n- Simple to use and understand for most users\n- Flexible enough to meet unexpected needs\n\n# Overview\n\nThe `Status` message contains three pieces of data: error code, error message,\nand error details. The error code should be an enum value of\ngoogle.rpc.Code, but it may accept additional error codes if needed.  The\nerror message should be a developer-facing English message that helps\ndevelopers *understand* and *resolve* the error. If a localized user-facing\nerror message is needed, put the localized message in the error details or\nlocalize it in the client. The optional error details may contain arbitrary\ninformation about the error. There is a predefined set of error detail types\nin the package `google.rpc` which can be used for common error conditions.\n\n# Language mapping\n\nThe `Status` message is the logical representation of the error model, but it\nis not necessarily the actual wire format. When the `Status` message is\nexposed in different client libraries and different wire protocols, it can be\nmapped differently. For example, it will likely be mapped to some exceptions\nin Java, but more likely mapped to some error codes in C.\n\n# Other uses\n\nThe error model and the `Status` message can be used in a variety of\nenvironments, either with or without APIs, to provide a\nconsistent developer experience across different environments.\n\nExample uses of this error model include:\n\n- Partial errors. If a service needs to return partial errors to the client,\n    it may embed the `Status` in the normal response to indicate the partial\n    errors.\n\n- Workflow errors. A typical workflow has multiple steps. Each step may\n    have a `Status` message for error reporting purpose.\n\n- Batch operations. If a client uses batch request and batch response, the\n    `Status` message should be used directly inside batch response, one for\n    each error sub-response.\n\n- Asynchronous operations. If an API call embeds asynchronous operation\n    results in its response, the status of those operations should be\n    represented directly using the `Status` message.\n\n- Logging. If some API errors are stored in logs, the message `Status` could\n    be used directly after any stripping needed for security/privacy reasons.",
+      "type": "object",
+      "properties": {
+        "message": {
+          "description": "A developer-facing error message, which should be in English. Any\nuser-facing error message should be localized and sent in the\ngoogle.rpc.Status.details field, or localized by the client.",
+          "type": "string"
+        },
+        "details": {
+          "type": "array",
+          "items": {
+            "additionalProperties": {
+              "description": "Properties of the object. Contains field @type with type URL.",
+              "type": "any"
+            },
+            "type": "object"
+          },
+          "description": "A list of messages that carry the error details.  There will be a\ncommon set of message types for APIs to use."
+        },
+        "code": {
+          "description": "The status code, which should be an enum value of google.rpc.Code.",
+          "format": "int32",
+          "type": "integer"
+        }
+      },
+      "id": "Status"
+    },
+    "Binding": {
+      "description": "Associates `members` with a `role`.",
+      "type": "object",
+      "properties": {
+        "role": {
+          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
+          "type": "string"
+        },
+        "members": {
+          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "Binding"
+    },
+    "AuthProvider": {
+      "properties": {
+        "audiences": {
+          "description": "The list of JWT\n[audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3).\nthat are allowed to access. A JWT containing any of these audiences will\nbe accepted. When this setting is absent, only JWTs with audience\n\"https://Service_name/API_name\"\nwill be accepted. For example, if no audiences are in the setting,\nLibraryService API will only accept JWTs with the following audience\n\"https://library-example.googleapis.com/google.example.library.v1.LibraryService\".\n\nExample:\n\n    audiences: bookstore_android.apps.googleusercontent.com,\n               bookstore_web.apps.googleusercontent.com",
+          "type": "string"
+        },
+        "id": {
+          "description": "The unique identifier of the auth provider. It will be referred to by\n`AuthRequirement.provider_id`.\n\nExample: \"bookstore_auth\".",
+          "type": "string"
+        },
+        "issuer": {
+          "description": "Identifies the principal that issued the JWT. See\nhttps://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.1\nUsually a URL or an email address.\n\nExample: https://securetoken.google.com\nExample: 1234567-compute@developer.gserviceaccount.com",
+          "type": "string"
+        },
+        "jwksUri": {
+          "description": "URL of the provider's public key set to validate signature of the JWT. See\n[OpenID Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata).\nOptional if the key set document:\n - can be retrieved from\n   [OpenID Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html\n   of the issuer.\n - can be inferred from the email domain of the issuer (e.g. a Google service account).\n\nExample: https://www.googleapis.com/oauth2/v1/certs",
+          "type": "string"
+        }
+      },
+      "id": "AuthProvider",
+      "description": "Configuration for an anthentication provider, including support for\n[JSON Web Token (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32).",
+      "type": "object"
+    },
+    "EnumValue": {
+      "description": "Enum value definition.",
+      "type": "object",
+      "properties": {
+        "number": {
+          "description": "Enum value number.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "name": {
+          "description": "Enum value name.",
+          "type": "string"
+        },
+        "options": {
+          "description": "Protocol buffer options.",
+          "type": "array",
+          "items": {
+            "$ref": "Option"
+          }
+        }
+      },
+      "id": "EnumValue"
+    },
+    "Service": {
+      "description": "`Service` is the root object of Google service configuration schema. It\ndescribes basic information about a service, such as the name and the\ntitle, and delegates other aspects to sub-sections. Each sub-section is\neither a proto message or a repeated proto message that configures a\nspecific aspect, such as auth. See each proto message definition for details.\n\nExample:\n\n    type: google.api.Service\n    config_version: 3\n    name: calendar.googleapis.com\n    title: Google Calendar API\n    apis:\n    - name: google.calendar.v3.Calendar\n    authentication:\n      providers:\n      - id: google_calendar_auth\n        jwks_uri: https://www.googleapis.com/oauth2/v1/certs\n        issuer: https://securetoken.google.com\n      rules:\n      - selector: \"*\"\n        requirements:\n          provider_id: google_calendar_auth",
+      "type": "object",
+      "properties": {
+        "customError": {
+          "description": "Custom error configuration.",
+          "$ref": "CustomError"
+        },
+        "title": {
+          "description": "The product title associated with this service.",
+          "type": "string"
+        },
+        "endpoints": {
+          "description": "Configuration for network endpoints.  If this is empty, then an endpoint\nwith the same name as the service is automatically generated to service all\ndefined APIs.",
+          "type": "array",
+          "items": {
+            "$ref": "Endpoint"
+          }
+        },
+        "apis": {
+          "description": "A list of API interfaces exported by this service. Only the `name` field\nof the google.protobuf.Api needs to be provided by the configuration\nauthor, as the remaining fields will be derived from the IDL during the\nnormalization process. It is an error to specify an API interface here\nwhich cannot be resolved against the associated IDL files.",
+          "type": "array",
+          "items": {
+            "$ref": "Api"
+          }
+        },
+        "logs": {
+          "description": "Defines the logs used by this service.",
+          "type": "array",
+          "items": {
+            "$ref": "LogDescriptor"
+          }
+        },
+        "types": {
+          "description": "A list of all proto message types included in this API service.\nTypes referenced directly or indirectly by the `apis` are\nautomatically included.  Messages which are not referenced but\nshall be included, such as types used by the `google.protobuf.Any` type,\nshould be listed here by name. Example:\n\n    types:\n    - name: google.protobuf.Int32",
+          "type": "array",
+          "items": {
+            "$ref": "Type"
+          }
+        },
+        "http": {
+          "$ref": "Http",
+          "description": "HTTP configuration."
+        },
+        "systemParameters": {
+          "description": "System parameter configuration.",
+          "$ref": "SystemParameters"
+        },
+        "backend": {
+          "description": "API backend configuration.",
+          "$ref": "Backend"
+        },
+        "documentation": {
+          "$ref": "Documentation",
+          "description": "Additional API documentation."
+        },
+        "logging": {
+          "description": "Logging configuration.",
+          "$ref": "Logging"
+        },
+        "monitoredResources": {
+          "description": "Defines the monitored resources used by this service. This is required\nby the Service.monitoring and Service.logging configurations.",
+          "type": "array",
+          "items": {
+            "$ref": "MonitoredResourceDescriptor"
+          }
+        },
+        "enums": {
+          "description": "A list of all enum types included in this API service.  Enums\nreferenced directly or indirectly by the `apis` are automatically\nincluded.  Enums which are not referenced but shall be included\nshould be listed here by name. Example:\n\n    enums:\n    - name: google.someapi.v1.SomeEnum",
+          "type": "array",
+          "items": {
+            "$ref": "Enum"
+          }
+        },
+        "context": {
+          "$ref": "Context",
+          "description": "Context configuration."
+        },
+        "id": {
+          "type": "string",
+          "description": "A unique ID for a specific instance of this message, typically assigned\nby the client for tracking purpose. If empty, the server may choose to\ngenerate one instead."
+        },
+        "usage": {
+          "$ref": "Usage",
+          "description": "Configuration controlling usage of this service."
+        },
+        "metrics": {
+          "description": "Defines the metrics used by this service.",
+          "type": "array",
+          "items": {
+            "$ref": "MetricDescriptor"
+          }
+        },
+        "authentication": {
+          "$ref": "Authentication",
+          "description": "Auth configuration."
+        },
+        "control": {
+          "description": "Configuration for the service control plane.",
+          "$ref": "Control"
+        },
+        "configVersion": {
+          "description": "The version of the service configuration. The config version may\ninfluence interpretation of the configuration, for example, to\ndetermine defaults. This is documented together with applicable\noptions. The current default for the config version itself is `3`.",
+          "format": "uint32",
+          "type": "integer"
+        },
+        "monitoring": {
+          "$ref": "Monitoring",
+          "description": "Monitoring configuration."
+        },
+        "producerProjectId": {
+          "description": "The id of the Google developer project that owns the service.\nMembers of this project can manage the service configuration,\nmanage consumption of the service, etc.",
+          "type": "string"
+        },
+        "systemTypes": {
+          "description": "A list of all proto message types included in this API service.\nIt serves similar purpose as [google.api.Service.types], except that\nthese types are not needed by user-defined APIs. Therefore, they will not\nshow up in the generated discovery doc. This field should only be used\nto define system APIs in ESF.",
+          "type": "array",
+          "items": {
+            "$ref": "Type"
+          }
+        },
+        "visibility": {
+          "$ref": "Visibility",
+          "description": "API visibility configuration."
+        },
+        "name": {
+          "description": "The DNS address at which this service is available,\ne.g. `calendar.googleapis.com`.",
+          "type": "string"
+        }
+      },
+      "id": "Service"
+    },
+    "OperationMetadata": {
+      "description": "The metadata associated with a long running operation resource.",
+      "type": "object",
+      "properties": {
+        "progressPercentage": {
+          "description": "Percentage of completion of this operation, ranging from 0 to 100.",
+          "format": "int32",
+          "type": "integer"
+        },
+        "startTime": {
+          "description": "The start time of the operation.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "resourceNames": {
+          "description": "The full name of the resources that this operation is directly\nassociated with.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        },
+        "steps": {
+          "description": "Detailed status information for each step. The order is undetermined.",
+          "type": "array",
+          "items": {
+            "$ref": "Step"
+          }
+        }
+      },
+      "id": "OperationMetadata"
+    },
+    "CustomHttpPattern": {
+      "description": "A custom pattern is used for defining custom HTTP verb.",
+      "type": "object",
+      "properties": {
+        "kind": {
+          "description": "The name of this custom HTTP verb.",
+          "type": "string"
+        },
+        "path": {
+          "description": "The path matched by this custom verb.",
+          "type": "string"
+        }
+      },
+      "id": "CustomHttpPattern"
+    },
+    "SystemParameterRule": {
+      "description": "Define a system parameter rule mapping system parameter definitions to\nmethods.",
+      "type": "object",
+      "properties": {
+        "selector": {
+          "description": "Selects the methods to which this rule applies. Use '*' to indicate all\nmethods in all APIs.\n\nRefer to selector for syntax details.",
+          "type": "string"
+        },
+        "parameters": {
+          "description": "Define parameters. Multiple names may be defined for a parameter.\nFor a given method call, only one of them should be used. If multiple\nnames are used the behavior is implementation-dependent.\nIf none of the specified names are present the behavior is\nparameter-dependent.",
+          "type": "array",
+          "items": {
+            "$ref": "SystemParameter"
+          }
+        }
+      },
+      "id": "SystemParameterRule"
+    },
+    "VisibilityRule": {
+      "description": "A visibility rule provides visibility configuration for an individual API\nelement.",
+      "type": "object",
+      "properties": {
+        "restriction": {
+          "type": "string",
+          "description": "A comma-separated list of visibility labels that apply to the `selector`.\nAny of the listed labels can be used to grant the visibility.\n\nIf a rule has multiple labels, removing one of the labels but not all of\nthem can break clients.\n\nExample:\n\n    visibility:\n      rules:\n      - selector: google.calendar.Calendar.EnhancedSearch\n        restriction: GOOGLE_INTERNAL, TRUSTED_TESTER\n\nRemoving GOOGLE_INTERNAL from this restriction will break clients that\nrely on this method and only had access to it through GOOGLE_INTERNAL."
+        },
+        "selector": {
+          "description": "Selects methods, messages, fields, enums, etc. to which this rule applies.\n\nRefer to selector for syntax details.",
+          "type": "string"
+        }
+      },
+      "id": "VisibilityRule"
+    },
+    "HttpRule": {
+      "description": "`HttpRule` defines the mapping of an RPC method to one or more HTTP\nREST APIs.  The mapping determines what portions of the request\nmessage are populated from the path, query parameters, or body of\nthe HTTP request.  The mapping is typically specified as an\n`google.api.http` annotation, see \"google/api/annotations.proto\"\nfor details.\n\nThe mapping consists of a field specifying the path template and\nmethod kind.  The path template can refer to fields in the request\nmessage, as in the example below which describes a REST GET\noperation on a resource collection of messages:\n\n\n    service Messaging {\n      rpc GetMessage(GetMessageRequest) returns (Message) {\n        option (google.api.http).get = \"/v1/messages/{message_id}/{sub.subfield}\";\n      }\n    }\n    message GetMessageRequest {\n      message SubMessage {\n        string subfield = 1;\n      }\n      string message_id = 1; // mapped to the URL\n      SubMessage sub = 2;    // `sub.subfield` is url-mapped\n    }\n    message Message {\n      string text = 1; // content of the resource\n    }\n\nThe same http annotation can alternatively be expressed inside the\n`GRPC API Configuration` YAML file.\n\n    http:\n      rules:\n        - selector: \u003cproto_package_name\u003e.Messaging.GetMessage\n          get: /v1/messages/{message_id}/{sub.subfield}\n\nThis definition enables an automatic, bidrectional mapping of HTTP\nJSON to RPC. Example:\n\nHTTP | RPC\n-----|-----\n`GET /v1/messages/123456/foo`  | `GetMessage(message_id: \"123456\" sub: SubMessage(subfield: \"foo\"))`\n\nIn general, not only fields but also field paths can be referenced\nfrom a path pattern. Fields mapped to the path pattern cannot be\nrepeated and must have a primitive (non-message) type.\n\nAny fields in the request message which are not bound by the path\npattern automatically become (optional) HTTP query\nparameters. Assume the following definition of the request message:\n\n\n    message GetMessageRequest {\n      message SubMessage {\n        string subfield = 1;\n      }\n      string message_id = 1; // mapped to the URL\n      int64 revision = 2;    // becomes a parameter\n      SubMessage sub = 3;    // `sub.subfield` becomes a parameter\n    }\n\n\nThis enables a HTTP JSON to RPC mapping as below:\n\nHTTP | RPC\n-----|-----\n`GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: \"123456\" revision: 2 sub: SubMessage(subfield: \"foo\"))`\n\nNote that fields which are mapped to HTTP parameters must have a\nprimitive type or a repeated primitive type. Message types are not\nallowed. In the case of a repeated type, the parameter can be\nrepeated in the URL, as in `...?param=A&param=B`.\n\nFor HTTP method kinds which allow a request body, the `body` field\nspecifies the mapping. Consider a REST update method on the\nmessage resource collection:\n\n\n    service Messaging {\n      rpc UpdateMessage(UpdateMessageRequest) returns (Message) {\n        option (google.api.http) = {\n          put: \"/v1/messages/{message_id}\"\n          body: \"message\"\n        };\n      }\n    }\n    message UpdateMessageRequest {\n      string message_id = 1; // mapped to the URL\n      Message message = 2;   // mapped to the body\n    }\n\n\nThe following HTTP JSON to RPC mapping is enabled, where the\nrepresentation of the JSON in the request body is determined by\nprotos JSON encoding:\n\nHTTP | RPC\n-----|-----\n`PUT /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id: \"123456\" message { text: \"Hi!\" })`\n\nThe special name `*` can be used in the body mapping to define that\nevery field not bound by the path template should be mapped to the\nrequest body.  This enables the following alternative definition of\nthe update method:\n\n    service Messaging {\n      rpc UpdateMessage(Message) returns (Message) {\n        option (google.api.http) = {\n          put: \"/v1/messages/{message_id}\"\n          body: \"*\"\n        };\n      }\n    }\n    message Message {\n      string message_id = 1;\n      string text = 2;\n    }\n\n\nThe following HTTP JSON to RPC mapping is enabled:\n\nHTTP | RPC\n-----|-----\n`PUT /v1/messages/123456 { \"text\": \"Hi!\" }` | `UpdateMessage(message_id: \"123456\" text: \"Hi!\")`\n\nNote that when using `*` in the body mapping, it is not possible to\nhave HTTP parameters, as all fields not bound by the path end in\nthe body. This makes this option more rarely used in practice of\ndefining REST APIs. The common usage of `*` is in custom methods\nwhich don't use the URL at all for transferring data.\n\nIt is possible to define multiple HTTP methods for one RPC by using\nthe `additional_bindings` option. Example:\n\n    service Messaging {\n      rpc GetMessage(GetMessageRequest) returns (Message) {\n        option (google.api.http) = {\n          get: \"/v1/messages/{message_id}\"\n          additional_bindings {\n            get: \"/v1/users/{user_id}/messages/{message_id}\"\n          }\n        };\n      }\n    }\n    message GetMessageRequest {\n      string message_id = 1;\n      string user_id = 2;\n    }\n\n\nThis enables the following two alternative HTTP JSON to RPC\nmappings:\n\nHTTP | RPC\n-----|-----\n`GET /v1/messages/123456` | `GetMessage(message_id: \"123456\")`\n`GET /v1/users/me/messages/123456` | `GetMessage(user_id: \"me\" message_id: \"123456\")`\n\n# Rules for HTTP mapping\n\nThe rules for mapping HTTP path, query parameters, and body fields\nto the request message are as follows:\n\n1. The `body` field specifies either `*` or a field path, or is\n   omitted. If omitted, it assumes there is no HTTP body.\n2. Leaf fields (recursive expansion of nested messages in the\n   request) can be classified into three types:\n    (a) Matched in the URL template.\n    (b) Covered by body (if body is `*`, everything except (a) fields;\n        else everything under the body field)\n    (c) All other fields.\n3. URL query parameters found in the HTTP request are mapped to (c) fields.\n4. Any body sent with an HTTP request can contain only (b) fields.\n\nThe syntax of the path template is as follows:\n\n    Template = \"/\" Segments [ Verb ] ;\n    Segments = Segment { \"/\" Segment } ;\n    Segment  = \"*\" | \"**\" | LITERAL | Variable ;\n    Variable = \"{\" FieldPath [ \"=\" Segments ] \"}\" ;\n    FieldPath = IDENT { \".\" IDENT } ;\n    Verb     = \":\" LITERAL ;\n\nThe syntax `*` matches a single path segment. It follows the semantics of\n[RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String\nExpansion.\n\nThe syntax `**` matches zero or more path segments. It follows the semantics\nof [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.3 Reserved\nExpansion. NOTE: it must be the last segment in the path except the Verb.\n\nThe syntax `LITERAL` matches literal text in the URL path.\n\nThe syntax `Variable` matches the entire path as specified by its template;\nthis nested template must not contain further variables. If a variable\nmatches a single path segment, its template may be omitted, e.g. `{var}`\nis equivalent to `{var=*}`.\n\nNOTE: the field paths in variables and in the `body` must not refer to\nrepeated fields or map fields.\n\nUse CustomHttpPattern to specify any HTTP method that is not included in the\n`pattern` field, such as HEAD, or \"*\" to leave the HTTP method unspecified for\na given URL path rule. The wild-card rule is useful for services that provide\ncontent to Web (HTML) clients.",
+      "type": "object",
+      "properties": {
+        "get": {
+          "description": "Used for listing and getting information about resources.",
+          "type": "string"
+        },
+        "patch": {
+          "description": "Used for updating a resource.",
+          "type": "string"
+        },
+        "put": {
+          "description": "Used for updating a resource.",
+          "type": "string"
+        },
+        "delete": {
+          "description": "Used for deleting a resource.",
+          "type": "string"
+        },
+        "body": {
+          "type": "string",
+          "description": "The name of the request field whose value is mapped to the HTTP body, or\n`*` for mapping all fields not captured by the path pattern to the HTTP\nbody. NOTE: the referred field must not be a repeated field and must be\npresent at the top-level of request message type."
+        },
+        "mediaDownload": {
+          "$ref": "MediaDownload",
+          "description": "Do not use this. For media support, add instead\n[][google.bytestream.RestByteStream] as an API to your\nconfiguration."
+        },
+        "post": {
+          "description": "Used for creating a resource.",
+          "type": "string"
+        },
+        "additionalBindings": {
+          "description": "Additional HTTP bindings for the selector. Nested bindings must\nnot contain an `additional_bindings` field themselves (that is,\nthe nesting may only be one level deep).",
+          "type": "array",
+          "items": {
+            "$ref": "HttpRule"
+          }
+        },
+        "responseBody": {
+          "type": "string",
+          "description": "The name of the response field whose value is mapped to the HTTP body of\nresponse. Other response fields are ignored. This field is optional. When\nnot set, the response message will be used as HTTP body of response.\nNOTE: the referred field must be not a repeated field and must be present\nat the top-level of response message type."
+        },
+        "mediaUpload": {
+          "$ref": "MediaUpload",
+          "description": "Do not use this. For media support, add instead\n[][google.bytestream.RestByteStream] as an API to your\nconfiguration."
+        },
+        "selector": {
+          "description": "Selects methods to which this rule applies.\n\nRefer to selector for syntax details.",
+          "type": "string"
+        },
+        "custom": {
+          "description": "Custom pattern is used for defining custom verbs.",
+          "$ref": "CustomHttpPattern"
+        }
+      },
+      "id": "HttpRule"
+    },
     "MonitoringDestination": {
       "description": "Configuration of a specific monitoring destination (the producer project\nor the consumer project).",
       "type": "object",
@@ -2287,86 +2187,450 @@
       },
       "id": "MonitoringDestination"
     },
-    "Field": {
-      "description": "A single field of a message type.",
+    "Visibility": {
+      "description": "`Visibility` defines restrictions for the visibility of service\nelements.  Restrictions are specified using visibility labels\n(e.g., TRUSTED_TESTER) that are elsewhere linked to users and projects.\n\nUsers and projects can have access to more than one visibility label. The\neffective visibility for multiple labels is the union of each label's\nelements, plus any unrestricted elements.\n\nIf an element and its parents have no restrictions, visibility is\nunconditionally granted.\n\nExample:\n\n    visibility:\n      rules:\n      - selector: google.calendar.Calendar.EnhancedSearch\n        restriction: TRUSTED_TESTER\n      - selector: google.calendar.Calendar.Delegate\n        restriction: GOOGLE_INTERNAL\n\nHere, all methods are publicly visible except for the restricted methods\nEnhancedSearch and Delegate.",
       "type": "object",
       "properties": {
-        "defaultValue": {
-          "description": "The string value of the default value of this field. Proto2 syntax only.",
+        "rules": {
+          "description": "A list of visibility rules that apply to individual API elements.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
+          "type": "array",
+          "items": {
+            "$ref": "VisibilityRule"
+          }
+        }
+      },
+      "id": "Visibility"
+    },
+    "SystemParameters": {
+      "description": "### System parameter configuration\n\nA system parameter is a special kind of parameter defined by the API\nsystem, not by an individual API. It is typically mapped to an HTTP header\nand/or a URL query parameter. This configuration specifies which methods\nchange the names of the system parameters.",
+      "type": "object",
+      "properties": {
+        "rules": {
+          "description": "Define system parameters.\n\nThe parameters defined here will override the default parameters\nimplemented by the system. If this field is missing from the service\nconfig, default system parameters will be used. Default system parameters\nand names is implementation-dependent.\n\nExample: define api key for all methods\n\n    system_parameters\n      rules:\n        - selector: \"*\"\n          parameters:\n            - name: api_key\n              url_query_parameter: api_key\n\n\nExample: define 2 api key names for a specific method.\n\n    system_parameters\n      rules:\n        - selector: \"/ListShelves\"\n          parameters:\n            - name: api_key\n              http_header: Api-Key1\n            - name: api_key\n              http_header: Api-Key2\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
+          "type": "array",
+          "items": {
+            "$ref": "SystemParameterRule"
+          }
+        }
+      },
+      "id": "SystemParameters"
+    },
+    "ConfigChange": {
+      "description": "Output generated from semantically comparing two versions of a service\nconfiguration.\n\nIncludes detailed information about a field that have changed with\napplicable advice about potential consequences for the change, such as\nbackwards-incompatibility.",
+      "type": "object",
+      "properties": {
+        "newValue": {
+          "type": "string",
+          "description": "Value of the changed object in the new Service configuration,\nin JSON format. This field will not be populated if ChangeType == REMOVED."
+        },
+        "changeType": {
+          "description": "The type for this change, either ADDED, REMOVED, or MODIFIED.",
+          "type": "string",
+          "enumDescriptions": [
+            "No value was provided.",
+            "The changed object exists in the 'new' service configuration, but not\nin the 'old' service configuration.",
+            "The changed object exists in the 'old' service configuration, but not\nin the 'new' service configuration.",
+            "The changed object exists in both service configurations, but its value\nis different."
+          ],
+          "enum": [
+            "CHANGE_TYPE_UNSPECIFIED",
+            "ADDED",
+            "REMOVED",
+            "MODIFIED"
+          ]
+        },
+        "element": {
+          "description": "Object hierarchy path to the change, with levels separated by a '.'\ncharacter. For repeated fields, an applicable unique identifier field is\nused for the index (usually selector, name, or id). For maps, the term\n'key' is used. If the field has no unique identifier, the numeric index\nis used.\nExamples:\n- visibility.rules[selector==\"google.LibraryService.CreateBook\"].restriction\n- quota.metric_rules[selector==\"google\"].metric_costs[key==\"reads\"].value\n- logging.producer_destinations[0]",
           "type": "string"
         },
-        "jsonName": {
-          "description": "The field JSON name.",
+        "oldValue": {
+          "description": "Value of the changed object in the old Service configuration,\nin JSON format. This field will not be populated if ChangeType == ADDED.",
+          "type": "string"
+        },
+        "advices": {
+          "description": "Collection of advice provided for this change, useful for determining the\npossible impact of this change.",
+          "type": "array",
+          "items": {
+            "$ref": "Advice"
+          }
+        }
+      },
+      "id": "ConfigChange"
+    },
+    "Rollout": {
+      "id": "Rollout",
+      "description": "A rollout resource that defines how service configuration versions are pushed\nto control plane systems. Typically, you create a new version of the\nservice config, and then create a Rollout to push the service config.",
+      "type": "object",
+      "properties": {
+        "trafficPercentStrategy": {
+          "$ref": "TrafficPercentStrategy",
+          "description": "Google Service Control selects service configurations based on\ntraffic percentage."
+        },
+        "createdBy": {
+          "description": "The user who created the Rollout. Readonly.",
+          "type": "string"
+        },
+        "rolloutId": {
+          "description": "Optional unique identifier of this Rollout. Only lower case letters, digits\n and '-' are allowed.\n\nIf not specified by client, the server will generate one. The generated id\nwill have the form of \u003cdate\u003e\u003crevision number\u003e, where \"date\" is the create\ndate in ISO 8601 format.  \"revision number\" is a monotonically increasing\npositive number that is reset every day for each service.\nAn example of the generated rollout_id is '2016-02-16r1'",
+          "type": "string"
+        },
+        "deleteServiceStrategy": {
+          "description": "The strategy associated with a rollout to delete a `ManagedService`.\nReadonly.",
+          "$ref": "DeleteServiceStrategy"
+        },
+        "createTime": {
+          "description": "Creation time of the rollout. Readonly.",
+          "format": "google-datetime",
+          "type": "string"
+        },
+        "status": {
+          "type": "string",
+          "enumDescriptions": [
+            "No status specified.",
+            "The Rollout is in progress.",
+            "The Rollout has completed successfully.",
+            "The Rollout has been cancelled. This can happen if you have overlapping\nRollout pushes, and the previous ones will be cancelled.",
+            "The Rollout has failed. It is typically caused by configuration errors.",
+            "The Rollout has not started yet and is pending for execution."
+          ],
+          "enum": [
+            "ROLLOUT_STATUS_UNSPECIFIED",
+            "IN_PROGRESS",
+            "SUCCESS",
+            "CANCELLED",
+            "FAILED",
+            "PENDING"
+          ],
+          "description": "The status of this rollout. Readonly. In case of a failed rollout,\nthe system will automatically rollback to the current Rollout\nversion. Readonly."
+        },
+        "serviceName": {
+          "description": "The name of the service associated with this Rollout.",
+          "type": "string"
+        }
+      }
+    },
+    "GenerateConfigReportRequest": {
+      "description": "Request message for GenerateConfigReport method.",
+      "type": "object",
+      "properties": {
+        "oldConfig": {
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "Service configuration against which the comparison will be done.\nFor this version of API, the supported types are\ngoogle.api.servicemanagement.v1.ConfigRef,\ngoogle.api.servicemanagement.v1.ConfigSource,\nand google.api.Service"
+        },
+        "newConfig": {
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "Service configuration for which we want to generate the report.\nFor this version of API, the supported types are\ngoogle.api.servicemanagement.v1.ConfigRef,\ngoogle.api.servicemanagement.v1.ConfigSource,\nand google.api.Service",
+          "type": "object"
+        }
+      },
+      "id": "GenerateConfigReportRequest"
+    },
+    "SetIamPolicyRequest": {
+      "description": "Request message for `SetIamPolicy` method.",
+      "type": "object",
+      "properties": {
+        "updateMask": {
+          "description": "OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only\nthe fields in the mask will be modified. If no mask is provided, a default\nmask is used:\npaths: \"bindings, etag\"\nThis field is only used by Cloud IAM.",
+          "format": "google-fieldmask",
+          "type": "string"
+        },
+        "policy": {
+          "$ref": "Policy",
+          "description": "REQUIRED: The complete policy to be applied to the `resource`. The size of\nthe policy is limited to a few 10s of KB. An empty policy is a\nvalid policy but certain Cloud Platform services (such as Projects)\nmight reject them."
+        }
+      },
+      "id": "SetIamPolicyRequest"
+    },
+    "Step": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "enumDescriptions": [
+            "Unspecifed code.",
+            "The operation or step has completed without errors.",
+            "The operation or step has not started yet.",
+            "The operation or step is in progress.",
+            "The operation or step has completed with errors.",
+            "The operation or step has completed with cancellation."
+          ],
+          "enum": [
+            "STATUS_UNSPECIFIED",
+            "DONE",
+            "NOT_STARTED",
+            "IN_PROGRESS",
+            "FAILED",
+            "CANCELLED"
+          ],
+          "description": "The status code.",
+          "type": "string"
+        },
+        "description": {
+          "description": "The short description of the step.",
+          "type": "string"
+        }
+      },
+      "id": "Step",
+      "description": "Represents the status of one operation step."
+    },
+    "DeleteServiceStrategy": {
+      "id": "DeleteServiceStrategy",
+      "description": "Strategy used to delete a service. This strategy is a placeholder only\nused by the system generated rollout to delete a service.",
+      "type": "object",
+      "properties": {}
+    },
+    "LoggingDestination": {
+      "type": "object",
+      "properties": {
+        "monitoredResource": {
+          "description": "The monitored resource type. The type must be defined in the\nService.monitored_resources section.",
+          "type": "string"
+        },
+        "logs": {
+          "description": "Names of the logs to be sent to this destination. Each name must\nbe defined in the Service.logs section. If the log name is\nnot a domain scoped name, it will be automatically prefixed with\nthe service name followed by \"/\".",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "LoggingDestination",
+      "description": "Configuration of a specific logging destination (the producer project\nor the consumer project)."
+    },
+    "Option": {
+      "description": "A protocol buffer option, which can be attached to a message, field,\nenumeration, etc.",
+      "type": "object",
+      "properties": {
+        "value": {
+          "type": "object",
+          "additionalProperties": {
+            "description": "Properties of the object. Contains field @type with type URL.",
+            "type": "any"
+          },
+          "description": "The option's value packed in an Any message. If the value is a primitive,\nthe corresponding wrapper type defined in google/protobuf/wrappers.proto\nshould be used. If the value is an enum, it should be stored as an int32\nvalue using the google.protobuf.Int32Value type."
+        },
+        "name": {
+          "type": "string",
+          "description": "The option's name. For protobuf built-in options (options defined in\ndescriptor.proto), this is the short name. For example, `\"map_entry\"`.\nFor custom options, it should be the fully-qualified name. For example,\n`\"google.api.http\"`."
+        }
+      },
+      "id": "Option"
+    },
+    "Logging": {
+      "properties": {
+        "consumerDestinations": {
+          "description": "Logging configurations for sending logs to the consumer project.\nThere can be multiple consumer destinations, each one must have a\ndifferent monitored resource type. A log can be used in at most\none consumer destination.",
+          "type": "array",
+          "items": {
+            "$ref": "LoggingDestination"
+          }
+        },
+        "producerDestinations": {
+          "description": "Logging configurations for sending logs to the producer project.\nThere can be multiple producer destinations, each one must have a\ndifferent monitored resource type. A log can be used in at most\none producer destination.",
+          "type": "array",
+          "items": {
+            "$ref": "LoggingDestination"
+          }
+        }
+      },
+      "id": "Logging",
+      "description": "Logging configuration of the service.\n\nThe following example shows how to configure logs to be sent to the\nproducer and consumer projects. In the example, the `activity_history`\nlog is sent to both the producer and consumer projects, whereas the\n`purchase_history` log is only sent to the producer project.\n\n    monitored_resources:\n    - type: library.googleapis.com/branch\n      labels:\n      - key: /city\n        description: The city where the library branch is located in.\n      - key: /name\n        description: The name of the branch.\n    logs:\n    - name: activity_history\n      labels:\n      - key: /customer_id\n    - name: purchase_history\n    logging:\n      producer_destinations:\n      - monitored_resource: library.googleapis.com/branch\n        logs:\n        - activity_history\n        - purchase_history\n      consumer_destinations:\n      - monitored_resource: library.googleapis.com/branch\n        logs:\n        - activity_history",
+      "type": "object"
+    },
+    "Method": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The simple name of this method.",
+          "type": "string"
+        },
+        "requestTypeUrl": {
+          "description": "A URL of the input message type.",
+          "type": "string"
+        },
+        "requestStreaming": {
+          "description": "If true, the request is streamed.",
+          "type": "boolean"
+        },
+        "syntax": {
+          "type": "string",
+          "enumDescriptions": [
+            "Syntax `proto2`.",
+            "Syntax `proto3`."
+          ],
+          "enum": [
+            "SYNTAX_PROTO2",
+            "SYNTAX_PROTO3"
+          ],
+          "description": "The source syntax of this method."
+        },
+        "responseTypeUrl": {
+          "description": "The URL of the output message type.",
           "type": "string"
         },
         "options": {
-          "description": "The protocol buffer options.",
+          "description": "Any metadata attached to the method.",
           "type": "array",
           "items": {
             "$ref": "Option"
           }
         },
-        "oneofIndex": {
-          "description": "The index of the field type in `Type.oneofs`, for message or enumeration\ntypes. The first type has index 1; zero means the type is not in the list.",
-          "type": "integer",
-          "format": "int32"
-        },
-        "cardinality": {
-          "description": "The field cardinality.",
-          "enum": [
-            "CARDINALITY_UNKNOWN",
-            "CARDINALITY_OPTIONAL",
-            "CARDINALITY_REQUIRED",
-            "CARDINALITY_REPEATED"
-          ],
-          "enumDescriptions": [
-            "For fields with unknown cardinality.",
-            "For optional fields.",
-            "For required fields. Proto2 syntax only.",
-            "For repeated fields."
-          ],
+        "responseStreaming": {
+          "description": "If true, the response is streamed.",
+          "type": "boolean"
+        }
+      },
+      "id": "Method",
+      "description": "Method represents a method of an api."
+    },
+    "ListServiceRolloutsResponse": {
+      "type": "object",
+      "properties": {
+        "nextPageToken": {
+          "description": "The token of the next page of results.",
           "type": "string"
         },
+        "rollouts": {
+          "description": "The list of rollout resources.",
+          "type": "array",
+          "items": {
+            "$ref": "Rollout"
+          }
+        }
+      },
+      "id": "ListServiceRolloutsResponse",
+      "description": "Response message for ListServiceRollouts method."
+    },
+    "ConfigRef": {
+      "id": "ConfigRef",
+      "description": "Represents a service configuration with its name and id.",
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "Resource name of a service config. It must have the following\nformat: \"services/{service name}/configs/{config id}\".",
+          "type": "string"
+        }
+      }
+    },
+    "Mixin": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "description": "The fully qualified name of the API which is included.",
+          "type": "string"
+        },
+        "root": {
+          "description": "If non-empty specifies a path under which inherited HTTP paths\nare rooted.",
+          "type": "string"
+        }
+      },
+      "id": "Mixin",
+      "description": "Declares an API to be included in this API. The including API must\nredeclare all the methods from the included API, but documentation\nand options are inherited as follows:\n\n- If after comment and whitespace stripping, the documentation\n  string of the redeclared method is empty, it will be inherited\n  from the original method.\n\n- Each annotation belonging to the service config (http,\n  visibility) which is not set in the redeclared method will be\n  inherited.\n\n- If an http annotation is inherited, the path pattern will be\n  modified as follows. Any version prefix will be replaced by the\n  version of the including API plus the root path if specified.\n\nExample of a simple mixin:\n\n    package google.acl.v1;\n    service AccessControl {\n      // Get the underlying ACL object.\n      rpc GetAcl(GetAclRequest) returns (Acl) {\n        option (google.api.http).get = \"/v1/{resource=**}:getAcl\";\n      }\n    }\n\n    package google.storage.v2;\n    service Storage {\n      //       rpc GetAcl(GetAclRequest) returns (Acl);\n\n      // Get a data record.\n      rpc GetData(GetDataRequest) returns (Data) {\n        option (google.api.http).get = \"/v2/{resource=**}\";\n      }\n    }\n\nExample of a mixin configuration:\n\n    apis:\n    - name: google.storage.v2.Storage\n      mixins:\n      - name: google.acl.v1.AccessControl\n\nThe mixin construct implies that all methods in `AccessControl` are\nalso declared with same name and request/response types in\n`Storage`. A documentation generator or annotation processor will\nsee the effective `Storage.GetAcl` method after inherting\ndocumentation and annotations as follows:\n\n    service Storage {\n      // Get the underlying ACL object.\n      rpc GetAcl(GetAclRequest) returns (Acl) {\n        option (google.api.http).get = \"/v2/{resource=**}:getAcl\";\n      }\n      ...\n    }\n\nNote how the version in the path pattern changed from `v1` to `v2`.\n\nIf the `root` field in the mixin is specified, it should be a\nrelative path under which inherited HTTP paths are placed. Example:\n\n    apis:\n    - name: google.storage.v2.Storage\n      mixins:\n      - name: google.acl.v1.AccessControl\n        root: acls\n\nThis implies the following inherited HTTP annotation:\n\n    service Storage {\n      // Get the underlying ACL object.\n      rpc GetAcl(GetAclRequest) returns (Acl) {\n        option (google.api.http).get = \"/v2/acls/{resource=**}:getAcl\";\n      }\n      ...\n    }"
+    },
+    "CustomError": {
+      "description": "Customize service error responses.  For example, list any service\nspecific protobuf types that can appear in error detail lists of\nerror responses.\n\nExample:\n\n    custom_error:\n      types:\n      - google.foo.v1.CustomError\n      - google.foo.v1.AnotherError",
+      "type": "object",
+      "properties": {
+        "rules": {
+          "description": "The list of custom error rules that apply to individual API messages.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
+          "type": "array",
+          "items": {
+            "$ref": "CustomErrorRule"
+          }
+        },
+        "types": {
+          "description": "The list of custom error detail types, e.g. 'google.foo.v1.CustomError'.",
+          "type": "array",
+          "items": {
+            "type": "string"
+          }
+        }
+      },
+      "id": "CustomError"
+    },
+    "CounterOptions": {
+      "description": "Options for counters",
+      "type": "object",
+      "properties": {
+        "metric": {
+          "description": "The metric to update.",
+          "type": "string"
+        },
+        "field": {
+          "type": "string",
+          "description": "The field value to attribute."
+        }
+      },
+      "id": "CounterOptions"
+    },
+    "Http": {
+      "id": "Http",
+      "description": "Defines the HTTP configuration for a service. It contains a list of\nHttpRule, each specifying the mapping of an RPC method\nto one or more HTTP REST API methods.",
+      "type": "object",
+      "properties": {
+        "rules": {
+          "description": "A list of HTTP configuration rules that apply to individual API methods.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
+          "type": "array",
+          "items": {
+            "$ref": "HttpRule"
+          }
+        }
+      }
+    },
+    "Control": {
+      "description": "Selects and configures the service controller used by the service.  The\nservice controller handles features like abuse, quota, billing, logging,\nmonitoring, etc.",
+      "type": "object",
+      "properties": {
+        "environment": {
+          "description": "The service control environment to use. If empty, no control plane\nfeature (like quota and billing) will be enabled.",
+          "type": "string"
+        }
+      },
+      "id": "Control"
+    },
+    "SystemParameter": {
+      "type": "object",
+      "properties": {
+        "name": {
+          "type": "string",
+          "description": "Define the name of the parameter, such as \"api_key\" . It is case sensitive."
+        },
+        "urlQueryParameter": {
+          "description": "Define the URL query parameter name to use for the parameter. It is case\nsensitive.",
+          "type": "string"
+        },
+        "httpHeader": {
+          "description": "Define the HTTP header name to use for the parameter. It is case\ninsensitive.",
+          "type": "string"
+        }
+      },
+      "id": "SystemParameter",
+      "description": "Define a parameter's name and location. The parameter may be passed as either\nan HTTP header or a URL query parameter, and if both are passed the behavior\nis implementation-dependent."
+    },
+    "Field": {
+      "properties": {
         "typeUrl": {
           "description": "The field type URL, without the scheme, for message or enumeration\ntypes. Example: `\"type.googleapis.com/google.protobuf.Timestamp\"`.",
           "type": "string"
         },
-        "name": {
-          "description": "The field name.",
-          "type": "string"
-        },
-        "packed": {
-          "description": "Whether to use alternative packed wire representation.",
-          "type": "boolean"
-        },
         "number": {
           "description": "The field number.",
-          "type": "integer",
-          "format": "int32"
+          "format": "int32",
+          "type": "integer"
+        },
+        "jsonName": {
+          "type": "string",
+          "description": "The field JSON name."
         },
         "kind": {
           "description": "The field type.",
-          "enum": [
-            "TYPE_UNKNOWN",
-            "TYPE_DOUBLE",
-            "TYPE_FLOAT",
-            "TYPE_INT64",
-            "TYPE_UINT64",
-            "TYPE_INT32",
-            "TYPE_FIXED64",
-            "TYPE_FIXED32",
-            "TYPE_BOOL",
-            "TYPE_STRING",
-            "TYPE_GROUP",
-            "TYPE_MESSAGE",
-            "TYPE_BYTES",
-            "TYPE_UINT32",
-            "TYPE_ENUM",
-            "TYPE_SFIXED32",
-            "TYPE_SFIXED64",
-            "TYPE_SINT32",
-            "TYPE_SINT64"
-          ],
+          "type": "string",
           "enumDescriptions": [
             "Field type unknown.",
             "Field type double.",
@@ -2388,144 +2652,123 @@
             "Field type sint32.",
             "Field type sint64."
           ],
+          "enum": [
+            "TYPE_UNKNOWN",
+            "TYPE_DOUBLE",
+            "TYPE_FLOAT",
+            "TYPE_INT64",
+            "TYPE_UINT64",
+            "TYPE_INT32",
+            "TYPE_FIXED64",
+            "TYPE_FIXED32",
+            "TYPE_BOOL",
+            "TYPE_STRING",
+            "TYPE_GROUP",
+            "TYPE_MESSAGE",
+            "TYPE_BYTES",
+            "TYPE_UINT32",
+            "TYPE_ENUM",
+            "TYPE_SFIXED32",
+            "TYPE_SFIXED64",
+            "TYPE_SINT32",
+            "TYPE_SINT64"
+          ]
+        },
+        "options": {
+          "description": "The protocol buffer options.",
+          "type": "array",
+          "items": {
+            "$ref": "Option"
+          }
+        },
+        "oneofIndex": {
+          "type": "integer",
+          "description": "The index of the field type in `Type.oneofs`, for message or enumeration\ntypes. The first type has index 1; zero means the type is not in the list.",
+          "format": "int32"
+        },
+        "cardinality": {
+          "enumDescriptions": [
+            "For fields with unknown cardinality.",
+            "For optional fields.",
+            "For required fields. Proto2 syntax only.",
+            "For repeated fields."
+          ],
+          "enum": [
+            "CARDINALITY_UNKNOWN",
+            "CARDINALITY_OPTIONAL",
+            "CARDINALITY_REQUIRED",
+            "CARDINALITY_REPEATED"
+          ],
+          "description": "The field cardinality.",
+          "type": "string"
+        },
+        "packed": {
+          "description": "Whether to use alternative packed wire representation.",
+          "type": "boolean"
+        },
+        "defaultValue": {
+          "description": "The string value of the default value of this field. Proto2 syntax only.",
+          "type": "string"
+        },
+        "name": {
+          "description": "The field name.",
           "type": "string"
         }
       },
-      "id": "Field"
+      "id": "Field",
+      "description": "A single field of a message type.",
+      "type": "object"
     },
-    "Binding": {
-      "description": "Associates `members` with a `role`.",
+    "Monitoring": {
+      "description": "Monitoring configuration of the service.\n\nThe example below shows how to configure monitored resources and metrics\nfor monitoring. In the example, a monitored resource and two metrics are\ndefined. The `library.googleapis.com/book/returned_count` metric is sent\nto both producer and consumer projects, whereas the\n`library.googleapis.com/book/overdue_count` metric is only sent to the\nconsumer project.\n\n    monitored_resources:\n    - type: library.googleapis.com/branch\n      labels:\n      - key: /city\n        description: The city where the library branch is located in.\n      - key: /name\n        description: The name of the branch.\n    metrics:\n    - name: library.googleapis.com/book/returned_count\n      metric_kind: DELTA\n      value_type: INT64\n      labels:\n      - key: /customer_id\n    - name: library.googleapis.com/book/overdue_count\n      metric_kind: GAUGE\n      value_type: INT64\n      labels:\n      - key: /customer_id\n    monitoring:\n      producer_destinations:\n      - monitored_resource: library.googleapis.com/branch\n        metrics:\n        - library.googleapis.com/book/returned_count\n      consumer_destinations:\n      - monitored_resource: library.googleapis.com/branch\n        metrics:\n        - library.googleapis.com/book/returned_count\n        - library.googleapis.com/book/overdue_count",
       "type": "object",
       "properties": {
-        "members": {
-          "description": "Specifies the identities requesting access for a Cloud Platform resource.\n`members` can have the following values:\n\n* `allUsers`: A special identifier that represents anyone who is\n   on the internet; with or without a Google account.\n\n* `allAuthenticatedUsers`: A special identifier that represents anyone\n   who is authenticated with a Google account or a service account.\n\n* `user:{emailid}`: An email address that represents a specific Google\n   account. For example, `alice@gmail.com` or `joe@example.com`.\n\n\n* `serviceAccount:{emailid}`: An email address that represents a service\n   account. For example, `my-other-app@appspot.gserviceaccount.com`.\n\n* `group:{emailid}`: An email address that represents a Google group.\n   For example, `admins@example.com`.\n\n* `domain:{domain}`: A Google Apps domain name that represents all the\n   users of that domain. For example, `google.com` or `example.com`.\n\n",
+        "consumerDestinations": {
+          "description": "Monitoring configurations for sending metrics to the consumer project.\nThere can be multiple consumer destinations, each one must have a\ndifferent monitored resource type. A metric can be used in at most\none consumer destination.",
+          "type": "array",
+          "items": {
+            "$ref": "MonitoringDestination"
+          }
+        },
+        "producerDestinations": {
+          "description": "Monitoring configurations for sending metrics to the producer project.\nThere can be multiple producer destinations, each one must have a\ndifferent monitored resource type. A metric can be used in at most\none producer destination.",
+          "type": "array",
+          "items": {
+            "$ref": "MonitoringDestination"
+          }
+        }
+      },
+      "id": "Monitoring"
+    },
+    "TestIamPermissionsRequest": {
+      "properties": {
+        "permissions": {
+          "description": "The set of permissions to check for the `resource`. Permissions with\nwildcards (such as '*' or 'storage.*') are not allowed. For more\ninformation see\n[IAM Overview](https://cloud.google.com/iam/docs/overview#permissions).",
           "type": "array",
           "items": {
             "type": "string"
           }
-        },
-        "role": {
-          "description": "Role that is assigned to `members`.\nFor example, `roles/viewer`, `roles/editor`, or `roles/owner`.\nRequired",
-          "type": "string"
         }
       },
-      "id": "Binding"
+      "id": "TestIamPermissionsRequest",
+      "description": "Request message for `TestIamPermissions` method.",
+      "type": "object"
     },
-    "ConfigRef": {
-      "description": "Represents a service configuration with its name and id.",
+    "Enum": {
+      "description": "Enum type definition.",
       "type": "object",
       "properties": {
         "name": {
-          "description": "Resource name of a service config. It must have the following\nformat: \"services/{service name}/configs/{config id}\".",
-          "type": "string"
-        }
-      },
-      "id": "ConfigRef"
-    },
-    "DataAccessOptions": {
-      "description": "Write a Data Access (Gin) log",
-      "type": "object",
-      "properties": {},
-      "id": "DataAccessOptions"
-    },
-    "AuthProvider": {
-      "description": "Configuration for an anthentication provider, including support for\n[JSON Web Token (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32).",
-      "type": "object",
-      "properties": {
-        "audiences": {
-          "description": "The list of JWT\n[audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3).\nthat are allowed to access. A JWT containing any of these audiences will\nbe accepted. When this setting is absent, only JWTs with audience\n\"https://Service_name/API_name\"\nwill be accepted. For example, if no audiences are in the setting,\nLibraryService API will only accept JWTs with the following audience\n\"https://library-example.googleapis.com/google.example.library.v1.LibraryService\".\n\nExample:\n\n    audiences: bookstore_android.apps.googleusercontent.com,\n               bookstore_web.apps.googleusercontent.com",
+          "description": "Enum type name.",
           "type": "string"
         },
-        "jwksUri": {
-          "description": "URL of the provider's public key set to validate signature of the JWT. See\n[OpenID Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata).\nOptional if the key set document:\n - can be retrieved from\n   [OpenID Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html\n   of the issuer.\n - can be inferred from the email domain of the issuer (e.g. a Google service account).\n\nExample: https://www.googleapis.com/oauth2/v1/certs",
-          "type": "string"
-        },
-        "id": {
-          "description": "The unique identifier of the auth provider. It will be referred to by\n`AuthRequirement.provider_id`.\n\nExample: \"bookstore_auth\".",
-          "type": "string"
-        },
-        "issuer": {
-          "description": "Identifies the principal that issued the JWT. See\nhttps://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.1\nUsually a URL or an email address.\n\nExample: https://securetoken.google.com\nExample: 1234567-compute@developer.gserviceaccount.com",
-          "type": "string"
-        }
-      },
-      "id": "AuthProvider"
-    },
-    "VisibilityRule": {
-      "description": "A visibility rule provides visibility configuration for an individual API\nelement.",
-      "type": "object",
-      "properties": {
-        "restriction": {
-          "description": "A comma-separated list of visibility labels that apply to the `selector`.\nAny of the listed labels can be used to grant the visibility.\n\nIf a rule has multiple labels, removing one of the labels but not all of\nthem can break clients.\n\nExample:\n\n    visibility:\n      rules:\n      - selector: google.calendar.Calendar.EnhancedSearch\n        restriction: GOOGLE_INTERNAL, TRUSTED_TESTER\n\nRemoving GOOGLE_INTERNAL from this restriction will break clients that\nrely on this method and only had access to it through GOOGLE_INTERNAL.",
-          "type": "string"
-        },
-        "selector": {
-          "description": "Selects methods, messages, fields, enums, etc. to which this rule applies.\n\nRefer to selector for syntax details.",
-          "type": "string"
-        }
-      },
-      "id": "VisibilityRule"
-    },
-    "AuditLogConfig": {
-      "description": "Provides the configuration for logging a type of permissions.\nExample:\n\n    {\n      \"audit_log_configs\": [\n        {\n          \"log_type\": \"DATA_READ\",\n          \"exempted_members\": [\n            \"user:foo@gmail.com\"\n          ]\n        },\n        {\n          \"log_type\": \"DATA_WRITE\",\n        }\n      ]\n    }\n\nThis enables 'DATA_READ' and 'DATA_WRITE' logging, while exempting\nfoo@gmail.com from DATA_READ logging.",
-      "type": "object",
-      "properties": {
-        "logType": {
-          "description": "The log type that this config enables.",
-          "enum": [
-            "LOG_TYPE_UNSPECIFIED",
-            "ADMIN_READ",
-            "DATA_WRITE",
-            "DATA_READ"
-          ],
-          "enumDescriptions": [
-            "Default case. Should never be this.",
-            "Admin reads. Example: CloudIAM getIamPolicy",
-            "Data writes. Example: CloudSQL Users create",
-            "Data reads. Example: CloudSQL Users list"
-          ],
-          "type": "string"
-        },
-        "exemptedMembers": {
-          "description": "Specifies the identities that do not cause logging for this type of\npermission.\nFollows the same format of Binding.members.",
+        "enumvalue": {
+          "description": "Enum value definitions.",
           "type": "array",
           "items": {
-            "type": "string"
+            "$ref": "EnumValue"
           }
-        }
-      },
-      "id": "AuditLogConfig"
-    },
-    "UndeleteServiceResponse": {
-      "description": "Response message for UndeleteService method.",
-      "type": "object",
-      "properties": {
-        "service": {
-          "description": "Revived service resource.",
-          "$ref": "ManagedService"
-        }
-      },
-      "id": "UndeleteServiceResponse"
-    },
-    "UsageRule": {
-      "description": "Usage configuration rules for the service.\n\nNOTE: Under development.\n\n\nUse this rule to configure unregistered calls for the service. Unregistered\ncalls are calls that do not contain consumer project identity.\n(Example: calls that do not contain an API key).\nBy default, API methods do not allow unregistered calls, and each method call\nmust be identified by a consumer project identity. Use this rule to\nallow/disallow unregistered calls.\n\nExample of an API that wants to allow unregistered calls for entire service.\n\n    usage:\n      rules:\n      - selector: \"*\"\n        allow_unregistered_calls: true\n\nExample of a method that wants to allow unregistered calls.\n\n    usage:\n      rules:\n      - selector: \"google.example.library.v1.LibraryService.CreateBook\"\n        allow_unregistered_calls: true",
-      "type": "object",
-      "properties": {
-        "allowUnregisteredCalls": {
-          "description": "True, if the method allows unregistered calls; false otherwise.",
-          "type": "boolean"
         },
-        "selector": {
-          "description": "Selects the methods to which this rule applies. Use '*' to indicate all\nmethods in all APIs.\n\nRefer to selector for syntax details.",
-          "type": "string"
-        }
-      },
-      "id": "UsageRule"
-    },
-    "EnumValue": {
-      "description": "Enum value definition.",
-      "type": "object",
-      "properties": {
         "options": {
           "description": "Protocol buffer options.",
           "type": "array",
@@ -2533,371 +2776,128 @@
             "$ref": "Option"
           }
         },
-        "name": {
-          "description": "Enum value name.",
-          "type": "string"
+        "sourceContext": {
+          "description": "The source context.",
+          "$ref": "SourceContext"
         },
-        "number": {
-          "description": "Enum value number.",
-          "type": "integer",
-          "format": "int32"
-        }
-      },
-      "id": "EnumValue"
-    },
-    "MediaUpload": {
-      "description": "Do not use this. For media support, add instead\n[][google.bytestream.RestByteStream] as an API to your\nconfiguration.",
-      "type": "object",
-      "properties": {
-        "enabled": {
-          "description": "Whether upload is enabled.",
-          "type": "boolean"
-        }
-      },
-      "id": "MediaUpload"
-    },
-    "BackendRule": {
-      "description": "A backend rule provides configuration for an individual API element.",
-      "type": "object",
-      "properties": {
-        "address": {
-          "description": "The address of the API backend.",
-          "type": "string"
-        },
-        "deadline": {
-          "description": "The number of seconds to wait for a response from a request.  The\ndefault depends on the deployment context.",
-          "type": "number",
-          "format": "double"
-        },
-        "selector": {
-          "description": "Selects the methods to which this rule applies.\n\nRefer to selector for syntax details.",
-          "type": "string"
-        }
-      },
-      "id": "BackendRule"
-    },
-    "ContextRule": {
-      "description": "A context rule provides information about the context for an individual API\nelement.",
-      "type": "object",
-      "properties": {
-        "provided": {
-          "description": "A list of full type names of provided contexts.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "selector": {
-          "description": "Selects the methods to which this rule applies.\n\nRefer to selector for syntax details.",
-          "type": "string"
-        },
-        "requested": {
-          "description": "A list of full type names of requested contexts.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        }
-      },
-      "id": "ContextRule"
-    },
-    "Http": {
-      "description": "Defines the HTTP configuration for a service. It contains a list of\nHttpRule, each specifying the mapping of an RPC method\nto one or more HTTP REST API methods.",
-      "type": "object",
-      "properties": {
-        "rules": {
-          "description": "A list of HTTP configuration rules that apply to individual API methods.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
-          "type": "array",
-          "items": {
-            "$ref": "HttpRule"
-          }
-        }
-      },
-      "id": "Http"
-    },
-    "Visibility": {
-      "description": "`Visibility` defines restrictions for the visibility of service\nelements.  Restrictions are specified using visibility labels\n(e.g., TRUSTED_TESTER) that are elsewhere linked to users and projects.\n\nUsers and projects can have access to more than one visibility label. The\neffective visibility for multiple labels is the union of each label's\nelements, plus any unrestricted elements.\n\nIf an element and its parents have no restrictions, visibility is\nunconditionally granted.\n\nExample:\n\n    visibility:\n      rules:\n      - selector: google.calendar.Calendar.EnhancedSearch\n        restriction: TRUSTED_TESTER\n      - selector: google.calendar.Calendar.Delegate\n        restriction: GOOGLE_INTERNAL\n\nHere, all methods are publicly visible except for the restricted methods\nEnhancedSearch and Delegate.",
-      "type": "object",
-      "properties": {
-        "rules": {
-          "description": "A list of visibility rules that apply to individual API elements.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
-          "type": "array",
-          "items": {
-            "$ref": "VisibilityRule"
-          }
-        }
-      },
-      "id": "Visibility"
-    },
-    "ConfigChange": {
-      "description": "Output generated from semantically comparing two versions of a service\nconfiguration.\n\nIncludes detailed information about a field that have changed with\napplicable advice about potential consequences for the change, such as\nbackwards-incompatibility.",
-      "type": "object",
-      "properties": {
-        "newValue": {
-          "description": "Value of the changed object in the new Service configuration,\nin JSON format. This field will not be populated if ChangeType == REMOVED.",
-          "type": "string"
-        },
-        "oldValue": {
-          "description": "Value of the changed object in the old Service configuration,\nin JSON format. This field will not be populated if ChangeType == ADDED.",
-          "type": "string"
-        },
-        "element": {
-          "description": "Object hierarchy path to the change, with levels separated by a '.'\ncharacter. For repeated fields, an applicable unique identifier field is\nused for the index (usually selector, name, or id). For maps, the term\n'key' is used. If the field has no unique identifier, the numeric index\nis used.\nExamples:\n- visibility.rules[selector==\"google.LibraryService.CreateBook\"].restriction\n- quota.metric_rules[selector==\"google\"].metric_costs[key==\"reads\"].value\n- logging.producer_destinations[0]",
-          "type": "string"
-        },
-        "changeType": {
-          "description": "The type for this change, either ADDED, REMOVED, or MODIFIED.",
-          "enum": [
-            "CHANGE_TYPE_UNSPECIFIED",
-            "ADDED",
-            "REMOVED",
-            "MODIFIED"
-          ],
+        "syntax": {
+          "type": "string",
           "enumDescriptions": [
-            "No value was provided.",
-            "The changed object exists in the 'new' service configuration, but not\nin the 'old' service configuration.",
-            "The changed object exists in the 'old' service configuration, but not\nin the 'new' service configuration.",
-            "The changed object exists in both service configurations, but its value\nis different."
+            "Syntax `proto2`.",
+            "Syntax `proto3`."
           ],
-          "type": "string"
-        },
-        "advices": {
-          "description": "Collection of advice provided for this change, useful for determining the\npossible impact of this change.",
-          "type": "array",
-          "items": {
-            "$ref": "Advice"
-          }
+          "enum": [
+            "SYNTAX_PROTO2",
+            "SYNTAX_PROTO3"
+          ],
+          "description": "The source syntax."
         }
       },
-      "id": "ConfigChange"
+      "id": "Enum"
     },
-    "SystemParameters": {
-      "description": "### System parameter configuration\n\nA system parameter is a special kind of parameter defined by the API\nsystem, not by an individual API. It is typically mapped to an HTTP header\nand/or a URL query parameter. This configuration specifies which methods\nchange the names of the system parameters.",
+    "EnableServiceRequest": {
+      "description": "Request message for EnableService method.",
       "type": "object",
       "properties": {
-        "rules": {
-          "description": "Define system parameters.\n\nThe parameters defined here will override the default parameters\nimplemented by the system. If this field is missing from the service\nconfig, default system parameters will be used. Default system parameters\nand names is implementation-dependent.\n\nExample: define api key for all methods\n\n    system_parameters\n      rules:\n        - selector: \"*\"\n          parameters:\n            - name: api_key\n              url_query_parameter: api_key\n\n\nExample: define 2 api key names for a specific method.\n\n    system_parameters\n      rules:\n        - selector: \"/ListShelves\"\n          parameters:\n            - name: api_key\n              http_header: Api-Key1\n            - name: api_key\n              http_header: Api-Key2\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
-          "type": "array",
-          "items": {
-            "$ref": "SystemParameterRule"
-          }
+        "consumerId": {
+          "type": "string",
+          "description": "The identity of consumer resource which service enablement will be\napplied to.\n\nThe Google Service Management implementation accepts the following\nforms:\n- \"project:\u003cproject_id\u003e\"\n\nNote: this is made compatible with\ngoogle.api.servicecontrol.v1.Operation.consumer_id."
         }
       },
-      "id": "SystemParameters"
+      "id": "EnableServiceRequest"
+    },
+    "Diagnostic": {
+      "type": "object",
+      "properties": {
+        "message": {
+          "description": "Message describing the error or warning.",
+          "type": "string"
+        },
+        "location": {
+          "description": "File name and line number of the error or warning.",
+          "type": "string"
+        },
+        "kind": {
+          "enum": [
+            "WARNING",
+            "ERROR"
+          ],
+          "description": "The kind of diagnostic information provided.",
+          "type": "string",
+          "enumDescriptions": [
+            "Warnings and errors",
+            "Only errors"
+          ]
+        }
+      },
+      "id": "Diagnostic",
+      "description": "Represents a diagnostic message (error or warning)"
     },
     "LabelDescriptor": {
+      "id": "LabelDescriptor",
       "description": "A description of a label.",
       "type": "object",
       "properties": {
+        "key": {
+          "description": "The label key.",
+          "type": "string"
+        },
         "description": {
           "description": "A human-readable description for the label.",
           "type": "string"
         },
         "valueType": {
-          "description": "The type of data that can be assigned to the label.",
-          "enum": [
-            "STRING",
-            "BOOL",
-            "INT64"
-          ],
           "enumDescriptions": [
             "A variable-length string. This is the default.",
             "Boolean; true or false.",
             "A 64-bit signed integer."
           ],
-          "type": "string"
-        },
-        "key": {
-          "description": "The label key.",
+          "enum": [
+            "STRING",
+            "BOOL",
+            "INT64"
+          ],
+          "description": "The type of data that can be assigned to the label.",
           "type": "string"
         }
-      },
-      "id": "LabelDescriptor"
-    },
-    "Usage": {
-      "description": "Configuration controlling usage of a service.",
-      "type": "object",
-      "properties": {
-        "producerNotificationChannel": {
-          "description": "The full resource name of a channel used for sending notifications to the\nservice producer.\n\nGoogle Service Management currently only supports\n[Google Cloud Pub/Sub](https://cloud.google.com/pubsub) as a notification\nchannel. To use Google Cloud Pub/Sub as the channel, this must be the name\nof a Cloud Pub/Sub topic that uses the Cloud Pub/Sub topic name format\ndocumented in https://cloud.google.com/pubsub/docs/overview.",
-          "type": "string"
-        },
-        "requirements": {
-          "description": "Requirements that must be satisfied before a consumer project can use the\nservice. Each requirement is of the form \u003cservice.name\u003e/\u003crequirement-id\u003e;\nfor example 'serviceusage.googleapis.com/billing-enabled'.",
-          "type": "array",
-          "items": {
-            "type": "string"
-          }
-        },
-        "rules": {
-          "description": "A list of usage rules that apply to individual API methods.\n\n**NOTE:** All service configuration rules follow \"last one wins\" order.",
-          "type": "array",
-          "items": {
-            "$ref": "UsageRule"
-          }
-        }
-      },
-      "id": "Usage"
-    },
-    "Advice": {
-      "description": "Generated advice about this change, used for providing more\ninformation about how a change will affect the existing service.",
-      "type": "object",
-      "properties": {
-        "description": {
-          "description": "Useful description for why this advice was applied and what actions should\nbe taken to mitigate any implied risks.",
-          "type": "string"
-        }
-      },
-      "id": "Advice"
-    },
-    "CloudAuditOptions": {
-      "description": "Write a Cloud Audit log",
-      "type": "object",
-      "properties": {},
-      "id": "CloudAuditOptions"
-    },
-    "AuthRequirement": {
-      "description": "User-defined authentication requirements, including support for\n[JSON Web Token (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32).",
-      "type": "object",
-      "properties": {
-        "audiences": {
-          "description": "NOTE: This will be deprecated soon, once AuthProvider.audiences is\nimplemented and accepted in all the runtime components.\n\nThe list of JWT\n[audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3).\nthat are allowed to access. A JWT containing any of these audiences will\nbe accepted. When this setting is absent, only JWTs with audience\n\"https://Service_name/API_name\"\nwill be accepted. For example, if no audiences are in the setting,\nLibraryService API will only accept JWTs with the following audience\n\"https://library-example.googleapis.com/google.example.library.v1.LibraryService\".\n\nExample:\n\n    audiences: bookstore_android.apps.googleusercontent.com,\n               bookstore_web.apps.googleusercontent.com",
-          "type": "string"
-        },
-        "providerId": {
-          "description": "id from authentication provider.\n\nExample:\n\n    provider_id: bookstore_auth",
-          "type": "string"
-        }
-      },
-      "id": "AuthRequirement"
-    },
-    "Control": {
-      "description": "Selects and configures the service controller used by the service.  The\nservice controller handles features like abuse, quota, billing, logging,\nmonitoring, etc.",
-      "type": "object",
-      "properties": {
-        "environment": {
-          "description": "The service control environment to use. If empty, no control plane\nfeature (like quota and billing) will be enabled.",
-          "type": "string"
-        }
-      },
-      "id": "Control"
-    },
-    "SourceContext": {
-      "description": "`SourceContext` represents information about the source of a\nprotobuf element, like the file in which it is defined.",
-      "type": "object",
-      "properties": {
-        "fileName": {
-          "description": "The path-qualified name of the .proto file that contained the associated\nprotobuf element.  For example: `\"google/protobuf/source_context.proto\"`.",
-          "type": "string"
-        }
-      },
-      "id": "SourceContext"
+      }
     }
   },
-  "revision": "20170117",
-  "basePath": "",
+  "protocol": "rest",
   "icons": {
     "x32": "http://www.google.com/images/icons/product/search-32.gif",
     "x16": "http://www.google.com/images/icons/product/search-16.gif"
   },
-  "canonicalName": "Service Management",
-  "discoveryVersion": "v1",
+  "version": "v1",
   "baseUrl": "https://servicemanagement.googleapis.com/",
-  "name": "servicemanagement",
-  "parameters": {
-    "access_token": {
-      "description": "OAuth access token.",
-      "type": "string",
-      "location": "query"
-    },
-    "prettyPrint": {
-      "description": "Returns response with indentations and line breaks.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "key": {
-      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
-      "type": "string",
-      "location": "query"
-    },
-    "quotaUser": {
-      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
-      "type": "string",
-      "location": "query"
-    },
-    "pp": {
-      "description": "Pretty-print response.",
-      "default": "true",
-      "type": "boolean",
-      "location": "query"
-    },
-    "fields": {
-      "description": "Selector specifying which fields to include in a partial response.",
-      "type": "string",
-      "location": "query"
-    },
-    "alt": {
-      "description": "Data format for response.",
-      "location": "query",
-      "enum": [
-        "json",
-        "media",
-        "proto"
-      ],
-      "default": "json",
-      "enumDescriptions": [
-        "Responses with Content-Type of application/json",
-        "Media download with context-dependent Content-Type",
-        "Responses with Content-Type of application/x-protobuf"
-      ],
-      "type": "string"
-    },
-    "$.xgafv": {
-      "description": "V1 error format.",
-      "enum": [
-        "1",
-        "2"
-      ],
-      "enumDescriptions": [
-        "v1 error format",
-        "v2 error format"
-      ],
-      "type": "string",
-      "location": "query"
-    },
-    "callback": {
-      "description": "JSONP",
-      "type": "string",
-      "location": "query"
-    },
-    "oauth_token": {
-      "description": "OAuth 2.0 token for the current user.",
-      "type": "string",
-      "location": "query"
-    },
-    "uploadType": {
-      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
-      "type": "string",
-      "location": "query"
-    },
-    "bearer_token": {
-      "description": "OAuth bearer token.",
-      "type": "string",
-      "location": "query"
-    },
-    "upload_protocol": {
-      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
-      "type": "string",
-      "location": "query"
+  "canonicalName": "Service Management",
+  "auth": {
+    "oauth2": {
+      "scopes": {
+        "https://www.googleapis.com/auth/service.management": {
+          "description": "Manage your Google API service configuration"
+        },
+        "https://www.googleapis.com/auth/cloud-platform.read-only": {
+          "description": "View your data across Google Cloud Platform services"
+        },
+        "https://www.googleapis.com/auth/service.management.readonly": {
+          "description": "View your Google API service configuration"
+        },
+        "https://www.googleapis.com/auth/cloud-platform": {
+          "description": "View and manage your data across Google Cloud Platform services"
+        }
+      }
     }
   },
-  "documentationLink": "https://cloud.google.com/service-management/",
-  "ownerDomain": "google.com",
-  "batchPath": "batch",
+  "kind": "discovery#restDescription",
+  "description": "Google Service Management allows service producers to publish their services on Google Cloud Platform so that they can be discovered and used by service consumers.",
   "servicePath": "",
-  "ownerName": "Google",
-  "version": "v1",
   "rootUrl": "https://servicemanagement.googleapis.com/",
-  "kind": "discovery#restDescription"
+  "basePath": "",
+  "ownerDomain": "google.com",
+  "name": "servicemanagement",
+  "batchPath": "batch",
+  "documentationLink": "https://cloud.google.com/service-management/",
+  "id": "servicemanagement:v1",
+  "revision": "20170209"
 }
diff --git a/servicemanagement/v1/servicemanagement-gen.go b/servicemanagement/v1/servicemanagement-gen.go
index 43a248e..99228e9 100644
--- a/servicemanagement/v1/servicemanagement-gen.go
+++ b/servicemanagement/v1/servicemanagement-gen.go
@@ -71,9 +71,10 @@
 }
 
 type APIService struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Operations *OperationsService
 
@@ -87,6 +88,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *APIService) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewOperationsService(s *APIService) *OperationsService {
 	rs := &OperationsService{s: s}
 	return rs
@@ -4344,11 +4349,12 @@
 	//
 	// Possible values:
 	//   "STATUS_UNSPECIFIED" - Unspecifed code.
-	//   "DONE" - The step has completed without errors.
-	//   "NOT_STARTED" - The step has not started yet.
-	//   "IN_PROGRESS" - The step is in progress.
-	//   "FAILED" - The step has completed with errors.
-	//   "CANCELLED" - The step has completed with cancellation.
+	//   "DONE" - The operation or step has completed without errors.
+	//   "NOT_STARTED" - The operation or step has not started yet.
+	//   "IN_PROGRESS" - The operation or step is in progress.
+	//   "FAILED" - The operation or step has completed with errors.
+	//   "CANCELLED" - The operation or step has completed with
+	// cancellation.
 	Status string `json:"status,omitempty"`
 
 	// ForceSendFields is a list of field names (e.g. "Description") to
@@ -5101,6 +5107,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5234,6 +5241,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.managedservice)
 	if err != nil {
@@ -5363,6 +5371,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/services/{serviceName}")
@@ -5493,6 +5502,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.disableservicerequest)
 	if err != nil {
@@ -5634,6 +5644,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.enableservicerequest)
 	if err != nil {
@@ -5784,6 +5795,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.generateconfigreportrequest)
 	if err != nil {
@@ -5918,6 +5930,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6067,6 +6080,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6207,6 +6221,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.getiampolicyrequest)
 	if err != nil {
@@ -6396,6 +6411,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6561,6 +6577,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.setiampolicyrequest)
 	if err != nil {
@@ -6701,6 +6718,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.testiampermissionsrequest)
 	if err != nil {
@@ -6843,6 +6861,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/services/{serviceName}:undelete")
@@ -6975,6 +6994,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.service)
 	if err != nil {
@@ -7121,6 +7141,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7286,6 +7307,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7462,6 +7484,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.submitconfigsourcerequest)
 	if err != nil {
@@ -7611,6 +7634,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.rollout)
 	if err != nil {
@@ -7757,6 +7781,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7922,6 +7947,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/sheets/v4/sheets-gen.go b/sheets/v4/sheets-gen.go
index d346f1f..ec6495f 100644
--- a/sheets/v4/sheets-gen.go
+++ b/sheets/v4/sheets-gen.go
@@ -70,9 +70,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Spreadsheets *SpreadsheetsService
 }
@@ -84,6 +85,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewSpreadsheetsService(s *Service) *SpreadsheetsService {
 	rs := &SpreadsheetsService{s: s}
 	rs.Sheets = NewSpreadsheetsSheetsService(s)
@@ -6434,6 +6439,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.batchupdatespreadsheetrequest)
 	if err != nil {
@@ -6568,6 +6574,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.spreadsheet)
 	if err != nil {
@@ -6739,6 +6746,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6886,6 +6894,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.copysheettoanotherspreadsheetrequest)
 	if err != nil {
@@ -7116,6 +7125,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.valuerange)
 	if err != nil {
@@ -7308,6 +7318,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.batchclearvaluesrequest)
 	if err != nil {
@@ -7510,6 +7521,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7680,6 +7692,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.batchupdatevaluesrequest)
 	if err != nil {
@@ -7821,6 +7834,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.clearvaluesrequest)
 	if err != nil {
@@ -8025,6 +8039,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8256,6 +8271,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.valuerange)
 	if err != nil {
diff --git a/siteverification/v1/siteverification-gen.go b/siteverification/v1/siteverification-gen.go
index 0b3867e..902d7e3 100644
--- a/siteverification/v1/siteverification-gen.go
+++ b/siteverification/v1/siteverification-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	WebResource *WebResourceService
 }
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewWebResourceService(s *Service) *WebResourceService {
 	rs := &WebResourceService{s: s}
 	return rs
@@ -347,6 +352,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "webResource/{id}")
@@ -453,6 +459,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -581,6 +588,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.siteverificationwebresourcegettokenrequest)
 	if err != nil {
@@ -702,6 +710,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.siteverificationwebresourceresource)
 	if err != nil {
@@ -841,6 +850,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -957,6 +967,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.siteverificationwebresourceresource)
 	if err != nil {
@@ -1091,6 +1102,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.siteverificationwebresourceresource)
 	if err != nil {
diff --git a/slides/v1/slides-gen.go b/slides/v1/slides-gen.go
index c85b1c2..a358542 100644
--- a/slides/v1/slides-gen.go
+++ b/slides/v1/slides-gen.go
@@ -76,9 +76,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Presentations *PresentationsService
 }
@@ -90,6 +91,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewPresentationsService(s *Service) *PresentationsService {
 	rs := &PresentationsService{s: s}
 	rs.Pages = NewPresentationsPagesService(s)
@@ -6130,6 +6135,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.batchupdatepresentationrequest)
 	if err != nil {
@@ -6269,6 +6275,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.presentation)
 	if err != nil {
@@ -6401,6 +6408,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6546,6 +6554,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/spectrum/v1explorer/spectrum-gen.go b/spectrum/v1explorer/spectrum-gen.go
index 2d7f1f0..d17b1f3 100644
--- a/spectrum/v1explorer/spectrum-gen.go
+++ b/spectrum/v1explorer/spectrum-gen.go
@@ -55,9 +55,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Paws *PawsService
 }
@@ -69,6 +70,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewPawsService(s *Service) *PawsService {
 	rs := &PawsService{s: s}
 	return rs
@@ -1999,6 +2004,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pawsgetspectrumrequest)
 	if err != nil {
@@ -2114,6 +2120,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pawsgetspectrumbatchrequest)
 	if err != nil {
@@ -2229,6 +2236,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pawsinitrequest)
 	if err != nil {
@@ -2347,6 +2355,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pawsnotifyspectrumuserequest)
 	if err != nil {
@@ -2463,6 +2472,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pawsregisterrequest)
 	if err != nil {
@@ -2580,6 +2590,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pawsverifydevicerequest)
 	if err != nil {
diff --git a/speech/v1beta1/speech-gen.go b/speech/v1beta1/speech-gen.go
index 0b452fe..acd005f 100644
--- a/speech/v1beta1/speech-gen.go
+++ b/speech/v1beta1/speech-gen.go
@@ -62,9 +62,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Operations *OperationsService
 
@@ -78,6 +79,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewOperationsService(s *Service) *OperationsService {
 	rs := &OperationsService{s: s}
 	return rs
@@ -798,6 +803,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.canceloperationrequest)
 	if err != nil {
@@ -937,6 +943,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1beta1/operations/{+name}")
@@ -1077,6 +1084,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1249,6 +1257,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1415,6 +1424,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.asyncrecognizerequest)
 	if err != nil {
@@ -1537,6 +1547,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.syncrecognizerequest)
 	if err != nil {
diff --git a/sqladmin/v1beta3/sqladmin-gen.go b/sqladmin/v1beta3/sqladmin-gen.go
index 4c704db..b1634b5 100644
--- a/sqladmin/v1beta3/sqladmin-gen.go
+++ b/sqladmin/v1beta3/sqladmin-gen.go
@@ -69,9 +69,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	BackupRuns *BackupRunsService
 
@@ -93,6 +94,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewBackupRunsService(s *Service) *BackupRunsService {
 	rs := &BackupRunsService{s: s}
 	return rs
@@ -1996,6 +2001,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2175,6 +2181,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2359,6 +2366,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2474,6 +2482,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesclonerequest)
 	if err != nil {
@@ -2608,6 +2617,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}")
@@ -2745,6 +2755,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesexportrequest)
 	if err != nil {
@@ -2897,6 +2908,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3037,6 +3049,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesimportrequest)
 	if err != nil {
@@ -3178,6 +3191,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.databaseinstance)
 	if err != nil {
@@ -3337,6 +3351,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3501,6 +3516,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.databaseinstance)
 	if err != nil {
@@ -3644,6 +3660,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/promoteReplica")
@@ -3779,6 +3796,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/resetSslConfig")
@@ -3913,6 +3931,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/restart")
@@ -4049,6 +4068,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/restoreBackup")
@@ -4200,6 +4220,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesetrootpasswordrequest)
 	if err != nil {
@@ -4344,6 +4365,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.databaseinstance)
 	if err != nil {
@@ -4501,6 +4523,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4673,6 +4696,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4844,6 +4868,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}")
@@ -5000,6 +5025,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5148,6 +5174,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.sslcertsinsertrequest)
 	if err != nil {
@@ -5302,6 +5329,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5449,6 +5477,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/sqladmin/v1beta4/sqladmin-gen.go b/sqladmin/v1beta4/sqladmin-gen.go
index a494401..cfe0823 100644
--- a/sqladmin/v1beta4/sqladmin-gen.go
+++ b/sqladmin/v1beta4/sqladmin-gen.go
@@ -71,9 +71,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	BackupRuns *BackupRunsService
 
@@ -99,6 +100,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewBackupRunsService(s *Service) *BackupRunsService {
 	rs := &BackupRunsService{s: s}
 	return rs
@@ -2419,6 +2424,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/backupRuns/{id}")
@@ -2575,6 +2581,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2724,6 +2731,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backuprun)
 	if err != nil {
@@ -2894,6 +2902,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3065,6 +3074,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/databases/{database}")
@@ -3221,6 +3231,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3369,6 +3380,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.database)
 	if err != nil {
@@ -3522,6 +3534,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3664,6 +3677,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.database2)
 	if err != nil {
@@ -3819,6 +3833,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.database2)
 	if err != nil {
@@ -3977,6 +3992,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4095,6 +4111,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesclonerequest)
 	if err != nil {
@@ -4237,6 +4254,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}")
@@ -4374,6 +4392,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesexportrequest)
 	if err != nil {
@@ -4517,6 +4536,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesfailoverrequest)
 	if err != nil {
@@ -4671,6 +4691,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4811,6 +4832,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesimportrequest)
 	if err != nil {
@@ -4952,6 +4974,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.databaseinstance)
 	if err != nil {
@@ -5111,6 +5134,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5277,6 +5301,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.databaseinstance)
 	if err != nil {
@@ -5420,6 +5445,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/promoteReplica")
@@ -5558,6 +5584,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/resetSslConfig")
@@ -5692,6 +5719,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/restart")
@@ -5828,6 +5856,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancesrestorebackuprequest)
 	if err != nil {
@@ -5970,6 +5999,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/startReplica")
@@ -6104,6 +6134,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/stopReplica")
@@ -6240,6 +6271,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancestruncatelogrequest)
 	if err != nil {
@@ -6386,6 +6418,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.databaseinstance)
 	if err != nil {
@@ -6541,6 +6574,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6705,6 +6739,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6878,6 +6913,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.sslcertscreateephemeralrequest)
 	if err != nil {
@@ -7023,6 +7059,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}")
@@ -7180,6 +7217,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7329,6 +7367,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.sslcertsinsertrequest)
 	if err != nil {
@@ -7482,6 +7521,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7629,6 +7669,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7760,6 +7801,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "projects/{project}/instances/{instance}/users")
@@ -7910,6 +7952,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
 	if err != nil {
@@ -8063,6 +8106,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8204,6 +8248,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.user)
 	if err != nil {
diff --git a/storage/v1beta1/storage-gen.go b/storage/v1beta1/storage-gen.go
index d5467f9..7950865 100644
--- a/storage/v1beta1/storage-gen.go
+++ b/storage/v1beta1/storage-gen.go
@@ -70,9 +70,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	BucketAccessControls *BucketAccessControlsService
 
@@ -90,6 +91,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewBucketAccessControlsService(s *Service) *BucketAccessControlsService {
 	rs := &BucketAccessControlsService{s: s}
 	return rs
@@ -765,6 +770,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/acl/{entity}")
@@ -882,6 +888,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1018,6 +1025,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bucketaccesscontrol)
 	if err != nil {
@@ -1160,6 +1168,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1291,6 +1300,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bucketaccesscontrol)
 	if err != nil {
@@ -1434,6 +1444,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bucketaccesscontrol)
 	if err != nil {
@@ -1573,6 +1584,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}")
@@ -1691,6 +1703,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1845,6 +1858,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bucket)
 	if err != nil {
@@ -2014,6 +2028,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2199,6 +2214,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bucket2)
 	if err != nil {
@@ -2357,6 +2373,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bucket2)
 	if err != nil {
@@ -2507,6 +2524,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}/acl/{entity}")
@@ -2634,6 +2652,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2780,6 +2799,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.objectaccesscontrol)
 	if err != nil {
@@ -2932,6 +2952,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3073,6 +3094,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.objectaccesscontrol)
 	if err != nil {
@@ -3226,6 +3248,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.objectaccesscontrol)
 	if err != nil {
@@ -3375,6 +3398,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}")
@@ -3503,6 +3527,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3744,6 +3769,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.object)
 	if err != nil {
@@ -4015,6 +4041,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4216,6 +4243,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.object2)
 	if err != nil {
@@ -4384,6 +4412,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.object2)
 	if err != nil {
diff --git a/storage/v1beta2/storage-gen.go b/storage/v1beta2/storage-gen.go
index a4a574b..b7be395 100644
--- a/storage/v1beta2/storage-gen.go
+++ b/storage/v1beta2/storage-gen.go
@@ -72,9 +72,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	BucketAccessControls *BucketAccessControlsService
 
@@ -96,6 +97,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewBucketAccessControlsService(s *Service) *BucketAccessControlsService {
 	rs := &BucketAccessControlsService{s: s}
 	return rs
@@ -1223,6 +1228,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/acl/{entity}")
@@ -1340,6 +1346,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1476,6 +1483,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bucketaccesscontrol)
 	if err != nil {
@@ -1618,6 +1626,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1749,6 +1758,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bucketaccesscontrol)
 	if err != nil {
@@ -1892,6 +1902,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bucketaccesscontrol)
 	if err != nil {
@@ -2049,6 +2060,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}")
@@ -2197,6 +2209,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2364,6 +2377,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bucket)
 	if err != nil {
@@ -2542,6 +2556,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2744,6 +2759,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bucket2)
 	if err != nil {
@@ -2932,6 +2948,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.bucket2)
 	if err != nil {
@@ -3089,6 +3106,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -3184,6 +3202,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/defaultObjectAcl/{entity}")
@@ -3301,6 +3320,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3438,6 +3458,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.objectaccesscontrol)
 	if err != nil {
@@ -3597,6 +3618,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3740,6 +3762,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.objectaccesscontrol)
 	if err != nil {
@@ -3883,6 +3906,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.objectaccesscontrol)
 	if err != nil {
@@ -4035,6 +4059,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}/acl/{entity}")
@@ -4176,6 +4201,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4336,6 +4362,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.objectaccesscontrol)
 	if err != nil {
@@ -4502,6 +4529,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4657,6 +4685,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.objectaccesscontrol)
 	if err != nil {
@@ -4824,6 +4853,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.objectaccesscontrol)
 	if err != nil {
@@ -4998,6 +5028,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.composerequest)
 	if err != nil {
@@ -5266,6 +5297,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.object)
 	if err != nil {
@@ -5551,6 +5583,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "b/{bucket}/o/{object}")
@@ -5750,6 +5783,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6057,6 +6091,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.object)
 	if err != nil {
@@ -6359,6 +6394,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6606,6 +6642,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.object2)
 	if err != nil {
@@ -6845,6 +6882,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.object2)
 	if err != nil {
@@ -7099,6 +7137,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
diff --git a/storagetransfer/v1/storagetransfer-gen.go b/storagetransfer/v1/storagetransfer-gen.go
index f0731b6..836fbf7 100644
--- a/storagetransfer/v1/storagetransfer-gen.go
+++ b/storagetransfer/v1/storagetransfer-gen.go
@@ -64,9 +64,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	GoogleServiceAccounts *GoogleServiceAccountsService
 
@@ -84,6 +85,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewGoogleServiceAccountsService(s *Service) *GoogleServiceAccountsService {
 	rs := &GoogleServiceAccountsService{s: s}
 	return rs
@@ -1236,6 +1241,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1362,6 +1368,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.transferjob)
 	if err != nil {
@@ -1497,6 +1504,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1666,6 +1674,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1821,6 +1830,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.updatetransferjobrequest)
 	if err != nil {
@@ -1955,6 +1965,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+name}:cancel")
@@ -2080,6 +2091,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/{+name}")
@@ -2217,6 +2229,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2380,6 +2393,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2546,6 +2560,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.pausetransferoperationrequest)
 	if err != nil {
@@ -2680,6 +2695,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.resumetransferoperationrequest)
 	if err != nil {
@@ -2836,6 +2852,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/surveys/v2/surveys-gen.go b/surveys/v2/surveys-gen.go
index 0a51abc..1cf92b4 100644
--- a/surveys/v2/surveys-gen.go
+++ b/surveys/v2/surveys-gen.go
@@ -67,9 +67,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Mobileapppanels *MobileapppanelsService
 
@@ -85,6 +86,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewMobileapppanelsService(s *Service) *MobileapppanelsService {
 	rs := &MobileapppanelsService{s: s}
 	return rs
@@ -988,6 +993,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1143,6 +1149,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1276,6 +1283,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.mobileapppanel)
 	if err != nil {
@@ -1423,6 +1431,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1571,6 +1580,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "surveys/{surveyUrlId}")
@@ -1706,6 +1716,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1834,6 +1845,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.survey)
 	if err != nil {
@@ -1979,6 +1991,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2111,6 +2124,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.surveysstartrequest)
 	if err != nil {
@@ -2242,6 +2256,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "surveys/{resourceId}/stop")
@@ -2368,6 +2383,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.survey)
 	if err != nil {
diff --git a/tagmanager/v1/tagmanager-gen.go b/tagmanager/v1/tagmanager-gen.go
index 2eb5960..cd36ee9 100644
--- a/tagmanager/v1/tagmanager-gen.go
+++ b/tagmanager/v1/tagmanager-gen.go
@@ -81,9 +81,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Accounts *AccountsService
 }
@@ -95,6 +96,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewAccountsService(s *Service) *AccountsService {
 	rs := &AccountsService{s: s}
 	rs.Containers = NewAccountsContainersService(s)
@@ -1893,6 +1898,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2030,6 +2036,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2154,6 +2161,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.account)
 	if err != nil {
@@ -2292,6 +2300,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.container)
 	if err != nil {
@@ -2425,6 +2434,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/containers/{containerId}")
@@ -2541,6 +2551,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2687,6 +2698,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2826,6 +2838,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.container)
 	if err != nil {
@@ -2974,6 +2987,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.environment)
 	if err != nil {
@@ -3117,6 +3131,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/containers/{containerId}/environments/{environmentId}")
@@ -3243,6 +3258,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3399,6 +3415,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3549,6 +3566,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.environment)
 	if err != nil {
@@ -3715,6 +3733,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.environment)
 	if err != nil {
@@ -3871,6 +3890,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.folder)
 	if err != nil {
@@ -4014,6 +4034,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/containers/{containerId}/folders/{folderId}")
@@ -4140,6 +4161,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4296,6 +4318,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4444,6 +4467,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.folder)
 	if err != nil {
@@ -4611,6 +4635,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4781,6 +4806,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.folder)
 	if err != nil {
@@ -4924,6 +4950,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.environment)
 	if err != nil {
@@ -5075,6 +5102,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.tag)
 	if err != nil {
@@ -5218,6 +5246,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/containers/{containerId}/tags/{tagId}")
@@ -5344,6 +5373,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5500,6 +5530,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5648,6 +5679,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.tag)
 	if err != nil {
@@ -5804,6 +5836,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.trigger)
 	if err != nil {
@@ -5947,6 +5980,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/containers/{containerId}/triggers/{triggerId}")
@@ -6073,6 +6107,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6229,6 +6264,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6378,6 +6414,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.trigger)
 	if err != nil {
@@ -6534,6 +6571,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.variable)
 	if err != nil {
@@ -6677,6 +6715,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/containers/{containerId}/variables/{variableId}")
@@ -6803,6 +6842,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6959,6 +6999,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7108,6 +7149,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.variable)
 	if err != nil {
@@ -7264,6 +7306,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.createcontainerversionrequestversionoptions)
 	if err != nil {
@@ -7407,6 +7450,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}")
@@ -7533,6 +7577,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7704,6 +7749,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -7864,6 +7910,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}/publish")
@@ -8015,6 +8062,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}/restore")
@@ -8158,6 +8206,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}/undelete")
@@ -8311,6 +8360,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.containerversion)
 	if err != nil {
@@ -8465,6 +8515,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.useraccess)
 	if err != nil {
@@ -8599,6 +8650,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "accounts/{accountId}/permissions/{permissionId}")
@@ -8715,6 +8767,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8861,6 +8914,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -8991,6 +9045,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.useraccess)
 	if err != nil {
diff --git a/taskqueue/v1beta1/taskqueue-gen.go b/taskqueue/v1beta1/taskqueue-gen.go
index ee42a03..403465a 100644
--- a/taskqueue/v1beta1/taskqueue-gen.go
+++ b/taskqueue/v1beta1/taskqueue-gen.go
@@ -65,9 +65,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Taskqueues *TaskqueuesService
 
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewTaskqueuesService(s *Service) *TaskqueuesService {
 	rs := &TaskqueuesService{s: s}
 	return rs
@@ -410,6 +415,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -554,6 +560,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/taskqueues/{taskqueue}/tasks/{task}")
@@ -681,6 +688,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -828,6 +836,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/taskqueues/{taskqueue}/tasks/lease")
@@ -989,6 +998,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/taskqueue/v1beta2/taskqueue-gen.go b/taskqueue/v1beta2/taskqueue-gen.go
index bae1862..699388f 100644
--- a/taskqueue/v1beta2/taskqueue-gen.go
+++ b/taskqueue/v1beta2/taskqueue-gen.go
@@ -65,9 +65,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Taskqueues *TaskqueuesService
 
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewTaskqueuesService(s *Service) *TaskqueuesService {
 	rs := &TaskqueuesService{s: s}
 	return rs
@@ -417,6 +422,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -561,6 +567,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/taskqueues/{taskqueue}/tasks/{task}")
@@ -688,6 +695,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -835,6 +843,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.task)
 	if err != nil {
@@ -995,6 +1004,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/taskqueues/{taskqueue}/tasks/lease")
@@ -1166,6 +1176,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1309,6 +1320,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.task2)
 	if err != nil {
@@ -1470,6 +1482,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.task2)
 	if err != nil {
diff --git a/tasks/v1/tasks-gen.go b/tasks/v1/tasks-gen.go
index d48f0d8..2c5179f 100644
--- a/tasks/v1/tasks-gen.go
+++ b/tasks/v1/tasks-gen.go
@@ -65,9 +65,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Tasklists *TasklistsService
 
@@ -81,6 +82,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewTasklistsService(s *Service) *TasklistsService {
 	rs := &TasklistsService{s: s}
 	return rs
@@ -398,6 +403,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "users/@me/lists/{tasklist}")
@@ -504,6 +510,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -632,6 +639,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.tasklist)
 	if err != nil {
@@ -772,6 +780,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -922,6 +931,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.tasklist)
 	if err != nil {
@@ -1055,6 +1065,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.tasklist)
 	if err != nil {
@@ -1188,6 +1199,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "lists/{tasklist}/clear")
@@ -1285,6 +1297,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "lists/{tasklist}/tasks/{task}")
@@ -1401,6 +1414,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1553,6 +1567,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.task)
 	if err != nil {
@@ -1783,6 +1798,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2002,6 +2018,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "lists/{tasklist}/tasks/{task}/move")
@@ -2148,6 +2165,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.task)
 	if err != nil {
@@ -2291,6 +2309,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.task)
 	if err != nil {
diff --git a/toolresults/v1beta3/toolresults-gen.go b/toolresults/v1beta3/toolresults-gen.go
index 7b4f0e6..e051452 100644
--- a/toolresults/v1beta3/toolresults-gen.go
+++ b/toolresults/v1beta3/toolresults-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Projects *ProjectsService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewProjectsService(s *Service) *ProjectsService {
 	rs := &ProjectsService{s: s}
 	rs.Histories = NewProjectsHistoriesService(s)
@@ -2540,6 +2545,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2692,6 +2698,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectId}:initializeSettings")
@@ -2835,6 +2842,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.history)
 	if err != nil {
@@ -2990,6 +2998,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3170,6 +3179,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3355,6 +3365,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.execution)
 	if err != nil {
@@ -3520,6 +3531,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3702,6 +3714,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -3892,6 +3905,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.execution)
 	if err != nil {
@@ -4069,6 +4083,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.step)
 	if err != nil {
@@ -4244,6 +4259,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4414,6 +4430,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4605,6 +4622,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -4807,6 +4825,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.step)
 	if err != nil {
@@ -4983,6 +5002,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.publishxunitxmlfilesrequest)
 	if err != nil {
@@ -5150,6 +5170,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.perfmetricssummary)
 	if err != nil {
@@ -5317,6 +5338,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.perfsampleseries)
 	if err != nil {
@@ -5494,6 +5516,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5689,6 +5712,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -5876,6 +5900,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.batchcreateperfsamplesrequest)
 	if err != nil {
@@ -6083,6 +6108,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -6313,6 +6339,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/translate/v2/translate-gen.go b/translate/v2/translate-gen.go
index a3705f9..86e2587 100644
--- a/translate/v2/translate-gen.go
+++ b/translate/v2/translate-gen.go
@@ -57,9 +57,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Detections *DetectionsService
 
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewDetectionsService(s *Service) *DetectionsService {
 	rs := &DetectionsService{s: s}
 	return rs
@@ -370,6 +375,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -509,6 +515,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -662,6 +669,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/urlshortener/v1/urlshortener-gen.go b/urlshortener/v1/urlshortener-gen.go
index a885113..13ce6c6 100644
--- a/urlshortener/v1/urlshortener-gen.go
+++ b/urlshortener/v1/urlshortener-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Url *UrlService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewUrlService(s *Service) *UrlService {
 	rs := &UrlService{s: s}
 	return rs
@@ -371,6 +376,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -509,6 +515,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.url)
 	if err != nil {
@@ -653,6 +660,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/vision/v1/vision-gen.go b/vision/v1/vision-gen.go
index 593f2aa..e1fa066 100644
--- a/vision/v1/vision-gen.go
+++ b/vision/v1/vision-gen.go
@@ -61,9 +61,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Images *ImagesService
 }
@@ -75,6 +76,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewImagesService(s *Service) *ImagesService {
 	rs := &ImagesService{s: s}
 	return rs
@@ -1669,6 +1674,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.batchannotateimagesrequest)
 	if err != nil {
diff --git a/webfonts/v1/webfonts-gen.go b/webfonts/v1/webfonts-gen.go
index 8da3833..97aa215 100644
--- a/webfonts/v1/webfonts-gen.go
+++ b/webfonts/v1/webfonts-gen.go
@@ -55,9 +55,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Webfonts *WebfontsService
 }
@@ -69,6 +70,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewWebfontsService(s *Service) *WebfontsService {
 	rs := &WebfontsService{s: s}
 	return rs
@@ -234,6 +239,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/webmasters/v3/webmasters-gen.go b/webmasters/v3/webmasters-gen.go
index e5f5e6e..364d982 100644
--- a/webmasters/v3/webmasters-gen.go
+++ b/webmasters/v3/webmasters-gen.go
@@ -68,9 +68,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Searchanalytics *SearchanalyticsService
 
@@ -90,6 +91,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewSearchanalyticsService(s *Service) *SearchanalyticsService {
 	rs := &SearchanalyticsService{s: s}
 	return rs
@@ -841,6 +846,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.searchanalyticsqueryrequest)
 	if err != nil {
@@ -975,6 +981,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "sites/{siteUrl}/sitemaps/{feedpath}")
@@ -1091,6 +1098,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1247,6 +1255,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1381,6 +1390,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "sites/{siteUrl}/sitemaps/{feedpath}")
@@ -1484,6 +1494,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "sites/{siteUrl}")
@@ -1580,6 +1591,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "sites/{siteUrl}")
@@ -1686,6 +1698,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1822,6 +1835,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1986,6 +2000,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2177,6 +2192,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2372,6 +2388,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -2551,6 +2568,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "sites/{siteUrl}/urlCrawlErrorsSamples/{url}")
diff --git a/youtube/v3/youtube-gen.go b/youtube/v3/youtube-gen.go
index 947b801..b75cb5a 100644
--- a/youtube/v3/youtube-gen.go
+++ b/youtube/v3/youtube-gen.go
@@ -102,9 +102,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Activities *ActivitiesService
 
@@ -166,6 +167,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewActivitiesService(s *Service) *ActivitiesService {
 	rs := &ActivitiesService{s: s}
 	return rs
@@ -9604,6 +9609,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.activity)
 	if err != nil {
@@ -9822,6 +9828,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10039,6 +10046,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "captions")
@@ -10209,6 +10217,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10453,6 +10462,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.caption)
 	if err != nil {
@@ -10713,6 +10723,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -10954,6 +10965,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.caption)
 	if err != nil {
@@ -11247,6 +11259,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channelbannerresource)
 	if err != nil {
@@ -11457,6 +11470,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "channelSections")
@@ -11601,6 +11615,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channelsection)
 	if err != nil {
@@ -11808,6 +11823,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -11978,6 +11994,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channelsection)
 	if err != nil {
@@ -12221,6 +12238,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -12441,6 +12459,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.channel)
 	if err != nil {
@@ -12578,6 +12597,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.commentthread)
 	if err != nil {
@@ -12840,6 +12860,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13068,6 +13089,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.commentthread)
 	if err != nil {
@@ -13195,6 +13217,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "comments")
@@ -13289,6 +13312,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.comment)
 	if err != nil {
@@ -13484,6 +13508,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -13666,6 +13691,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "comments/markAsSpam")
@@ -13772,6 +13798,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "comments/setModerationStatus")
@@ -13888,6 +13915,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.comment)
 	if err != nil {
@@ -14059,6 +14087,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14260,6 +14289,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14420,6 +14450,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14570,6 +14601,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -14758,6 +14790,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "liveBroadcasts/bind")
@@ -14983,6 +15016,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "liveBroadcasts/control")
@@ -15181,6 +15215,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "liveBroadcasts")
@@ -15329,6 +15364,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.livebroadcast)
 	if err != nil {
@@ -15586,6 +15622,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -15850,6 +15887,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "liveBroadcasts/transition")
@@ -16052,6 +16090,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.livebroadcast)
 	if err != nil {
@@ -16190,6 +16229,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "liveChat/bans")
@@ -16284,6 +16324,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.livechatban)
 	if err != nil {
@@ -16412,6 +16453,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "liveChat/messages")
@@ -16506,6 +16548,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.livechatmessage)
 	if err != nil {
@@ -16687,6 +16730,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -16866,6 +16910,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "liveChat/moderators")
@@ -16960,6 +17005,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.livechatmoderator)
 	if err != nil {
@@ -17117,6 +17163,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17327,6 +17374,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "liveStreams")
@@ -17477,6 +17525,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.livestream)
 	if err != nil {
@@ -17706,6 +17755,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -17933,6 +17983,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.livestream)
 	if err != nil {
@@ -18089,6 +18140,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "playlistItems")
@@ -18207,6 +18259,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.playlistitem)
 	if err != nil {
@@ -18415,6 +18468,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -18617,6 +18671,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.playlistitem)
 	if err != nil {
@@ -18769,6 +18824,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "playlists")
@@ -18913,6 +18969,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.playlist)
 	if err != nil {
@@ -19160,6 +19217,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -19371,6 +19429,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.playlist)
 	if err != nil {
@@ -19919,6 +19978,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20384,6 +20444,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -20557,6 +20618,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "subscriptions")
@@ -20652,6 +20714,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.subscription)
 	if err != nil {
@@ -20917,6 +20980,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21206,6 +21270,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "thumbnails/set")
@@ -21419,6 +21484,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21586,6 +21652,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -21746,6 +21813,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "videos")
@@ -21874,6 +21942,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22132,6 +22201,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.video)
 	if err != nil {
@@ -22500,6 +22570,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -22733,6 +22804,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "videos/rate")
@@ -22862,6 +22934,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.videoabusereport)
 	if err != nil {
@@ -22980,6 +23053,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.video)
 	if err != nil {
@@ -23187,6 +23261,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.invideobranding)
 	if err != nil {
@@ -23379,6 +23454,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "watermarks/unset")
diff --git a/youtubeanalytics/v1/youtubeanalytics-gen.go b/youtubeanalytics/v1/youtubeanalytics-gen.go
index b67a736..bbe9f9c 100644
--- a/youtubeanalytics/v1/youtubeanalytics-gen.go
+++ b/youtubeanalytics/v1/youtubeanalytics-gen.go
@@ -76,9 +76,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	GroupItems *GroupItemsService
 
@@ -94,6 +95,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewGroupItemsService(s *Service) *GroupItemsService {
 	rs := &GroupItemsService{s: s}
 	return rs
@@ -514,6 +519,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "groupItems")
@@ -630,6 +636,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.groupitem)
 	if err != nil {
@@ -784,6 +791,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -932,6 +940,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "groups")
@@ -1048,6 +1057,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
 	if err != nil {
@@ -1229,6 +1239,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1406,6 +1417,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
 	if err != nil {
@@ -1604,6 +1616,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/youtubeanalytics/v1beta1/youtubeanalytics-gen.go b/youtubeanalytics/v1beta1/youtubeanalytics-gen.go
index da23e6a..5fbc92e 100644
--- a/youtubeanalytics/v1beta1/youtubeanalytics-gen.go
+++ b/youtubeanalytics/v1beta1/youtubeanalytics-gen.go
@@ -76,9 +76,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	GroupItems *GroupItemsService
 
@@ -94,6 +95,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewGroupItemsService(s *Service) *GroupItemsService {
 	rs := &GroupItemsService{s: s}
 	return rs
@@ -514,6 +519,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "groupItems")
@@ -630,6 +636,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.groupitem)
 	if err != nil {
@@ -784,6 +791,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -932,6 +940,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "groups")
@@ -1048,6 +1057,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
 	if err != nil {
@@ -1229,6 +1239,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1406,6 +1417,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.group)
 	if err != nil {
@@ -1604,6 +1616,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
diff --git a/youtubereporting/v1/youtubereporting-gen.go b/youtubereporting/v1/youtubereporting-gen.go
index f865680..f70b7cb 100644
--- a/youtubereporting/v1/youtubereporting-gen.go
+++ b/youtubereporting/v1/youtubereporting-gen.go
@@ -67,9 +67,10 @@
 }
 
 type Service struct {
-	client    *http.Client
-	BasePath  string // API endpoint base URL
-	UserAgent string // optional additional User-Agent fragment
+	client                    *http.Client
+	BasePath                  string // API endpoint base URL
+	UserAgent                 string // optional additional User-Agent fragment
+	GoogleClientHeaderElement string // client header fragment, for Google use only
 
 	Jobs *JobsService
 
@@ -85,6 +86,10 @@
 	return googleapi.UserAgent + " " + s.UserAgent
 }
 
+func (s *Service) clientHeader() string {
+	return gensupport.GoogleClientHeader("20170210", s.GoogleClientHeaderElement)
+}
+
 func NewJobsService(s *Service) *JobsService {
 	rs := &JobsService{s: s}
 	rs.Reports = NewJobsReportsService(s)
@@ -506,6 +511,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	body, err := googleapi.WithoutDataWrapper.JSONReader(c.job)
 	if err != nil {
@@ -642,6 +648,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	var body io.Reader = nil
 	c.urlParams_.Set("alt", alt)
 	urls := googleapi.ResolveRelative(c.s.BasePath, "v1/jobs/{jobId}")
@@ -792,6 +799,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -973,6 +981,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1154,6 +1163,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1361,6 +1371,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1556,6 +1567,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}
@@ -1751,6 +1763,7 @@
 		reqHeaders[k] = v
 	}
 	reqHeaders.Set("User-Agent", c.s.userAgent())
+	reqHeaders.Set("x-goog-api-client", c.s.clientHeader())
 	if c.ifNoneMatch_ != "" {
 		reqHeaders.Set("If-None-Match", c.ifNoneMatch_)
 	}